搭建第一个网络(二)

搭建第一个网络(二)

本文主要是根据网上文档动手操作,熟悉一下区块链网络的工作流程,包括生成创世区块,创建通道,安装链码,实例化链码,实现查询、调用的功能。

生成初始区块

$ ../bin/cryptogen generate --config=./crypto-config.yaml

$ export FABRIC_CFG_PATH=$PWD  #赋值

$ ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

生成应用通道的配置信息

$ export CHANNEL_NAME=mychannel    #mychannel是链的标识,可以自己命名

$ ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME  

生成锚节点配置更新文件,锚节点与对点节点通信

#将在正在构建的通道上定义Org1的anchor peer。请再次确认$CHANNEL_NAME已被替换或者为以下命令设置了环境变量

$ ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP 

#在同一个通道定义Org2的anchor peer:

$ ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

操作网络

现在我们想手动执行命令,以便公开每个调用的语法和功能,所以打开docker-compose-cli.yaml文件,注释掉下面的command命令:

working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT' volumes

#如果没有注释,该脚本将在网络启动时执行所有命令。

$ CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d

#适当地为TIMEOUT传递较高的值(以秒为单位);默认情况下CLI容器将在60秒之后退出。

创建和加入通道

使用docker exec命令进入CLI容器:

$ docker exec -it cli bash

如果成功,你将看到下列信息:

root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

创建通道

$ export CHANNEL_NAME=mychannel

$ peer channel create -oorderer.example.com:7050-c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --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

#此命令返回一个创世区块--我们将使用它加入信道。它包含了channel.tx中的配置信息。

加入通道

$ peer channel join -b mychannel.block

安装和实例化链码

$ peer chaincode install -n mycc -v 1.0 -pgithub.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

$ peer chaincode instantiate -oorderer.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 $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

查询

#查询一下a的值,以确保链码被正确实例化,state DB被填充

$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

#查询结果

Query Result : 100

调用

#我们从a账户转10到b账户。这个交易将创建一个新的区块并更新state DB。

$ peer chaincode invoke -oorderer.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 $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

查询

#确认下我们之前的调用被正确地执行了。我们初始化了a的值为100,在上一次调用的时侯转移了10给b。因此,查询a应该展示90。

$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

# 应该看到以下内容

$ Query Result: 90


这些步骤描述了在script.sh脚本中没有注释掉的docker-compose-cli.yaml文件中的场景。使用./byfn.sh -m down并确保命令执行成功。然后使用相同的docker-compose提示去启动你的网络。

script.sh脚本被拷贝到CLI容器中。这个脚本驱动了使用提供的channel name以及信道配置的channel.tx文件的createChannel命令。

createChannel命令的产出是一个创世区块-.block-这个创世区块被存储在peer节点的文件系统中同时包含了在channel.tx的信道配置。

joinChannel命令被4个peer节点执行,作为之前产生的genesis block的输入。这个命令介绍了peer节点加入以及利用.block去创建一条链。

现在我们有了由4个peer节点以及2个组织构成的信道。这是我们的TwoOrgsChannel配置文件。

peer0.org1.example.com和peer1.org1.example.com属于Org1;peer0.org2.example.com和peer1.org2.example.com属于Org2

这些关系是通过crypto-config.yaml定义的,MSP路径在docker-compose文件中被指定。

Org1MSP(peer0.org1.example.com)和Org2MSP(peer0.org2.example.com)的anchor peers将在后续被更新。我们通过携带channel的名字传递Org1MSPanchors.tx和Org2MSPanchors.tx配置到排序服务来实现anchor peer的更新。

一个链码-chaincode_example02被安装在peer0.org1.example.com和peer0.org2.example.com

这个链码在peer0.org2.example.com被实例化。实例化过程将链码添加到信道上,并启动peer节点对应的容器,并且初始化和链码服务有关的键值对。示例的初始化的值是[”a“,”100“,”b“,”200“]。实例化的结果是一个名为dev-peer0.org2.example.com-mycc-1.0的容器启动了。

实例化过程同样为背书策略传递相关参数。策略被定义为-P "OR    ('Org1MSP.member','Org2MSP.member')",意思是任何交易必须被Org1或者Org2背书。

一个针对a的查询发往peer0.org1.example.com。链码服务已经被安装在了peer0.org1.example.com,因此这次查询将启动一个名为dev-peer0.org1.example.com-mycc-1.0的容器。查询的结果也将被返回。没有写操作出现,因此查询的结果的值将为100。

一次invoke被发往peer0.org1.example.com,从a转移10到b。

然后链码服务被安装到peer1.org2.example.com

一个query请求被发往peer1.org2.example.com用于查询a的值。这将启动第三个链码服务名为dev-peer1.org2.example.com-mycc-1.0。返回a的值为90,正确地反映了之前的交易,a的值被转移了10。

排错

始终保持你的网络是全新的。使用以下命令来移除之前生成的artifacts,crypto,containers以及chaincode images:

$ ./byfn.sh -m down

查询正在运行的容器

$ docker ps -a

删除镜像:

$ docker rm -f $(docker ps -aq)

$ docker rmi -f $(docker images -q)


参考:

构建第一个fabric网络:https://hyperledgercn.github.io/hyperledgerDocs/build_network_zh/

https://blog.csdn.net/lengxue789/article/details/78915692

你可能感兴趣的:(搭建第一个网络(二))