步骤8:启动所有组件
脚本8_bringUpContainers.sh
docker-compose up -d peer1-org1 peer2-org1 peer1-org2 peer2-org2
sleep 5
configtxgen -profile OrgsOrdererGenesis -outputBlock /tmp/hyperledger/org0/orderer/genesis.block -channelID syschannel
sleep 5
configtxgen -profile OrgsChannel -outputCreateChannelTx /tmp/hyperledger/org0/orderer/channel.tx -channelID mychannel
sleep 5
docker-compose up -d orderer1-org0 cli-org1 cli-org2
我们的目标是提出所有组件,包括orderer1-org0,peer1-org1,peer2-org1,peer1-org2和peer2-org2。另外,我们有两个CLI,一个用于peer组织,用于以后的操作。
同时,orderer1-org0根据docker-compose.yaml需要生成块文件(genesis.block)。因此,我们使用configtxgen在本地生成此代码(第4行),并将结果放置在org0/目录中,该目录已映射到orderer1-org0。我们还生成通道配置事务channel.tx,并将其保存在org0/目录中(第6行)。
当一切正常时,我们会看到所有这些容器都在运行。
从现在开始,我们已经完成了组件级别。剩下的部分纯粹是Hyperledger Fabric的操作。
第9步:创建通道并将peer加入通道
我们按照标准方式创建和连接通道。
首先,我们打开两个CLI:cli-org1和cli-org2。在这两个CLI中,为org1和org2设置了环境变量。缺省的目标peer分别是peer1-org1和peer1-org2。如果两个CLI中需要peer2,我们只设置变量。
对于org1终端,
docker exec -it cli-org1 bash
#
对于org2终端,
docker exec -it cli-org2 bash
#
首先,我们需要复制通道配置事务(channel.tx)。当前位于org0/orderer/目录中(请参阅步骤8)。将其复制到org1/peer1/assets/。请注意,在现实生活中它可能是带外处理的,但是对于我们的教程,我们只是在org0/和org1/之间的映射卷之间进行复制。
在本地主机中
cd /tmp/hyperledger
cp org0/orderer/channel.tx org1/peer1/assets/
使用org1终端创建通道生成区块
在org1终端
peer channel create -c mychannel -f /tmp/hyperledger/org1/peer1/assets/channel.tx -o orderer1-org0:7050 --outputBlock /tmp/hyperledger/org1/peer1/assets/mychannel.block --tls --cafile/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
结果是保存在org1/peer1/assets /中的区块文件mychannel.block。
使用org1终端加入peer1-org1和peer2-org1。请注意,我们暂时设置了变量,以将peer命令定位为peer2-org1。
peer channel join -b /tmp/hyperledger/org1/peer1/assets/mychannel.block
CORE_PEER_ADDRESS=peer2-org1:7051 peer channel join -b /tmp/hyperledger/org1/peer1/assets/mychannel.block
我们需要将此mychannel.block复制到cli-org2。同样,我们正在使用映射的卷。
在本地主机中
cd /tmp/hyperledger
cp org1/peer1/assets/mychannel.block org2/peer1/assets/
类似地,使用org2终端连接peer1-org2和peer2-org2。
在org2终端,
peer channel join -b /tmp/hyperledger/org2/peer1/assets/mychannel.block
CORE_PEER_ADDRESS=peer2-org2:7051 peer channel join -b /tmp/hyperledger/org2/peer1/assets/mychannel.block
要检查是否所有peer都已成功加入通道,我们可以检查
在org1终端,
peer channel getinfo -c mychannel
CORE_PEER_ADDRESS=peer2-org1:7051 peer channel getinfo -c mychannel
在org2终端中,
peer channel getinfo -c mychannel
CORE_PEER_ADDRESS=peer2-org2:7051 peer channel getinfo -c mychannel
我们应该返回上面四个命令的相同结果,这意味着所有peer都具有相同的分类帐(区块链)。
这样,所有peer都加入了该渠道,我们可以开始研究链码了。
步骤10:在所有peer节点中安装Chaincode ABAC
我们安装了chaincode/abac/go-to-peers。链码目录映射到docker compose文件中的cli-org1和cli-org2。
在org1终端,
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
CORE_PEER_ADDRESS=peer2-org1:7051 peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
在org2终端中,
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
CORE_PEER_ADDRESS=peer2-org2:7051 peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
步骤11:使用Org1和Org2实例化Chaincode
在所有peer都安装了chaincode之后,我们现在实例化chaincode。
在实例化链码之前,我们先来看一下链码/abac/go/abac.go中的基于属性的访问控制(ABAC)。在Init()部分,
在第42行中,链码将提取客户机(建议发送者)证书,并查看证书中是否包含abac.init:true属性。如果不是,则返回错误。
我们首先从org1实例化。请记住,admin-org1没有属性abac.init:true。
在org1终端中,
peer chaincode instantiate -C mychannel -n mycc -v 1.0 -c'{"Args":["init","a","100","b","200"]}' -o orderer1-org0:7050 --tls--cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
此错误消息显示由于缺少属性,实例化失败。
现在我们从org2实例化。请记住,admin-org2具有此属性(请参阅步骤7)。
在org2终端,
peer chaincode instantiate -C mychannel -n mycc -v 1.0 -c'{"Args":["init","a","100","b","200"]}' -o orderer1-org0:7050--tls --cafile /tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
我们没有看到错误,并且实例化已完成。在本教程的最后一步,我们将与chaincode函数进行交互。
步骤12:调用和查询Chaincode
我们首先查询a的当前值,根据链码设计和实例化链码时设置的参数,该值应为100。
在org1终端中,
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
CORE_PEER_ADDRESS=peer2-org1:7051 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
在org2终端中,
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
CORE_PEER_ADDRESS=peer2-org2:7051 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
现在在org1终端中调用chaincode函数
peer chaincode invoke -C mychannel -n mycc -c'{"Args":["invoke","a","b","10"]}' --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
注意:也可以在org2终端上调用链码。只需使用正确的路径(即org2而不是org1)更改TLS证书。
调用chaincode函数后,我们在所有对等方中再次查询a的值。所有应更新为90。
在org1终端中,
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
CORE_PEER_ADDRESS=peer2-org1:7051 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
在org2终端中,
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
CORE_PEER_ADDRESS=peer2-org2:7051 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
我们得到正确的结果。网络运行正常。
教程到此结束。
结论
我们已经建立了一个典型的Fabric网络,其中Fabric CA Server生成了所有加密材料。通过精心设计和适当的过程,我们让所有实体从每个组织的CA获取身份证书,而所有网络组件都从单个TLS CA为该网络中的所有组织获取TLS服务器证书。我们还使用具有智能的链码来检查身份,以显示如何基于证书内的属性来控制访问。
相关文章阅读:
区块链研究实验室|Hyperledger Fabric的CA操作指南-part1
----------------------------------------
译者:链三丰
译文出处:http://bitoken.world
----------------------------------------