hyperledger-fabric 实验环境极简搭建
本文仅仅作为论文实验的自用记录,分享一下自己的实验过程,参考视频文献下方列出:
讲述的v1.0版本网络搭建,与1.4差别不大,有视频有文档非常全:
https://github.com/itheima1/hyperledger
另一个大佬从头的搭建方法,也学到了很多东西:
官方的文档,按着文档一步一步也能实现
https://hyperledger-fabric.readthedocs.io/zh_CN/latest/
实验环境与上方视频教程保持一直,使用阿里云的境外服务器(ps:在VMware Workstation上试了v2.0版本,已经可以跑通text-network,但是非常麻烦),购买服务器及服务器设置请看视频(Ubuntu 20.04 64位,这里不要选择视频中的Ubuntu 14.04 64位,已经不维护了),这里仅记录过程及问题解决。
- 安装git
apt-get update
apt-get install git
更新系统源,否则下载下来的版本可能过低
- 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
云端和本地比最省事的一步
- 安装hyperledger 和docker镜像
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.1.0
这里最好限制一下版本号,作为实验尝试不限制1.1.0,会下载最新版本,新版本中最大的问题试使用了text-network代替了first-network,目前2.0的教程比较少,论文实验需要的目的,暂时研究旧版本的使用方式。
Curl-sSL https://raw.githubusercontent.com/itheima1/BlockChain/master/tools/bootstrap.sh | bash -s 1.1.0
视频教程中给出的下载方式,但是我使用的时候失败了,如果可以成功,下面的步骤可以跳过。
手动安装fabric二进制文件没有成功拉取的镜像:
docker pull hyperledger/fabric-ca:x86_64-1.0.0
docker pull hyperledger/fabric-couchdb:x86_64-1.0.0
docker pull hyperledger/fabric-kafka:x86_64-1.0.0
docker pull hyperledger/fabric-zookeeper:x86_64-1.0.0
将手动拉取的镜像统一设置tag,方便后续compose统一拉起
docker tag hyperledger/fabric-ca:x86_64-1.0.0 hyperledger/fabric-ca
docker tag hyperledger/fabric-couchdb:x86_64-1.0.0 hyperledger/fabric-couchdb
docker tag hyperledger/fabric-kafka:x86_64-1.0.0 hyperledger/fabric-kafka
docker tag hyperledger/fabric-zookeeper:x86_64-1.0.0 hyperledger/fabric-zookeeper
- 配置阿里云默认超时时间
这里是云服务器自己的问题,如果本地搭建环境可以跳过
vi /etc/resolv.conf
将超时时间设置部分#注释掉
- 安装docker-compose(这里尝试了很多方式,但只有这个方式成功了)
#一般来说云服务器会自带pip-3
apt-get install python-pip -y
#安装编排工具
pip install docker-compose
#查看版本
docker-compose version
- 生成创世纪块,生成证书,启动网络
cd first-network/
./byfn.sh -m generate
./byfn.sh -m up
- 构建mycc,写自己链码的地方
mkdir my-network
cd my-network
定义身份,定义网络的组织和节点,用户数量
论文中区块链投票系统,CA节点,1个投票者,3个验证器BN节点
touch crypto-config.yaml
vi crypto-config.yaml
yaml文件的缩进一定要注意再注意,修改起来非常麻烦
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
- Name: Org2
Domain: org2.example.com
Template:
Count: 3
Users:
Count: 1
为组织和节点生成证书
配置环境变量
export PATH=${PWD}/../bin:${PWD}:$PATH
生成证书文件
cryptogen generate --config=./crypto-config.yaml
如果实验中修改了crypto-config.yaml配置文件,需要删除crypto-config文件重新生成
rm -rf crypto-config
cryptogen generate --config=./crypto-config.yaml
生成order节点的创世区块,包含所有节点的身份信息和证书(创世区块包含所有信息,这里要添加论文init中的CA公钥,BN公钥,chameleon hash的hk,选举信息)
cd first-network/
cp configtx.yaml ../my-network/
文件中重要参数解释:
BatchTimeout:出块超时时间,最长出块间隔(但缓存中必须含有数据才会出块,否则无法出块,即fabric不会强行产生空块)
MaxMessageCount:区块最大交易数量,当交易数量达到此参数后,会立即出块。
PreferredMaxBytes:区块首选字节数,正常情况下一个区块中的交易数据大小会小于此参数。
AbsoluteMaxBytes:区块最大字节数:所有情况下区块的最大允许字节数,超过此参数的交易将无法打包,直接退回。
创建通道配置文件
mkdir channel-artifacts
configtxgen -profile (TwoOrgsOrdererGenesis名字要configtx.yaml和byfn.sh中一样) -outputBlock ./channel-artifacts/genesis.block
生成了创世纪区块
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
更新锚节点,区块链网络中锚节点是组织选举的对外发言人
cd my-network
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
手动创建E2E逻辑
配置docker-compose
cd到first-network目录
cp docker-compose-cli.yaml ../my-network/
拷贝compose的运行依赖
cp -r base ../my-network/
---------------------------分界线--------------------------------------------------------------------
以下内容是实验网络中出现问题时,执行 ./byfn -m down 关停所有容器后重新执行的东西。
回到my-network目录,配置镜像版本号,配置镜像名
export IMAGE_TAG=latest
export COMPOSE_PROJECT_NAME=net
启动docker-compose容器后台运行
docker-compose -f docker-compose-cli.yaml up -d
创建通道
切换用户电脑至cli
docker exec -it cli bash
指定由谁创建通道
1.CORE_PEER_LOCALMSPID="Org1MSP"
证明身份
2.CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/msp
3.peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
可以通过peer channel list命令查看已经初始化的通道
将peer加入通道
切换到peer0.org1 作为选民投票节点
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peer channel join -b mychannel.block
切换到peer0.org2 作为BN验证器节点1
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer channel join -b mychannel.block
切换到peer1.org2 作为BN验证器节点2
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer channel join -b mychannel.block
切换到peer2.org2 作为BN验证器节点3
export CORE_PEER_ADDRESS=peer2.org2.example.com:7051
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer2.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer channel join -b mychannel.block
安装链码(这里不要安装视频课程中的haha.js,不知道是我的node.js文件格式不对还是什么情况,视频课程中的链码是跑不通的,这里尝试了很多遍,非常耗时耗力)
切换到peer0.org1
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/mycc/
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node
切换到peer0.org2
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/mycc/
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node
切换到peer1.org2
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node
这里遇到的问题一:有时候执行了安装链码的命令后还是没有将链码安装成功,可以在安装完链码后查看peer节点是否安装好chaincode。
peer chaincode list --installed
问题二:第一次执行docker-compose时发现docker多启动了几个节点镜像,可以通过下列命令删除多余镜像,否则在实例化时会报错:
docker rm [3333f845dae1]镜像编号
最重要的一步,实例化链码
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l node -v 1.0 -c '{"Args":["init","zhangsan","168","lisi","288"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
查询操作
peer chaincode query -C mychannel -n mycc -c '{"Args":["query",“lisi"]}'
至此,first-network的手动启动就结束了,剩下就是编写论文所需要的chaincode。