启动多节点集群
1. 启动 orderer
[root@fabricorderer e2e_cli]# pwd
/root/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli
[root@fabricorderer e2e_cli]# docker-compose -f docker-compose-cli.yaml up -d
启动orderer成功的标识:出现一下信息
nfig=0, lastConfigSeq=0):
2018-04-05 11:47:12.154 UTC [orderer/multichain] NewManagerImpl -> INFO 0e1 Starting with system channel testchainid and orderer type solo
2018-04-05 11:47:12.154 UTC [orderer/main] main -> INFO 0e2 Beginning to serve requests
2. 启动 org1 的第一个节点 peer0,即 peer0.org1.example.com
[root@fabric-CA e2e_cli]# docker-compose -f docker-compose-cli.yaml up -d
[root@fabric-CA e2e_cli]# docker exec -it cli bash
[root@fabric-CA e2e_cli]# export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem
[root@fabric-CA e2e_cli]# peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx -
-tls --cafile $ORDERER_CA
[root@fabric-CA e2e_cli]# peer channel join -b mychannel.block
[root@fabric-CA e2e_cli]# peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA'
[root@fabric-CA e2e_cli]# peer chaincode install -n mycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
3. 启动 org1 的第二个节点 peer1,即 peer1.org1.example.com
[root@build e2e_cli]# docker-compose -f docker-compose-cli.yaml up -d
[root@build e2e_cli]# docker exec -it cli bash
[root@build e2e_cli]# peer channel join -b mychannel.block
[root@build e2e_cli]# peer chaincode install -n mycc -v 1.0 –p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
4. 启动 org2 的第一个节点 peer2,即 peer0.org2.example.com
[root@k8s03 e2e_cli]# docker-compose -f docker-compose-cli.yaml up -d
[root@k8s03 e2e_cli]# docker exec -it cli bash
[root@k8s03 e2e_cli]# peer channel join -b mychannel.block
[root@k8s03 e2e_cli]# peer channel update -o orderer.example.com:7050 -c mychannel -f ./channelartifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
[root@k8s03 e2e_cli]# peer chaincode install -n mycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
5. 启动 org2 的第二个节点 peer3,即启动 peer1.org2.example.com
[root@k8s02 e2e_cli]# docker-compose -f docker-compose-cli.yaml up -d
[root@k8s02 e2e_cli]# docker exec -it cli bash
[root@k8s02 e2e_cli]# peer channel join -b mychannel.block
[root@k8s02 e2e_cli]# peer chaincode install -n mycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
6 运行 chaincode
通过前面的步骤,整个多节点 Fabric 网络已经运行起来了,每个 peer 都加入到了标识为 mychannel 的 channel 中,并且都安装了一个简单的 chaincode(该 chaincode 在安装时被标识为 mycc) 。下面步骤运行和维护 chaincode。
实例化 chaincode
chaincode 的实例化可在任意 peer 上进行,并且 chaincode 只能被实例化一次,下面以在
peer1.org1.example.com 上实例化 chaincode 为例。
[root@build e2e_cli]# peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
这时候会构建一个新的容器来运行 chaincode,通过 docker ps -a 命令可以看到新容器:
[root@build e2e_cli]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a8a8babec0d dev-peer1.org1.example.com-mycc-2.0 "chaincode -peer.a..." 2 hours ago Up 2 hours dev-peer1.org1.example.com-mycc-2.0
9c2635a9a90a dev-peer1.org1.example.com-mycc-1.0 "chaincode -peer.a..." 2 hours ago Up 2 hours dev-peer1.org1.example.com-mycc-1.0
45c5ad416ff2 hyperledger/fabric-tools "/bin/bash" 3 hours ago Up 3 hours cli
9d23589e49d2 hyperledger/fabric-peer "peer node start" 3 hours ago Up 3 hours 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer1.org1.example.com
[root@build e2e_cli]#
上述实例化中,我们对两个变量‘a’和‘b’分别赋予初值 100 和 200,通过 channel 它们的值被同步到了其他 peer 的账本上,即使其他 peer 还没有构建运行 chaincode 的容器。
2. 执行 chaincode 的 query 交易
由于 chaincode 已经被 peer0.org2.example.com 实例化了,因此其他 peer 不需要再次实例化它了,但是 chaincode 的状态(world state)却是已经记录在各个 peer 的账本上。
接下来我们在 peer0.org1.example.com 上查看 chaincode 的状态,
内部执行:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
...
Query Result: 100
3. 执行 chaincode 的 invoke 交易
接下来,我们执行一个 invoke 交易,使得变量 a 向变量 b 转帐 20,得到最终值为
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n
mycc -c '{"Args":["invoke","a","b","20"]}'
4. 再次执行 chaincode 的 query 交易
在 peer1.org1.example.com 上重复以上查看 chaincode 的步骤,得到返回结果为 80,说明测试通过,至此,Fabric 网络构建完毕,各个组件工作正常。
5. 更新 chaincode
peer chaincode install -n mycc -v 2.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
peer chaincode upgrade -o orderer.example.com:7050 --tls --cafile $ORDERER_CA \ -C mychannel -n mycc -v 2.0 -c '{"Args":["init","c", "10", "d","20"]}'
等待一段时间后,可以通过 docker ps -a 来查看新容器构建的容器,该容器的名称为:
[root@build e2e_cli]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a8a8babec0d dev-peer1.org1.example.com-mycc-2.0 "chaincode -peer.a..." 2 hours ago Up 2 hours dev-peer1.org1.example.com-mycc-2.0
9c2635a9a90a dev-peer1.org1.example.com-mycc-1.0 "chaincode -peer.a..." 2 hours ago Up 2 hours dev-peer1.org1.example.com-mycc-1.0
45c5ad416ff2 hyperledger/fabric-tools "/bin/bash" 3 hours ago Up 3 hours cli
9d23589e49d2 hyperledger/fabric-peer "peer node start" 3 hours ago Up 3 hours 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer1.org1.example.com
通过以下命令查询 c 的变量:
root@f2dc61cbd33a:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","c"]}'
2018-04-05 12:36:19.592 UTC [msp] getMspConfig -> INFO 001 intermediate certs folder not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts]. Skipping.: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts: no such file or directory]
2018-04-05 12:36:19.592 UTC [msp] getMspConfig -> INFO 002 crls folder not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts]. Skipping.: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/crls: no such file or directory]
2018-04-05 12:36:19.592 UTC [msp] getMspConfig -> INFO 003 MSP configuration file not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/config.yaml]: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/config.yaml: no such file or directory]
2018-04-05 12:36:19.610 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2018-04-05 12:36:19.610 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2018-04-05 12:36:19.610 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AAD070A6708031A0C08C3B098D60510...6D7963631A0A0A0571756572790A0163
2018-04-05 12:36:19.610 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: 55E32E7EE59436EB076C671CEA07334F11614DB106B7713FDF9583A7EFEDA81A
Query Result: 10
再次查询 a 的变量:
root@f2dc61cbd33a:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
2018-04-05 12:36:12.785 UTC [msp] getMspConfig -> INFO 001 intermediate certs folder not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts]. Skipping.: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts: no such file or directory]
2018-04-05 12:36:12.785 UTC [msp] getMspConfig -> INFO 002 crls folder not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/intermediatecerts]. Skipping.: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/crls: no such file or directory]
2018-04-05 12:36:12.785 UTC [msp] getMspConfig -> INFO 003 MSP configuration file not found at [/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/config.yaml]: [stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/config.yaml: no such file or directory]
2018-04-05 12:36:12.803 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2018-04-05 12:36:12.803 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2018-04-05 12:36:12.803 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AAD070A6708031A0C08BCB098D60510...6D7963631A0A0A0571756572790A0161
2018-04-05 12:36:12.803 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: 0F96F27107E16006971BA985F07284E56F4A495FB73686902B34DB281C172192
Query Result: 80
在其他节点分别执行一下命令
peer chaincode install -n mycc -v 2.0 –p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
end