✘ cd examples/e2e_cli/
✘ ./network_setup.sh up
✘ make cryptogen
✘ cd examples/e2e_cli/
✘ ../../build/bin/cryptogen generate --config=./crypto-config.yaml
# 生成的文件都保存到crypto-config文件夹,使用tree crypto-config命令进行查看验证
✘ make cryptogen
✘ cd examples/e2e_cli/
✘ ../../build/bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
✘ ../../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-compose -f docker-compose-cli.yaml up -d
✘ docker ps | grep fabric
✘ docker exec -it cli bash
# 配置证书的环境变量
✘ 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
# 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
# 更新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环境下
✘ 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"]}'
# 切换到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
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