hyperledger-fabric 实验环境极简搭建

发布时间 2023-07-31 15:15:39作者: 浅笑丶沫

本文仅仅作为论文实验的自用记录,分享一下自己的实验过程,参考视频文献下方列出:

讲述的v1.0版本网络搭建,与1.4差别不大,有视频有文档非常全:

https://github.com/itheima1/hyperledger

另一个大佬从头的搭建方法,也学到了很多东西:

https://www.cnblogs.com/aberic/p/7527831.html

官方的文档,按着文档一步一步也能实现

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。