准备
- 配置go,docker环境
- 拉取 https://github.com/hyperledger/fabric 1.0.0版本的代码到本地$GOPATH/src/github/hyperledger/fabric路径下
部署
部署情况如下
脚本一键部署
✘ cd examples/e2e_cli/
✘ ./network_setup.sh up
手动分步部署
- 进入fabric项目
✘ make cryptogen
- 生成公钥证书
✘ cd examples/e2e_cli/
✘ ../../build/bin/cryptogen generate --config=./crypto-config.yaml
# 生成的文件都保存到crypto-config文件夹,使用tree crypto-config命令进行查看验证
- 回到fabric项目目录
✘ make cryptogen
- 生成创世区块
✘ cd examples/e2e_cli/
✘ ../../build/bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
- 生成Channel配置区块
✘ ../../build/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
- 锚节点更新
✘ ../../build/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
✘ ../../build/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
# 执行成功会在channel-artifacts文件夹中,生成channel.tx、genesis.block、Org1MSPanchors.tx、Org2MSPanchors.tx四个文件
- 查看
✘ tree channel-artifacts
- docker拉取镜像
✘ docker-compose -f docker-compose-cli.yaml up -d
- 查看运行情况,进入cli容器内部
✘ docker ps | grep fabric
✘ docker exec -it cli bash
- 配置证书的环境变量,创建名字为mychannel的管道
# 配置证书的环境变量
✘ ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
# 创建名为mychannel的管道
✘ peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
- 各个peer加入管道mychannel
# peer0.org0.com 环境
✘ CORE_PEER_LOCALMSPID="Org1MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer1.org1.example.com:7051
✘ peer channel join -b mychannel.block
# peer1.org1.com 环境
✘ CORE_PEER_LOCALMSPID="Org1MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer1.org1.example.com:7051
✘ peer channel join -b mychannel.block
# peer0.org2.com 环境
✘ CORE_PEER_LOCALMSPID="Org2MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer0.org2.example.com:7051
✘ peer channel join -b mychannel.block
# peer1.org2.com 环境
✘ CORE_PEER_LOCALMSPID="Org2MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer1.org2.example.com:7051
✘ peer channel join -b mychannel.block
- 给org1和org2两个组织添加锚节点
# 更新peer0.org1.com为锚节点
✘ CORE_PEER_LOCALMSPID="Org1MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer0.org1.example.com:7051
✘ peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
# 更新peer0.org2.com为锚节点
✘ CORE_PEER_LOCALMSPID="Org2MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer0.org2.example.com:7051
✘ peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
- 给peer0.org1.com安装链码、实例化、进行链码调用
# 切换到peer0.org1.com环境下
✘ CORE_PEER_LOCALMSPID="Org1MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer0.org1.example.com:7051
# 安装链码
✘ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
# 实例化链码,并指定背书策略
✘ peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
# 调用链码查询数据
✘ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
# 链码转账操作
✘ peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
- 给peer0.org2.com安装链码、实例化、进行链码调用
# 切换到org2组织中
✘ CORE_PEER_LOCALMSPID="Org2MSP"
✘ 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
✘ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
✘ CORE_PEER_ADDRESS=peer0.org2.example.com:7051
# 给org2安装链码
✘ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
# 调用链码查询数据
✘ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
make cryptogen编译错误
-
✘ make cryptogen find: /src/github.com/hyperledger/fabric/core/chaincode/shim: No such file or directory build/bin/cryptogen CGO_CFLAGS=" " GOBIN=/Users/test01/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/tools/cryptogen/metadata.Version=1.0.0" github.com/hyperledger/fabric/common/tools/cryptogen go build github.com/hyperledger/fabric/vendor/github.com/miekg/pkcs11: invalid flag in #cgo LDFLAGS: -I/usr/local/share/libtool make: *** [build/bin/cryptogen] Error 1
解决办法:install libtool libltdl-dev
-
✘ apt install libtool libltdl-dev Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/apt" (-1)
解决办法: yum install libtool libtool-ltdl