Ubuntu20.04搭建Hyperledger Fabric 2.2.2

Web3.0 区块链  收藏
0 / 121

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 脚本。