运行fabric-samples中的示例:创建第一个网络(Building Your First Network)。该网络共有4个peer节点,划分为2个组织(organizations),以及1个单独的orderer节点,此外还需要一个cli容器来与网络节点交互。

准备

1.环境部署
包括需要的软件环境以及docker镜像,具体参考https://zhayujie.com/deploy.html

2.fabric-samples下载
从github上克隆fabric-samples(v1.1):

mkdir -p ~/go/src/github.com/hyperledger      // 如果没有该目录需要创建
cd ~/go/src/github.com/hyperledger
git clone -b master https://github.com/hyperledger/fabric-samples.git
cd fabric-samples

3.二进制工具下载
下载地址:https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric
选择合适的版本下载,将解压后的bin目录放置于fabric-samples目录下,并加入环境变量:

vim ~/.bash_profile            // Ubuntu中是.profile
添加:export PATH=$HOME/hyperledger/fabric-samples/bin:$PATH

脚本自动运行

1.生成网络配置信息
该命令利用cryptogen和configtxgen工具生成网络成员的证书和秘钥,排序服务创世区块,通道配置交易,并且更新Org1和Org2的锚节点。

cd ~/hyperledger/fabric-samples/first-network
./byfn.sh -m generate

2.启动网络
该步完成的操作有:启动网络所有节点,创建通道后将节点加入,安装、实例化chaincode,然后进行一系列查询和交易。

./byfn.sh -m up

3.关闭网络
该命令会删除所有容器、生成的配置文件以及chaincode镜像。

./byfn.sh -m down

手动分步运行

为了更好理解fabric网络创建的具体过程,可以手动一步步完成上述脚本中包含的所有操作。

一.生成配置文件

1.生成证书
当前路径位于first-network目录下,运行以下命令会根据crypto-config.yaml配置文件生成crypto-config目录(MSP目录,包含成员的证书和私钥):

// 如果已加入环境变量可直接执行cryptogen generate
../bin/cryptogen generate --config=./crypto-config.yaml

2.生成创世区块
会创建channel-artifacts目录,并在该目录下生成genesis.block,创世区块用于启动网络中的排序节点。

export FABRIC_CFG_PATH=$PWD     // 需指明configtx.yaml的路径
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

3.生成通道配置交易
该步会在channel-artifacts目录下生成channel.tx,该通道配置交易会在创建通道时从本地读取发送给orderer节点。

export CHANNEL_NAME=mychannel    // 设置通道名称
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

4.生成锚节点配置交易
锚节点(anchor peer),用于不同组织间的gossip通信(区块同步)。该步会在channel-artifacts目录下生成Org1MSPanchors.txOrg2MSPanchors.tx,这两个配置交易会在设置锚节点时使用。

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

二.启动网络

1.启动节点容器
运行之前需要修改docker-compose-cli.yaml文件,注释掉cli容器部分的一行配置:

command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

因为该行命令会使cli容器在运行的时候自动执行script.sh脚本,自动完成所有操作,而这里我们选择手动执行,所以将其注释即可。

启动网络中所有节点:

docker-compose -f docker-compose-cli.yaml up -d

2.创建channel
注意:CLI容器默认连接的是peer0.org1.example.com,操作所需要的环境变量已经设置好了,但如果需要对其他peer或者orderer节点进行操作,则需要重新设置这些环境变量。
首先进入cli容器中,之后的所有命令都是在该容器内部进行的:

docker exec -it cli bash

执行以下命令创建通道,其中--cafile参数制定了orderer节点的TLS根CA证书的路径,用于TLS传输的验证。

export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3.加入通道
创建通道命令会在cli容器中生成一个<channel-ID.block>,在这里是mychannel.block,这是通道创世区块,是该channel内每个节点链上的第一个区块,join channel操作会将该区块发送给指定节点。
现将节点peer0.org1.example.com加入channel:

peer channel join -b mychannel.block

当需要加入其它节点的时候,需要修改环境变量(包括该节点的ip:port,证书路径等),这里以加入peer0.org2.example.com为例。

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 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
peer channel join -b mychannel.block

4.安装链码
chaincode在cli容器内部的路径为(安装时以实际路径为准):

github.com/chaincode/chaincode_example02/go/chaincode_example02.go

执行命令将链码文件安装到指定peer节点的文件系统中(这里只在peer0.example.org1.com安装了):

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

5.实例化链码
实例化链码的操作是channel层面上的,会将channel和该chaincode绑定起来,一份链码的实例化在一个通道上只能执行一次。对于指定的目标节点会生成chaincode镜像并运行该容器,而通道内其它安装了链码的节点则会在指定该节点查询或交易时自动生成镜像和容器。

peer chaincode instantiate -o orderer.example.com:7050 --tls --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')"

其中-p参数设置了背书策略,这里是OR ('Org1MSP.member','Org2MSP.member'),表示交易需要Org1或Org2中的任意一个peer进行一次背书,该交易就是有效的。
-c参数表示将调用链码的init接口,将a、b的值分别设置为100和200。

6.查询
查询a的值,这里假设cli的环境变量连接的仍是peer0.org1.example.com:

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

查询结果为:

Query Result:100

7.交易
从a账户转移10个数额到b账户,该步会发送交易到orderer节点,在区块链中添加新的区块,并更新至状态数据库。

peer chaincode invoke -o orderer.example.com:7050  --tls --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的数值,可以得到结果为90,表明不同peer的账本数据是互相同步的。

标签: fabric

已有 2 条评论

  1. 志鹏 志鹏

    志鹏表示写的不错

    1. zyj zyj

      你试一下 不难的~

添加新评论