参考教程
Fabric测试环境的搭建流程 - 掘金 (juejin.cn)
搭建fabric开发环境
前提环境准备
换源
1 2 3 4 5 6 7
| lsb_release -a | grep Codename | awk '{print $2}'
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
安装cURL
安装Docker
查看系统中是否已经安装Docker:
使用如下命令安装Docker的最新版本:
1
| sudo apt install docker.io
|
查看Docker版本信息:
修改为当前用户:
1
| sudo usermod -aG docker 用户名
|
注销重启:
1
| sudo systemctl restart docker
|
安装Docker-compose
确定系统中是否已安装docker-compose工具:
如系统提示未安装,则使用如下命令安装docker-compose工具:
1
| sudo apt install docker-compose
|
安装成功后,查看Docker-Compose版本信息:
安装Golang
创建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 文件进行编辑:
在profile文件最后添加如下内容:
1 2 3
| export GOPATH=$HOME/go export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH
|
使用 source 命令,使刚刚添加的配置信息生效:
通过 go version命令验证是否成功:
安装make
安装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
|
给脚本添加执行权限:
执行脚本,指定下载 v1.3.0 版本的相关工具:
1
| ./bootstrap.sh 1.3.0 1.3.0
|
将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
删除
./network.sh up
该脚本将创建出一个order
节点,两个peer
节点,一个cli
容器,用来和其他节点进行交互操作。
但是不会自动帮我们创建通道,如果需要自动帮我们创建通道,可以查看network.sh
的帮助文档,比如,创建通道的命令为./network.sh createChannel
至此,你就可以部署智能合约了
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
|
解决:
将工作区的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定制联盟链网络工程实践