搭建fabric1.4.1 自定义byfn例子

初学fabric

1 创建fabric-demo目录

目录内容如下:
搭建fabric1.4.1 自定义byfn例子_第1张图片

1.1 拷贝crypto-config.yaml到当前目录执行下面命令

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

会在crypto-config目录下根据配置文件中信息给相关组织、节点、用户创建证书、秘钥。配置文件中设置了一个order组织,下挂一个order节点,两个peer组织,每个peer组织下挂2个peer节点,每个peer组织含有2个普通用户,默认存在一个管理员用户。Template.Count控制peer节点数量,Users.Count控制普通用户数量。
搭建fabric1.4.1 自定义byfn例子_第2张图片
搭建fabric1.4.1 自定义byfn例子_第3张图片

1.2 拷贝configtx.yaml到当前目录执行下面命令

configtxgen -profile genesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

该命令会在/opt/fabric-demo/channel-artifacts中创建genesis.block文件,主要生成创建创世块的配置文件。 byfn-sys-channel是一个系统channel与后面手动创建的channel不同。
搭建fabric1.4.1 自定义byfn例子_第4张图片
configtxgen -profile 参数名与configtx.yaml中配置的名称一致即可。里面包含order组织的信息,order节点的属性,联盟名称SampleConsortium,组成该联盟的peer组织信息等。

configtxgen -profile myChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel

该命令会在/opt/fabric-demo/channel-artifacts中创建channel.tx文件,主要生成创建通道的配置文件。
搭建fabric1.4.1 自定义byfn例子_第5张图片
configtxgen -profile 参数名与configtx.yaml中配置的名称一致即可。里面包含该通道关联的联盟,参与该通道的peer组织信息,channelID的名称必须小写。

configtxgen -profile myChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

configtxgen -profile myChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

该命令用来更新peer组织的anchor peer角色的peer节点的。一个peer组织最多只有一个anchor peer角色的peer节点,代表该peer组织与其他组织进行通信,该命令生成一个新的anchor peer角色的peer节点配置文件。channelID与上面创建的channel.tx中channelID名称一致,-asOrg 后面MSPID与下列展示一致。
搭建fabric1.4.1 自定义byfn例子_第6张图片
执行完上面命令后,最终展示如下:
在这里插入图片描述

1.3 拷贝docker-compose-cli.yaml文件到当前目录

搭建fabric1.4.1 自定义byfn例子_第7张图片
通过观察该配置文件中内容发现 启动order服务的时候会依赖base/docker-compose-base.yaml配置文件中名称为orderer.example.com的服务。拷贝base/docker-compose-base.yaml到当前目录。
搭建fabric1.4.1 自定义byfn例子_第8张图片
观察发现orderer.example.com名称的服务依赖peer-base.yaml配置文件,将该配置文件拷贝到base目录。结果如下:
在这里插入图片描述
如果修改了相关节点的domain,需要修改配置文件中相关路径。主要涉及到6个容器的配置信息,1个cli,1个order,4个peer。msp,tls,gossip,连接peer的用户、日志级别等信息。注意peer-base.yaml配置文件中含有一个变量${COMPOSE_PROJECT_NAME},该变量取值是docker-compose-cli.yaml所在目录的名称。会根据该变量构建docker network名称。
搭建fabric1.4.1 自定义byfn例子_第9张图片

1.4 拷贝chaincode目录到当前目录

chaincode目录中保存的是链码示例,含有go、java、node三种版本。该处使用go语言的chaincode_example02.go链码
搭建fabric1.4.1 自定义byfn例子_第10张图片
chaincode目录的路径需要和docker-compose-cli.yaml中cli服务的chaincode一致。
搭建fabric1.4.1 自定义byfn例子_第11张图片

2 启动服务 构建fabric 网络

执行下列命令,传入变量IMAGE_TAG、COMPOSE_PROJECT_NAME值

IMAGE_TAG=1.4.1 COMPOSE_PROJECT_NAME=fabric-demo docker-compose -f docker-compose-cli.yaml up -d

搭建fabric1.4.1 自定义byfn例子_第12张图片

3 创建channel并将peer加入channel

执行下列命令,进入cli容器,根据 docker-compose-cli.yaml 配置文件信息,默认连接的peer0.org1节点。

docker exec -it cli bash

执行下列命令,创建channel,该channel名称与创建channel.tx文件的时候设置的一致mychannel 。

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

容器内当前目录下生成了一个mychannel.block文件,代表创建channel成功。
搭建fabric1.4.1 自定义byfn例子_第13张图片
执行下列命令,将peer加入channel。

peer channel join -b mychannel.block

可以看到,当前peer添加到名称为mychannel的channel中。
在这里插入图片描述
依次执行下列命令可以切换不同的peer进行加入channel的动作。主要是改变环境变量的值。

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org1.lfl.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer1.org1.lfl.com/tls/ca.crt peer channel join -b mychannel.block

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.lfl.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt peer channel join -b mychannel.block

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt peer channel join -b mychannel.block

4 链码的打包、安装、初始化

4.1 链码打包

执行下列命令,进行链码的打包处理。

peer chaincode package -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go  mychaincode.package

链码包的名称mychaincode,版本1.0,包文件mychaincode.package,链码源文件路径github.com/chaincode/chaincode_example02/go(该处是容器内$GOPATH/src的相对路径)。当前目录下存在mychaincode.package文件。
搭建fabric1.4.1 自定义byfn例子_第14张图片

4.2 安装链码

执行下列命令,进行链码安装,链码可以不安装到所有peer节点,主要在endorsing peer上发挥作用。

peer chaincode install mychaincode.package

在这里插入图片描述
安装成功。
执行下列命令,依次在其他peer节点上进行链码安装。

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org1.lfl.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer1.org1.lfl.com/tls/ca.crt peer chaincode install mychaincode.package

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.lfl.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt peer chaincode install mychaincode.package

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt peer chaincode install mychaincode.package

4.3 初始化链码到channel

执行下列命令,将安装的链码初始化到channel上,相同的链码在同一个channel上只能初始化一次。

peer chaincode instantiate -o orderer.lfl.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/lfl.com/orderers/orderer.lfl.com/msp/tlscacerts/tlsca.lfl.com-cert.pem -C mychannel -n mychaincode -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

设置初始化参数 a=100,b=200 背书策略 -P “AND (‘Org1MSP.peer’,‘Org2MSP.peer’)” 需要Org1和Org2两个peer组织中的任意一个peer同时认可这笔交易,交易才算生效。
在这里插入图片描述
初始化成功后,容器列表会多出来一个名称为dev-peer0.org1.lfl.com-mychaincode-1.0的容器。

5 链码的相关调用

5.1 查询操作

执行下列命令,进行参数a,b初始值的查询。

peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","b"]}'

在这里插入图片描述

5.2 更新操作

当前peer节点是peer0.org1,进行更新操作a转给b 10。
查看当前节点

echo $CORE_PEER_ADDRESS

在这里插入图片描述

peer chaincode invoke -o orderer.lfl.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/lfl.com/orderers/orderer.lfl.com/msp/tlscacerts/tlsca.lfl.com-cert.pem -C mychannel -n mychaincode --peerAddresses peer0.org1.lfl.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer0.org1.lfl.com/tls/ca.crt --peerAddresses peer0.org2.lfl.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'

在这里插入图片描述
执行更新操作的时候,同时向peer0.org1、peer0.org2这两个peer节点发送交易提议,会在这两个peer节点上进行模拟交易,所以此时容器又增加一个dev-peer0.org2.lfl.com-mychaincode-1.0。

5.3 再次查询

执行下列命令切换peer节点到peer1.org2

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt 

在peer1.org2节点上查询a、b的值

peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","b"]}'

搭建fabric1.4.1 自定义byfn例子_第15张图片
新启动了一个名称为dev-peer1.org2.lfl.com-mychaincode-1.0的容器。
在这里插入图片描述

你可能感兴趣的:(初学fabric)