Fabric━━测试环境
根据官方教程,使用Hyperledger Fabric Samples搭建测试环境,记录可能出现的问题
下载
如下cURL 命令设置您的环境,以便运行 Fabric 测试网络。具体来说,它将执行以下步骤:
-
下载最新的 Hyperledger Fabric Docker 镜像并将它们标记为
latest
-
将以下特定于平台的 Hyperledger Fabric CLI 工具二进制文件和配置文件下载到
fabric-samples
中/bin
和/config
目录中,这些二进制文件将帮助您与测试网络进行交互-
configtxgen
-
configtxlator
-
cryptogen
-
discover
-
idemixgen
-
orderer
-
osnadmin
-
peer
-
fabric-ca-client
-
fabric-ca-server
-
只需要执行:Install Fabric and Fabric Samples
curl -sSL https://bit.ly/2ysbOFE | bash -s
使用特定的版本:
curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version>
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.3.3 1.5.2
目录介绍
如果使用了其他版本,测试可能出现问题。例如docker-compose版本可能导致配置问题 解决方法,以及命令行参数chainID不一致。使用2.3.3版本二进制工具和samples最新版本运行没有问题。
直接使用Fabric Samples的main分支即可,fabric-samples目录
目录 | 说明 |
---|---|
bin |
下载的工具二进制文件(加入环境变量) |
config |
下载的配置文件,关于orderer和peer配置信息 |
chaincode | 示例的链码目录 |
asset-transfer-basic | 示例使用的链码和应用程序 |
test-network | 基于docker-compose的测试网络,两个组织peer和一个排序服务节点 |
test-network-k8s | 使用k8s的示例 |
... |
启动测试网络
测试网络包含:
- 两个peer组织,每个只有一个peer节点;
- 一个Raft排序节点;
- 没有部署CA,所有证书使用root CA颁发;
- 测试网络使用Docker Compose部署
进入./test-network
目录:
./network.sh -h # 查看基本命令
启动peer节点和ordering节点
./network.sh up
默认创建两个peer节点和一个ordering节点,默认使用cryptogen
;每个节点或者用户都必须属于某一个组织,才能和Fabric网络进行交互。
说明:
- Peer节点是基本组件,负责存储区块链账本,在将交易提交账本前验证其合法性,执行包含业务逻辑的智能合约/链码;每个Peer节点都属于一个组织
- Fabric网络包含一个
排序服务
,负责就交易的顺序达成共识以及生成区块;test-network
使用单个节点的Raft ordering service
,属于orderer organization
. 实际环境可能使用多个组织的多个排序节点
创建通道
通道channel是特定的网络成员的通信私有层,每个通道具有单独的区块链账本。简单来说:如果某个组织加入通道,就是属于它的peer节点存储该通道的账本,并且验证该通道上的交易
./network.sh createChannel -c mychannel
# Channel 'mychannel' joined
将org1和org2组织的节点加入了该通道
说明:遇到osnadmin: error: parsing arguments: unknown long flag '--channel-id'
修改:将./test-network/script/createChannel.sh
第40行长标志改为osnadmin channel join --channelID
部署链码
Fabric的信任模型,为了保证交易的合法性,使用智能合约创建的交易需要被多个组织签名(背书)才能提交到通道账本。要求多重背书,防止单个组织篡改同行的账本或者使用未达成一致的业务逻辑。
流程:为了签名交易,每个组织的节点需要调用和执行智能合约/链码,并且对交易的结果进行签名(模拟执行),如果结果一致并且得到足够多组织的签名,该交易该能提交到账本。指定该通道特定组织的集合来对交易签名,称为背书策略;背书策略是链码定义的一部分
链码需要安装到组织中peer节点,然后部署到整个通道:
./network.sh deployCC -c mychannel -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
注意:链码部署channel之前,通道成员需要对链码的定义达成一致;当要求的组织数量同意后,Chaincode definition committed on channel 'mychannel'
链码的定义会提交到通道账本,并且可以使用
与网络交互
peer
二进制工具可以与网络交互,调用链码,更新通道,部署新的链码。
配置变量:
# 当前目录 ./test-network
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
设置环境变量,允许作为Org1节点操作:
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
expor CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
初始化账本InitLedger
peer chaincode invoke -o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com --tls --cafile \
"${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
-C mychannel -n basic \
--peerAddresses localhost:7051 --tlsRootCertFiles \
"${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \
--peerAddresses localhost:9051 --tlsRootCertFiles \
"${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \
-c '{"function":"InitLedger","Args":[]}'
结果输出
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
说明:遇到error starting container: API error (404): network _test not found"
docker-compose
Version (+v1.28)导致读取.env
文件失败导致创建默认的docker_test
,修改:将182,253行
加入明确参数:
docker-compose --env-file ./.env
查询账本
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
关闭网络
停止并且删除节点容器,删除 organization crypto material
等
./network.sh down
理解
说明./network.sh up
的作用:
- 默认使用
cryptogen
和配置文件organizations/cryptogen
为3个组织生产证书和key - 使用
docker/docker-compose-test-net.yaml
文件启动peer和orderer节点 - 如果使用
createChannel
子命令,会运行scripts/createChannel.sh
来创建指定名称的通道,它会使用configtxgen
工具基于configtx/configtx.yaml
中的TwoOrgsApplicationGenesis
配置,生成通道的创世纪块。使用peer
将peer0.org1.example.com
andpeer0.org2.example.com
加入到通道,并且成为锚节点 - 如果使用
deployCC
子命令,会运行deployCC.sh
安装默认的 asset-transfer (basic) 链码到peer节点,然后部署到通道上。
Next
开发链码
- Go contract API and documentation.
- Node.js contract API and documentation.
- Java contract API and documentation.
开发App
- Node.js SDK and documentation.
- Java SDK and documentation.
- Go SDK and documentation.