Ubuntu20.04搭建Hyperledger Fabric 2.2.2

AI数据 区块链  收藏
0 / 1058

go语言环境

版本1.16.3

由于apt-get命令安装golang在国内网络环境受限制,推荐手动安装。
前往go语言中文网https://studygolang.com/dl

  • 下载
wget http://go.dev/dl/go1.16.3.linux-amd64.tar.gz

进入下载的压缩包文件所在目录
将压缩包解压至/usr/local/ 目录下

$ sudo tar zxvf go1.16.3.linux-amd64.tar.gz -C /usr/local/

进入/proj/ 目录,新建workspace文件夹作为Golang的工作目录,也可以取别的名字,后面相关的命令和代码替换workspace就行

$ sudo mkdir workspace
$ sudo chmod -R 777 workspace

修改环境变量

$ sudo vim ~/.bashrc

弹出一个记事本,按a进入插入模式,复制后右键粘贴以下内容至记事本内容最上方

export GOROOT=/usr/local/go #GOROOT是系统上安装Go软件包的位置。
export GOPATH=/proj/workspace #GOPATH是工作目录的位置。
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

然后按enter换行,让内容有序一点,按esc,输入:wq即可保存并退出

使用以下命令应用环境变量的更改命令

$ source ~/.bashrc

查看环境变量是否正确

$ export

输出有以下内容

declare -x GOROOT="/usr/local/go"
declare -x GOPATH="/proj/workspace"

验证go是否安装成功

$ go version
# 输出为
go version go1.16.3 linux/amd64
# 设置GOPROXY代理
$ go env -w GOPROXY=https://goproxy.cn,direct
# 设置GOPRIVATE来跳过私有库,比如常用的Gitlab或Gitee,中间使用逗号分隔
$ go env -w GOPRIVATE=.gitlab.com,.gitee.com
# 设置 GOSUMDB=“sum.golang.google.cn”, 这个是专门为国内提供的sum 验证服务
$ go env -w GOSUMDB="sum.golang.google.cn"

至此Go语言已经安装完成。

安装docker

版本20.10.6

卸载旧版本docker
docker,docker.io,docker-engine都是docker以往的名字
在安装Docker前先将其他任何已有Docker删除,如果你之前系统中没有装过Docker可以跳过这一步

$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
$ sudo apt-get install  apt-transport-https  ca-certificates curl  gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update

往往最新的docker不一定就能适合你的系统,先查看可以安装的版本

$ apt-cache madison docker-ce
$ sudo apt-get install docker-ce=20.10.6 docker-ce-cli=20.10.6 containerd.io
$ docker --version
$ sudo systemctl start docker
$ sudo systemctl enable docker

添加自己的账户到docker组,同样自己的用户名替换尖括号部分,以后用docker就不用sudo了

$ sudo usermod -a -G docker openoker

安装docker-compose

版本1.27.2

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 更改docker-compose权限
$ sudo chmod +x /usr/local/bin/docker-compose
# 执行一下docker-compose
$ docker-compose
# 正常会出使用规则,如果报错则
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看docker-compose版本
$ docker-compose --version
#显示v1.27.2

安装Fabric

建立用于存放fabric-samples的文件夹,递归建立目录

$ sudo mkdir /proj/workspace/pkg/mod/github.com/hyperledger
$ cd /proj/workspace/pkg/mod/github.com/hyperledger

拉取Fabric v2.2.2 及 Fabric-ca v1.4.9,可能会中断多试几遍,五秒没反应或者出现2.2.2没法拉取就ctrl+c重来。

$ curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2 1.4.9

下载完成后查看docker镜像

$ docker images
hyperledger/fabric-tools          2.2       212bfff67240   2 months ago   436MB
hyperledger/fabric-tools          2.2.2     212bfff67240   2 months ago   436MB
hyperledger/fabric-tools          latest    212bfff67240   2 months ago   436MB
hyperledger/fabric-peer           2.2       0db1edb6ddd8   2 months ago   55MB
hyperledger/fabric-peer           2.2.2     0db1edb6ddd8   2 months ago   55MB
hyperledger/fabric-peer           latest    0db1edb6ddd8   2 months ago   55MB
hyperledger/fabric-orderer        2.2       89cac0d3ab9b   2 months ago   38.5MB
hyperledger/fabric-orderer        2.2.2     89cac0d3ab9b   2 months ago   38.5MB
hyperledger/fabric-orderer        latest    89cac0d3ab9b   2 months ago   38.5MB
hyperledger/fabric-ccenv          2.2       989d60213726   2 months ago   502MB
hyperledger/fabric-ccenv          2.2.2     989d60213726   2 months ago   502MB
hyperledger/fabric-ccenv          latest    989d60213726   2 months ago   502MB
hyperledger/fabric-baseos         2.2       0483f4bff906   2 months ago   6.85MB
hyperledger/fabric-baseos         2.2.2     0483f4bff906   2 months ago   6.85MB
hyperledger/fabric-baseos         latest    0483f4bff906   2 months ago   6.85MB
hyperledger/fabric-ca               1.4       dbbc768aec79   6 months ago   158MB
hyperledger/fabric-ca  	          1.4.9     dbbc768aec79   6 months ago   158MB
hyperledger/fabric-ca            latest    dbbc768aec79   6 months ago   158MB

启动测试网络
进入test-network目录

$ cd fabric-samples/test-network

关闭可能在运行的容器

$ ./network.sh down

创建Fabric网络,该网络由两个peer node和一个orderer node组成,但这个指令不会创建channel

$ ./network.sh up

运行成功则输出以下内容

Creating network "net_test" with the default driverCreating volume "net_orderer.example.com" with default driverCreating volume "net_peer0.org1.example.com" with default driverCreating volume "net_peer0.org2.example.com" with default driverCreating peer0.org2.example.com ... doneCreating orderer.example.com    ... doneCreating peer0.org1.example.com ... doneCreating cli                    ... 
done
CONTAINER ID   IMAGE                               COMMAND             CREATED         STATUS                  PORTS                                            NAMES
1667543b5634   hyperledger/fabric-tools:latest     "/bin/bash"         1 second ago    Up Less than a second                                                    cli
b6b117c81c7f   hyperledger/fabric-peer:latest      "peer node start"   2 seconds ago   Up 1 second             0.0.0.0:7051->7051/tcp                           peer0.org1.example.com
703ead770e05   hyperledger/fabric-orderer:latest   "orderer"           2 seconds ago   Up Less than a second   0.0.0.0:7050->7050/tcp, 0.0.0.0:7053->7053/tcp   orderer.example.com
718d43f5f312   hyperledger/fabric-peer:latest      "peer node start"   2 seconds ago   Up 1 second             7051/tcp, 0.0.0.0:9051->9051/tcp                 peer0.org2.example.com

查看容器列表,可以看到之前network建立时的3个node。

$ docker ps -a

每个node及user在使用Fabric network时需要从属于一个organizaton以参与网络,test network包含两个peer organization,分别是Org1和Org2,以及一个用于维护网络服务次序的orderer organization。

Peers是所有Fabirc network的基本组成,Peers负责保存区块链分类帐并在将交易提交到分类帐之前验证交易。

Peers是智能合约的执行者,智能合约包含了管理区块链分类账上资产的业务逻辑。

test network中,Org1及Org2分别拥有peer0.org1.example.com和peer0.org2.example.com作为其组织内唯一的Peer。

每个Fabric网络还包括Ordering service。 当对等方(Peers)验证交易并将交易块添加到区块链分类账中时,他们并不确定交易的顺序或将其添加至新的块中。 在分布式网络上,Peers可能彼此相距很远,并且对创建事务的时间没有准确的约定。 在交易顺序上达成共识是一个代价高昂的过程,这会给对等方造成开销。

Ordering service允许Peers专注于验证交易并将其提交到分类账。在Ordering node(s)收到客户认可的交易后,他们就交易顺序达成共识,然后将其添加到区块中。 然后将这些块分发到Peers,Peers将这些块添加到区块链分类账中。 个人理解:Ordering service在区块链网络中扮演一个中间人的角色,负责交接手续,确保一手交货一手交钱,保证交易过程稳定安全。

Sample network使用由orderer organization操作的单节点Raft ordering service。 您可以在ordering.example.com上看到正在计算机上运行的订购节点。 尽管test network仅使用单个节点订购服务,但是production network具有多个订购节点,这些订购节点由一个或多个订购者组织操作。 不同的ordering node将使用Raft共识算法来就网络上的事务顺序达成协议。

创建一个通道(Channel)
现在已经有了peer nodes和order nodes,使用脚本network.sh建立一个Fabric channel用于Org1和Org2之间的交易。Channels是在特定网络成员之间的私有层,只能由在channel中的organization使用,对于网络中的其他成员不可见。每个channel有一个独立的区块链分类账,organization被邀请加入channel后,会将自己的peers也代入channel并存储channel分类帐并验证channel上的交易。

$ ./network.sh createChannel

创建通道后,可以开始使用智能合约与通道分类帐进行交互。智能合约包含管理区块链分类账上资产的业务逻辑。网络成员运行的应用程序可以调用智能合约以在分类账上创建、更改和转移资产。应用程序查询智能合约以读取分类账上的数据。 为了确保交易有效,使用智能合约创建的交易通常需要由多个组织签名才能提交到channel分类账。多个签名是Fabric信任模型不可或缺的一部分。交易需要多次认证,可以防止channel上的一个组织篡改其对等账本或使用未经同意的业务逻辑。要签署交易,每个组织都需要在其Peers上调用并执行智能合约,然后再签署交易的输出。如果输出是一致的并且已经有足够的组织签名,则可以将事务提交到分类帐。在通道(channel)上指定需要执行智能合约的设置组织的策略称为认证策略,该策略是为每个chaincode设置的,作为chaincode定义的一部分。 在Fabric中,智能合约以称为chaincode的软件包部署在网络上。 Chaincode安装在organization的peers上,然后部署到channel,这样就能在channel中认可交易并与区块链分类账交互。在将chaincode部署到channel之前,channel成员需要就建立chaincode管理的chaincode定义达成共识。当所需的组织数目达成一致时,可以将chaincode定义提交给渠道,chaincode已完成使用前的准备。

部署chaincode(链码,可理解为智能合约的代码),名称为chaincode-go,语言选择为go

$ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

成功后关闭测试网络

$ ./network.sh down

安装nvm

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

验证nvm安装情况

$ source ~/.bashrc
$ nvm version
v0.35.3

安装node及npm

$ nvm install 14.16.1

更新npm全局包

$ npm update

安装build-essential,整合了make, and a C/C++ compiler toolchain such as GCC

$ sudo apt install build-essential

成功后关闭测试网络

$ ./network.sh down

启动测试网络

$ ./network.sh up createChannel -c mychannel -ca

此命令将部署具有两个peers,一个ordering service和三个证书颁发机构(Orderer,Org1,Org2)的Fabric测试网络。 代替使用cryptogen工具,我们使用证书颁发机构(因此代码中含有-ca)来启动测试网络。 此外,启动证书颁发机构时会引导组织管理员用户注册。 在后续步骤中,我们将显示示例应用程序如何完成管理员注册。

部署chaincode,名称为chaincode-javascript,语言选择为javascript

$ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript/ -ccl javascript

在fabric-samples目录下打开一个新的终端,进入下方目录

$ cd asset-transfer-basic/application-javascript

该目录包含使用Fabric SDK for Node.js开发的示例程序。 运行以下命令以安装应用程序依赖项

$ npm install

此过程将安装在应用程序的package.json中定义的关键应用程序依赖项。 其中最重要的是结构网络Node.js模块。 它使应用程序能够使用身份,钱包和网关来连接到channel,提交交易并等待通知。 本教程还使用fabric-ca-client模块为用户注册各自的证书颁发机构,生成有效的身份,然后由fabric-network模块使用该身份与区块链网络进行交互。 npm install完成后,一切就绪,可以运行该应用程序。 让我们看一下将在本教程中使用的示例 JavaScript 应用程序文件。 运行以下命令以列出此目录中的文件。

$ lsapp.js  node_modules  package.json  package-lock.json

与证书颁发机构(Certificate Authority)的通信。 在运行刚才的程序时,可以打开新的terminal shell并运行

$ docker logs -f ca_org1显示证书颁发机构日志。

当我们启动Fabric测试网络时,创建了一个管理员用户(名为admin)作为证书颁发机构(CA)的注册者。 我们的第一步是通过让应用程序调用enrollAdmin来生成admin的私钥,公钥和X.509证书。 此过程使用证书签名请求(CSR)-专用密钥和公用密钥首先在本地生成,然后将公用密钥发送到CA,CA返回编码的证书供应用程序使用。 这些凭证然后存储在钱包中,使我们能够充当CA的管理员。 让我们运行该应用程序,然后逐步完成与智能合约功能的每种交互。 在asset-transfer-basic / application-javascript目录中,运行以下命令:

$ node app.js

问题修复

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

创建/etc/openvpn/fix-routes.sh具有以下内容的脚本:

#!/bin/sh

echo "Adding default route to $route_vpn_gateway with /0 mask..."
ip route add default via $route_vpn_gateway

echo "Removing /1 routes..."
ip route del 0.0.0.0/1 via $route_vpn_gateway
ip route del 128.0.0.0/1 via $route_vpn_gateway

将可执行位添加到文件:chmod o+x /etc/openvpn/fix-routes.sh。将此文件的所有者更改为root :chown root:root /etc/openvpn/fix-routes.sh。

通过以下两行将其添加到您的配置中:

script-security 2
route-up  /etc/openvpn/fix-routes.sh

说明
Openvpn添加了以下网络的路由:0.0.0.0/1和128.0.0.0/1(这些路由覆盖整个IP范围),而docker无法找到IP地址范围来创建自己的专用网络。

您需要添加默认路由(通过openvpn路由所有路由)并禁用这两个特定路由。fix-routes脚本可以做到这一点。

openvpn添加自己的路由后,将调用此脚本。要执行脚本,您需要设置script-security为2允许从openvpn上下文执行bash脚本。