资讯详情

《HyperLedger Fabric 2.3 联盟链搭建》 课程学习笔记

课程平台:51CTO 课程讲师:大头娃 课程介绍:从零开始讲解联盟链的构建和链码的操作。让大家真正掌握联盟链的构建、链码的部署和调用过程。

一、Hyperledger Fabric联盟链介绍

1.1使用场景

区块链的数据是公开的,但在一些行业,如银行和医疗保健。这些私人数据不能完全披露,也不能建立有选择地披露的权限机制。默认情况下,区块链中的所有节点都需要维护账簿,并审查与其他成员的交易进展,这是低效和昂贵的。Hyperledger不同的是,使用超级节点来完成会计功能。

1.2产生背景

公有链缺点: 1.数据完全公开 2.所有节点参与运算成本大 3.不支持私人机密交易 

根据上述缺点,Hyperledger的设计以产业应用为重点,解决现有缺点,扩展了行业先行原有的功能。 Hyperledger创新了包括管理参与者访问许可权在内的传统区块链模型.换句话说: Hyperledger是有权限的共享账簿.Hyperledger为身份识别、审计、隐私提供安全健康的模型.缩短运算周期.实现有效扩张.应对行业内的各种要求.

覆盖许多网络的世界 我们希望有许多区块链网络,每个网络账簿都可以执行不同的业务,基于此期望值,而出现了Hyperledger,现在单一的普通网络已经出现了. 但是网络和网络之间的通信还没有例子.会员在个人网络中是通用的,Hyperledger,除了实现这种网络独立运行外,. 还有寻址系统.可以通过账本交易.发现并使用另一个合法的交易和智能合同 

在这里插入图片描述

1.三是联盟链的优缺点

: (1)可控性强 与公共链相比,由于节点通常很大,一旦形成区块链,区块数据就不会被篡改。例如,比特币节点太多,几乎不可能篡改区块数据;只要联盟中大多数机构达成共识,区块数据就可以更改。 (2)半中心化 在某种程度上,联盟链只属于联盟内部的成员,因为节点数量有限,很容易达成共识。 (3)交易速度快 联盟链本质上是私有链,但由于节点数量有限,很容易达成共识,所以交易速度也很快。 (4)数据不会默认公开 与公共链不同,联盟链的数据仅限于联盟内部机构及其用户。 : (1)由于联盟链的半集中结构,很容易被恶意玩家攻击。多个参与者可能会合谋。 (2)缺乏行业统一标准,解决方案难免会出现各种障碍,但目前整个生态距离联盟链的统一框架还很远。 (3)对于大型综合性企业来说,由于其在应用场景中的灵活性较差。为了启动一个新的联盟,它必须得到所有成员的协议的批准。然而,大型企业有许多流程和复杂的约束条件,因此在许多大型企业之间建立这通用网络非常缓慢。

1.4联盟链的基本架构

Fabric系统由组织划分,每个组织都包含不同的功能Peer节点,每个Peer节点可以扮演各种角色。所有组织共享统一Orderer集群。

1.Endorser Peer(背书结点)︰每个链码在实例化时都会设置背书策略(Endorsement policy),指定哪些节点对交易背书有效。 2.Leader Peer (主节点)∶主节点负责和Orderer排序服务节点通信,从排序服务节点获取最新块,并在组织内同步。 3.Committer Peer(记账节点)︰负责验证从排序服务节点接收的块中的交易,然后提交块(写入)/追加)到其通道账簿的副本。 4.Anchor Peer(锚节点)︰在一个通道( channel )所有其他的都可以上去peer发现的peer5.Order Peer(排序节点)︰排序服务节点接收包含背书签名的交易,对未打包的交易进行排序生成区块,广播给Peer主节点。 

1.5 基本要求

(1)网络权限的需求 发行机构根据网络的目的确定适当的访问权限,该权限需要识别,然后才能在网络上进行交易。网络是开放的,很容易融入到移动应用程序中。它可以私有操作,只有通过权限验证才能熟悉它。并可根据需要设置不同级别的权限。 (2)隐私和机密的重要性 我们相信任何区块链架构有一个基本要求,那就是网络上任何一方的身份及行为模式,都不允许未经授权的人通过账本来打探情况。我们也希望能够保证区块链用户的业务逻辑和其它交易参数的机密性。做到除了合约涉及的利益相关方,没有其它人能够访问这些数据。

1.6 Hyperledger介绍专业名词

事实上,它是公共链中的智能合同。链码是一个在账簿上运行的软件。它可以编码资产,包括交易指令(或业务逻辑)或修改资产。 通道构建在Fabric互联网上的私人区块链。实现了数据的隔离和保密。通道中指定的账簿与通道中的所有平等节点共享,交易员必须通过通道的正确验证才能与账簿交互。通道是由一个"配置块"来定义的。 Genesis Block是初始化区块链网络channel的配置区块.也是区块链上的第一个区块 Fabric-ca它是一个默认的证书管理组件,基于向网络成员及其用户颁发PKl的证书。 使用客户端应用SDK来跟Fabric处理网络。首先,客户端来自客户端。CA获取合法身份证加入网络应用渠道。超级账簿Fabric已经有了多种语言SDK。这些SDK底层封装gRPC接口调用可以为包括Node.Js、Python、Java、Go等多种实现。 用于调用chainCode内的函数,ChainCode invoke是交易,Proposal,然后执行模块化流程(背书、共识、验证、提交)。invoke结构是函数和参数。 Ledger是一个channel的chain,和由channel中每个peer维护的数据库。

二、Go语言基础语法

老师说也可以参考菜鸟教程。

//定义了包名,此文件属于哪个包,每个o程序都包含一个名为main的包
package main
// go编译器当前程序需要引用那些包(系统包,第三方包,用户自定义)
import "fmt"
//main函数,go语言的入口必须在main包
func main(){ 
        
	/*Println:面数主要用于输出内容 2:go基于面数式编程 */
	fmt.Println( "Hello, world! ")
	fmt.Print("Hello,world!")
	fmt.Printf("%s d","Hello,world", 2018)
}

问题1:如果运行出错“go: cannot find GOROOT directory: c: \go ”,需要配置GOROOT根目录。配完之后需要重启。

go语言总结

package mainimport(
	"fmt"
	"reflect"
)
func main(){ 
        
	fmt.Println( "main().. ........")
	// go根据赋的值判断变量类型
	var e,f = 123,"hello"
	fmt.Println("e: ", e," f:",f)
	//隐式声明(一旦赋值成功,则变量类型将确定)
	x,y := fn01()
	fmt.Print1n("x: ", x," y:", y)
	fmt.Println(fn02())
	a, b := fn03(10,20)
	fmt.Println("a: ", a, "a type:", reflect.Typeof(a), " b:", b)
	fno4(1,2,3)
}

func fno1()(int, int) { 
        
	return 2,3
}

//定义号返回的变量(理解为函数局部变量)
func fn02()(sum int) { 
        
	//var sum int
	//已经声明不需要重复声明
	sum = 100
	return
}


//支持返回指针类型
func fno3(×, y int)(*int,int){ 
        
	sum :=x+y
	//返回变量地址,返回变量的值
	return &sum,sum
}

//可变参数
func fno4(nums ...int){ 
        
	total := 0
	//可变参数就是数组(返回元素的索引和索引对应的值)
	for _, num := range nums { 
        
		//fmt.Println("i: ",i)
		total += num
	}
	fmt.Println(total)
}


运行结果:

三、Shell快速入门

在菜鸟教程搜索:shell教程,跟着教程学一点基础

3.1 第一个shell 脚本

/bin目录存放可执行的文件, root和一般账号都可用
/boot这个目录存放开机使用的文件,例如: linux内核和系统启动文件.. ldev存放所有设备文件.包括硬盘、分区、鼠标、键盘、USB等
/etc存放系统所有配置文件,
/home:用户主目录的,当你创建一个用户时,默认的用户文件夹就在该目录下
/mnt*如果需要挂载某些设备,一般建议存放到此目录中
/root: root用户的目录
/usr:注意usr并不是user的缩写,而是Unix Software Resource的缩写,即"“Unix操作系统软件资源"放在该目录,而不是用户的数据

mkdir test
cd test
sudo vim demo01.sh
#首先在vim打开文件界面后,按一次字母“i” vim模式转为 INSERT,处于可编辑状态
#写入文件demo01.sh的内容如下两行:其中#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

#!/bin/bash
echo "Hello World !"
#写完之后,按“ESC”退出插入模式回到命令模式,然后按“:wq”保存退出

#给脚本文件添加执行权限
sudo chmod +x demo01.sh
#执行脚本文件
./demo01.sh 
#输出结果为:Hello World !

3.2 变量与参数传递

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

vi demo01.sh可以对脚本文件进行编辑,内容如下:

#!/bin/bash
echo "Hello World !"
url="http: // www.163.com"
echo ${ 
        url}
str="url is \n ${url}"
echo  $str
str='url is \n ${url}'
echo $str
echo 'shell传递参数案例'
echo "file name is $0"
echo"第二参数为:$1"
echo "总共传递 $# 个参数"

#执行结果说明,双引号内支持变量和转义符,而单引号不支持

3.3 数组、for循环

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。 与大部分编程语言类似,数组元素的下标由 0 开始。 Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式:array_name=(value1 value2 … valuen)

#!/bin/bash
arr=('A' 'Bug' 3.14 100)
#显示数组
echo "第1个元素为${arr[0]}"
echo "第2个元素为${arr[1]} ,长度为${#arr[1]}"
echo "数组成员为: ${arr[*]},数组的长度为${#arr[*]}"
for loop in ${ 
        arr[*]}
do
    echo "this value is ${loop}"
done

if [ $1 == $2 ]
then
  echo "a==b"
else
  echo "a!=b"
fi

3.4 函数文件包含

(1)函数

#!/bin/bash

funWithReturn(){ 
        
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    #注意,加法外面是两层小括号
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

(2)文件包含 和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

注:被包含的文件不需要拥有执行权限

#文件fn.sh,这个即为被包含文件,不用为其赋予执行权限
#!/bin/bash
funcDemo(){ 
        
  echo "参数1为:$1"
  echo "参数2为:$2"
  echo "请输入一个数值:"
  read num
  return $(($1 +$2 + ${ 
        num}))
}


#文件callfn.sh
!/bin/bash
#引入同目录的sh文件
source ./fn.sh
funcDemo 1 2
echo "result: $?"


#终端执行
gan@gan-virtual-machine:~/Gantest$ vi fn.sh
gan@gan-virtual-machine:~/Gantest$ vi callfn.sh
gan@gan-virtual-machine:~/Gantest$ chmod u+x callfn.sh 
gan@gan-virtual-machine:~/Gantest$ ./callfn.sh 
参数1为:1
参数2为:2
请输入一个数值:
3
result: 6

3.5 case

var='yes'
case $var in
"yes")
	echo 'your choose is yes'
	;;
"no")	
	echo'your choose is no'
	;;
*)
	echo 'your choose is error'
	;;
esac
#短路模式
[ -d $1 ] && rm -r $1
#动态获取当前参数数量
echo $#
#吧所有参数左移动1位
shift 1
echo $#

四、fabric安装

4.1 Ubuntu安装

VMWare版本:VMware® Workstation 16 Pro 16.2.3 build-19376536
Ubuntu版本:Ubuntu 22.04 LTS【好像是发行版,我就是想装最新的,哈哈哈。大头娃老师用的是20.04版本】

当然要先安装VMWare啦,然后新建虚拟机==》按照提示步骤,一步步安装就好啦~22.04版本的Ubuntu可好看了,而且VMtools都自己就装好了。 下载安装自行百度啦~

4.2 Ubuntu基础命令与配置

1、更换下载源

点击左下角九个点进入搜索界面->在搜索框输入“software”->点击出现的“Software & Updates”,进入更换下载源的界面->点击download对应的框->找到阿里云源(老师说这个比较稳定)->choose server->输入密码认证->close->reload。

等它加载完成后,可通过命令查看下载源是否更换成功:

cat /etc/apt/sources.list

2、Linux基本命令

创建文件 touch 文件名.文件后缀
删除文件 rm 文件名.文件后缀
创建目录 mkdir 目录名
删除目录 rmdir 目录名
删除带文件的目录 rm -r 目录名/
移动文件 mv 文件当前绝对路径  想要移动到的目录的绝对路径
		mv /home/hong/abc.txt  ../    #将abc.txt移动到上一级目录
移动文件并重命名 mv 当前文件名 目标文件名
root@ubuntu:/home# ls
abc.txt hong
root@ubuntu:/home# mv abc.txt aaa.txt
root@ubuntu:/home# ls
aaa.txt hong

#解压zip、tar压缩文件
root@ubuntu:/home/hong/Desktop# ls
fabric-2.1.1.zip fabric-2.3.0.tar.gz
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C .
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C ../
root@ubuntu: /home/ hong/Desktop# cd ..
root@ubuntu:/ home/hong# ls
Desktop Downloads fabric-2.3.0 Pictures  emplates Documents examples.desktop Music Public Videos
root@ubuntu :/home/hong#rm -r fabric-2.3.0/
root@ubuntu:/home/ hong# ls
Desktop Downloads Music Public Videos Documents examples.desktop Pictures Templates
root@ubuntu :/home/hong# cd Desktop/
root@ubuntu :/home/hong/Desktop# ls
fabric-2.1.1.zip fabric-2.3.0 fabric-2.3.0.tar.gz

root@ubuntu: /home/hong/Desktop# unzip fabric-2.1.1.zip -d .
#这种-d方式会覆盖原来有的文件,如果这个目录下有重名文件,解压出来直接覆盖
root@ubuntu: / home/ hong/Desktop# ls
fabric-2.1.1 fabric-2.1.1.zip fabric-2.3.0 fabric-2.3.0.tar.gz

4.3 Docker介绍与安装

1、docker简单介绍

Fabric不是直接在Linux上的,是基于Docker容器的搭建的。 docker仓库:在这个仓库中有很多组件、环境,我们要用的fabric的组件就在上面。 菜鸟教程上有简单介绍:Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者以及到一个中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 我们可以在鲸鱼内部对沙箱进行任意的测试、调试,而不会影响海洋其他内容。当调试完成之后,我们可以将鲸鱼沙箱整体拷贝移植,移植到不同操作系统,无需重新配置测试。docker容器就相当于鲸鱼。 联盟链的不同超级节点配置其实是一样的,所以可以借助docker容器完成,先在docker中测试完成,其他节点就拷贝移植就好啦~

docker与VM的区别:

综上:
docker是软件层面的虚拟化,比较轻量级,用于软件环境的复制移植和测试。
VM是操作系统层面的虚拟化,比较笨重,用于操作系统层面的测试。

2、docker 安装

sudo apt install docker.io

可用docker命令查看,docker安装成功会有子命令介绍。 查看docker版本

gan@gan-virtual-machine:~$ sudo docker version
Client:
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.17.3
 Git commit:        20.10.12-0ubuntu4
 Built:             Mon Mar  7 17:10:06 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.3
  Git commit:       20.10.12-0ubuntu4
  Built:            Mon Mar  7 15:57:50 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.9-0ubuntu3
  GitCommit:        
 runc:
  Version:          1.1.0-0ubuntu1
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:        

#拉取hello-world镜像,这样子是默认拉取最新版,如果想选特定版本就在后面加上版本号即可
sudo docker pull hello-world
#用docker images命令可以看到,我们拉取镜像成功啦,执行结果如下
sudo docker images
#REPOSITORY TAG IMAGE ID CREATED SIZE
#hello-world latest feb5d9fea6a5 8 months ago 13.3kB
#删除镜像 后面跟的是镜像ID,因为同一个名字的镜像有不同版本,你可以装多个版本,所以会有多个同名的镜像,只有镜像ID才能唯一标识镜像
sudo docker rmi feb5d9fea6a5
#Untagged: hello-world:latest
#Untagged: hello-world@sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
#Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
#Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
#再次查看,发现镜像删除成功啦
sudo docker images
#REPOSITORY TAG IMAGE ID CREATED SIZE

在网页输入“https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors”,用支付宝或者淘宝扫一扫打开阿里云,确认登陆。然后就有加速器网址啦,也有加速器配置指导。

gan@gan-virtual-machine:~$ cd /etc/docker
gan@gan-virtual-machine:/etc/docker$ ls
key.json
#发现etc/docker目录下没有daemon.json这个文件,所以我们需要新建一个

没事,我们跟着阿里云界面提示的,Ubuntu安装命令来,直接复制那一段粘贴到Ubuntu命令终端。

gan@gan-virtual-machine:/etc/docker$ sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{ 
        
  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
[sudo] password for gan: 
{ 
        
  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]
}
gan@gan-virtual-machine:/etc/docker$ ls
daemon.json  key.json
gan@gan-virtual-machine:/etc/docker$ cat daemon.json 
{ 
        
  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]
}

配置好加速器后,需要重启docker,然后我们再次拉取镜像试一下加速器是否配置成功

#先查看docker当前状态:active (running) 运行中
gan@gan-virtual-machine:/etc/docker$ service docker status
#关闭docker
gan@gan-virtual-machine:/etc/docker$ service docker stop
#再次查看docker当前状态:inactive (dead) 关闭
gan@gan-virtual-machine:/etc/docker$ service docker status
#此时再重新启动
gan@gan-virtual-machine:/etc/docker$ service docker start
#再次查看docker状态就又变成运行中啦


#然后重新拉取hello-world镜像,如果成功,说明加速器配置应该没问题
gan@gan-virtual-machine:/etc/docker$ sudo docker pull hello-world
#Using default tag: latest
#latest: Pulling from library/hello-world
#2db29710123e: Pull complete 
#Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
#Status: Downloaded newer image for hello-world:latest
#docker.io/library/hello-world:latest

4.4 docker常用命令

1:查看版本: docker version
2:查看系统信息: docker info显示 Docker系统信息,包括镜像和容器数。
3: docker images //显示镜像列表
4: docker run hello-world(图文讲解)
//1∶客户端首先要连接Docker服务器。2:从Docker服务器中pull镜像。3:从lmage中创建容器,一个镜像可以创建多个容器。4: Docker守护进程将输出流式传输到Docker客户端,后者将其发送到您的终端。
5: docker rmi hello-world ===> docker images
6: docker pull nginx:1.18.0 //通过官网下载指定版本
7: docker run [-d] nginx //后台运行镜像
8: docker ps //l查看已运行镜像列表-a列表所有的容器,-f过滤,-q只列表容器的id。
9: docker run -d -p 8080:80 nginx //启动时候配置端口映射
10: docker stop containerID //只要能识别ID一位数也行-r尽量先删除容器在删除镜像2.1 docker rmi nginx:1.18.0 #删除已下载的镜像rm是删除容器(镜像运行的称为容器)
11:启动、关闭服务service docker status|start|stop

#拉取镜像
root@gan-virtual-machine:~# docker pull hello-world
#运行容器
root@gan-virtual-machine:~# docker run hello-world
#查看当前正在运行的容器,发现没有,因为hello-world就是下图中所示,打印几个步骤出来,执行完成后自动关闭容器。
root@gan-virtual-machine:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

#删除docker镜像失败
root@gan-virtual-machine:~# docker rmi feb
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 2d9ba30d106c

#查看所有镜像,包括未处于运行状态的容器
root@gan-virtual-machine:~# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
2d9ba30d106c   hello-world   "/hello"   37 minutes ago   Exited (0) 37 minutes ago             condescending_tu
#想要删除镜像需要先删除其对应的容器,和删除类之前要删掉对应的对象一个道理。
#删除容器2d9ba30d106c。后面接的容器ID,只要能够区分就行,不用写完整的ID,如果第一位就能区分,打一个字母也是可以的
root@gan-virtual-machine:~# docker rm 2d9
#查看容器
root@gan-virtual-machine:~# docker ps -a
#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#容器已经删掉了,此时删除镜像
root@gan-virtual-machine:~# docker rmi feb
#查看镜像,确保删除成功
root@gan-virtual-machine:~# docker images

(2)Nginx部署 在docker仓库可以查看版本

#找到1.19.6版本【因为老师用的这个版本啦~】,复制镜像拉取命令
#不加版本号的话,会默认拉取最新的版本,其实装最新版也是可以哒~
docker pull nginx:1.19.6

可以通过localhost:端口号,访问Nginx,其实就类似于Tomcat那种,服务器的界面。

但是我的是这样的:【小白的崩溃就在和老师不一样的一瞬间】

(3)小插曲 因为我访问Nginx页面访问不了,所以我搜了一下问题,发现我还是访问不了,我就回过头看,只有这一步和老师不一样。 用su命令切换管理员 我没有成功,v_v。 然后我就百度,

ubuntu初始root密码
安装完Ubuntu后可能没有设置root密码,不知道密码自然就无法进入根用户下。
到网上搜了一下,原来是这么回事:
Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。
解决方法:
我们可以在终端输入命令“sudo passwd”,然后输入当前用户的密码后"Enter"。
终端会提示我们输入新的密码并确认,此时的密码就是root新密码。
修改成功后,输入命令 su root,再输入新的密码就ok了。

反正最后发现,不是因为管理员的问题。重启docker客户端,重启容器就行~

4.5 fabric组件下载

1、浓缩版:fabric组件下载拉取命令

先切换到管理员身份,再运行下述命令哦~

//在GitHub下载fabric2.3.0的tar.gz文件后,拖到Ubuntu中,并且解压到/opt目录下,进入解压后的目录
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C /opt
root@ubuntu:/opt/fabric-2.3.0/scripts# apt install curl
//如果有报错“E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)”的话,可以不用移除/var/lib/dpkg/lock这个目录,然后重新安装apt install curl,如果没有报错,跳过下面这条语句
root@ubuntu:/opt/fabric-2.3.0/scripts# rm /var/lib/dpkg/lock
//安装,拉取下载组件,获得bin、config、test-等目录
root@ubuntu:/opt/fabric-2.3.0/scripts# ./bootstrap.sh 
//安装docker-compose
root@ubuntu/opt/fabric-2.3.0/scripts# :apt install docker-compose
//启动Fabric服务
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# ./network.sh up
//可以看下,现在在运行的docker容器
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# docker ps -a
//然后试一下终止网络命令——>本质就是销毁之前启动的docker容器的过程
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# ./network.sh down
//组件下载这部分就完成啦

关闭自动屏,这样在下载资源的时候不会因为长时间不在Ubuntu界面而锁屏导致暂停下载 这是20.04版本的Ubuntu需要关闭那个Lock

我装的新版本,没有这个选项好像,如果有的话可能设置的位置变化了。

2、下载组件流程截屏【老师的步骤截屏记录,可跳过不看】

老师说下节课再讲fabric源码压缩包下载 安装好之后,启动网络试试:

发现缺少docker依赖这个组件。docker-compose其实是docker命令行工具,docker多个镜像之前要相互调用相互依赖,所以需要docker-compose来完成。安装一下就好啦~ 装好之后可以发现,刚开始没有samples 操作完之后就有了 这时候再启动网络看看:

3、ca组件下载失败的问题

“------> 1.4.9 fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----” 本来初次安装的时候我没管的,以为没啥影响,后面启动网络它有提示,我想了一下还是回来检查一下,还是把它补全比较好。

===> Downloading version 1.4.9 platform specific fabric-ca-client binary
===> Downloading:  https://github.com/hyperledger/fabric-ca/releases/download/v1.4.9/hyperledger-fabric-ca-linux-amd64-1.4.9.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:21 --:--:--     0
curl: (7) Failed to connect to github.com port 443 after 21048 ms: Connection refused

gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
==> There was an error downloading the binary file.

------> 1.4.9 fabric-ca-client binary is not available to download  (Available from 1.1.0-rc1) <----

然后我在主机上下载,并把下载的tar.gz文件复制进去,解压发现就是bin

标签: 智能温度变送器ad180fd二极管je05b1rs30cp100变送器55v2a3b变送器连接器df1ec贴片电容cl05b102ko

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台