fabric测试环境的搭建

参考教程

Fabric测试环境的搭建流程 - 掘金 (juejin.cn)

搭建fabric开发环境

前提环境准备

换源

1
2
3
4
5
6
7
lsb_release -a | grep Codename | awk '{print $2}' //查看ubuntu的Codename

sudo cp /etc/apt/sources.list /etc/apt/sources.list.b // 备份原始文件

sudo chmod 777 /etc/apt/sources.list // 修改文件权限

sudo vi /etc/apt/sources.list // 用 vim 打开文件,删除文件中所有内容,替换为以下对应内容

国内的几个源:
阿里源
中科大源
163源
清华源

1
2
3
4
5
6
//我这里需要翻墙才能执行
sudo apt update

sudo apt upgrade

sudo apt-get update

安装git

1
sudo apt install git

安装cURL

1
sudo apt install curl

安装Docker

查看系统中是否已经安装Docker:

1
docker --version

使用如下命令安装Docker的最新版本:

1
sudo apt install docker.io

查看Docker版本信息:

1
docker --version

修改为当前用户:

1
sudo usermod -aG docker 用户名

注销重启:

1
sudo systemctl restart docker

安装Docker-compose

确定系统中是否已安装docker-compose工具:

1
docker-compose --version

如系统提示未安装,则使用如下命令安装docker-compose工具:

1
sudo apt install docker-compose

安装成功后,查看Docker-Compose版本信息:

1
docker-compose --version

安装Golang

创建Go目录

1
mkdir $HOME/go

使用wget工具下载Golang的最新版本压缩包文件 go1.14.4.linux-amd64.tar.gz

1
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz

下载完成后,文件会保存在当前目录下。可以使用 ll 命令查看

使用 tar 命令将下载后的压缩包文件解压到指定的 /usr/local/ 路径下

1
sudo tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local/

配置环境变量:解压后,Golang可以让系统的所有用户正常使用, 所以我们使用 vim 文件编辑工具打开系统的 profile 文件进行编辑:

1
sudo vim /etc/profile

在profile文件最后添加如下内容:

1
2
3
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

使用 source 命令,使刚刚添加的配置信息生效:

1
source /etc/profile

通过 go version命令验证是否成功:

1
go version

安装make

1
sudo apt install make

安装g++

1
sudo apt install g++

安装libltdl-dev

1
sudo apt-get install libltdl-dev

一键式部署Fabric

新建一个目录并进入:

1
mkdir hyperledger-fabric && cd hyperledger-fabric

下载执行脚本,此脚本用来自动化下载 fabric 镜像、程序和测试网运行脚本等工具:

1
wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh

给脚本添加执行权限:

1
chmod +x bootstrap.sh

执行脚本,指定下载 v1.3.0 版本的相关工具:

1
./bootstrap.sh 1.3.0 1.3.0

image-20220709143056454

将fabric-samples中的可执行程序的路径添加到全局下:

1
2
3
export PATH=/home/sissice/hyperledger-fabric/fabric-samples/bin:$PATH
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

测试环境搭建

1
cd fabric-samples/test-network

该目录下有一个network.sh脚本,可以拉起一个测试环境,具体如何使用可以参考./network.sh --help

执行./network.sh up ,脚本将帮我们自动拉起一个测试环境

可以用 docker ps 查看容器状态

docker container rm xxx 删除

image-20220709162901961

./network.sh up 该脚本将创建出一个order节点,两个peer节点,一个cli容器,用来和其他节点进行交互操作。

但是不会自动帮我们创建通道,如果需要自动帮我们创建通道,可以查看network.sh的帮助文档,比如,创建通道的命令为./network.sh createChannel

image-20220709164626988

至此,你就可以部署智能合约了

chaincode操作流程

官方文档

Fabric chaincode操作流程

启动测试环境并创建通道

1
cd fabric-samples/test-network

通过执行一下命令,会创建两个org组织,一个order节点,并且创建一个通道channel1,并将两个org组织的peer节点加入到channel1中,并且设置anchor peer锚节点。

1
./network.sh up createChannel -c channel1

打包chaincode

1
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0

上面的命令会将合约代码打包成tar文件,--path指定代码文件的路径,label是打包的标签,这个标签在后续中会使用到。

安装chaincode

首先在org1组织中进行安装

1
2
3
4
5
6
7
8
9
10
11
export CORE_PEER_TLS_ENABLED=true

export CORE_PEER_LOCALMSPID="Org1MSP"

export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

export CORE_PEER_ADDRESS=localhost:7051

peer lifecycle chaincode install basic.tar.gz

在org2中安装

1
2
3
4
5
6
7
8
9
10
test-network git:(ad8fc2f) ✗ export CORE_PEER_LOCALMSPID="Org2MSP"

export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

export CORE_PEER_ADDRESS=localhost:9051

peer lifecycle chaincode install basic.tar.gz

image-20220709214302474

解决:

将工作区的bin子目录添加到PATH

1
2
export PATH=$PATH:$(go env GOPATH)/bin
export GOPATH=$(go env GOPATH)。

修改GOPATH

1
2
3
4
5
vim /etc/profile
export GOROOT=/usr/local/go #设置为go安装的路径,有些安装包会自动设置默认的goroot
export GOPATH=$HOME/gocode #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source /etc/profile

然后,解决方案,到链码所在的目录下提前下载依赖包

1
2
3
4
5
cd fabric-samples/asset-transfer-basic/chaincode-go

go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on
go mod vendor

再重新打包智能合约并安装链码

1
2
peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0
peer lifecycle chaincode install basic.tar.gz

Approve chaincode

查看一下chaincode是否已经安装到当前组织

1
2
3
4
5
test-network git:(ad8fc2f) ✗ peer lifecycle chaincode queryinstalled

Installed chaincodes on peer:

Package ID: basic_1.0:950c4b082bc8229268015e94e544db76afeb7086fbb52980387bd5e1bd0b41b3, Label: basic_1.0

设置CC_PACKAGE_ID,

1
export CC_PACKAGE_ID=basic_1.0:950c4b082bc8229268015e94e544db76afeb7086fbb52980387bd5e1bd0b41b3

执行(此时是在org2)

1
2
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID channel1 --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

切换到org1后,再次执行approve操作

1
2
3
4
5
6
7
8
9
10
export CORE_PEER_LOCALMSPID="Org1MSP"

export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

export CORE_PEER_ADDRESS=localhost:7051

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID channel1 --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

提交chaincode

使用checkcommitreadiness查看chaincode是否已经被approve

1
2
➜  test-network git:(ad8fc2f) ✗ peer lifecycle chaincode checkcommitreadiness --channelID channel1 --name basic --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json 

执行commit操作

1
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID channel1 --name basic --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 

测试chaincode是否已经成功提交到channel

1
2
➜  test-network git:(ad8fc2f) ✗ peer lifecycle chaincode querycommitted --channelID channel1 --name basic --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

invoke chaincode

invoke

1
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C channel1 -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'

现在可以从 CLI 查询分类帐。运行以下命令以获取已添加到您的频道分类帐的资产列表:

1
peer chaincode query -C channel1 -n basic -c '{"Args":["GetAllAssets"]}'

写在最后

hyperledger/fabric-samples合约代码

以上是自动化实现环境搭建,其中详细原理可以通过手动搭建环境来理解,参考以下文章:

Hyperledger Fabric的test-network启动过程Bash源码详解

一篇文章上手Fabric CA的使用

Fabric CA 操作指南

定制联盟链网络

Hyperledger Fabric定制联盟链网络工程实践


fabric测试环境的搭建
http://sissice.github.io/2022/07/10/fabric测试环境的搭建/
作者
Sissice
发布于
2022年7月10日
许可协议