环境
fabric : 2.5
docker :20
ubuntu: 20
docker-compose : 2.19
go 1.17
安装fabric
我们需要创建一个fabric 环境 [前提: docker和docker-compose 需要提前安装好]
在命令行输入此 命令执行,下载fabirc相关文件和docker镜像
curl -sSL https://bit.ly/2ysbOFE | bash -s
若网络不行,可以打开网址 https://bit.ly/2ysbOFE
,然后将其全部代码保存在本地的一个.sh 文件,然后执行
脚本帮我们下载了一个fabirc-sample和fabric 的二进制文件, 还有下载了fabric相关的docker镜像
root@192-168-19-133:/yijiu/fabricfile/fabric-samples# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-tools 2.5 b2f3af4021be 3 weeks ago 551MB
hyperledger/fabric-tools 2.5.4 b2f3af4021be 3 weeks ago 551MB
hyperledger/fabric-tools latest b2f3af4021be 3 weeks ago 551MB
hyperledger/fabric-peer 2.5 4f8d1b54d8b0 3 weeks ago 135MB
hyperledger/fabric-peer 2.5.4 4f8d1b54d8b0 3 weeks ago 135MB
hyperledger/fabric-peer latest 4f8d1b54d8b0 3 weeks ago 135MB
hyperledger/fabric-orderer 2.5 7a73187b5c49 3 weeks ago 106MB
hyperledger/fabric-orderer 2.5.4 7a73187b5c49 3 weeks ago 106MB
hyperledger/fabric-orderer latest 7a73187b5c49 3 weeks ago 106MB
hyperledger/fabric-ccenv 2.5 6dac93f94c87 3 weeks ago 656MB
hyperledger/fabric-ccenv 2.5.4 6dac93f94c87 3 weeks ago 656MB
hyperledger/fabric-ccenv latest 6dac93f94c87 3 weeks ago 656MB
hyperledger/fabric-baseos 2.5 3854817b987d 3 weeks ago 122MB
hyperledger/fabric-baseos 2.5.4 3854817b987d 3 weeks ago 122MB
hyperledger/fabric-baseos latest 3854817b987d 3 weeks ago 122MB
grafana/grafana latest d09b57894d6e 5 weeks ago 329MB
mysql 5.7 2be84dd575ee 2 months ago 569MB
hyperledger/fabric-ca 1.5 8446b174e2a9 5 months ago 209MB
hyperledger/fabric-ca 1.5.6 8446b174e2a9 5 months ago 209MB
hyperledger/fabric-ca latest 8446b174e2a9 5 months ago 209MB
配置fabric
将fabric-sample目录下的bin目录里面的二进制文件复制到usr/local/bin目录下的文件中
oot@192-168-19-133:/yijiu/fabricfile/fabric-samples/bin# ls
configtxgen cryptogen fabric-ca-client ledgerutil osnadmin
configtxlator discover fabric-ca-server orderer peer
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/bin# cp * /usr/local/bin/
这样可以在全局使用这些二进制文件
运行测试网络
- 进入文件的test-network文件夹下
- 启动测试网络
./network.sh up
- 若之前有运行过测试网络,需要运行
./network.sh down
命令删除先前运行的所有容器或工程
运行结果
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/test-network# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e70aa7a15cdc hyperledger/fabric-tools:latest "/bin/bash" 19 seconds ago Up 17 seconds cli
1678c1d7ecf3 hyperledger/fabric-peer:latest "peer node start" 19 seconds ago Up 17 seconds 0.0.0.0:9051->9051/tcp, :::9051->9051/tcp, 7051/tcp, 0.0.0.0:9445->9445/tcp, :::9445->9445/tcp peer0.org2.example.com
6c343d140121 hyperledger/fabric-peer:latest "peer node start" 19 seconds ago Up 17 seconds 0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:9444->9444/tcp, :::9444->9444/tcp peer0.org1.example.com
078a340cf7de hyperledger/fabric-orderer:latest "orderer" 19 seconds ago Up 17 seconds 0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 0.0.0.0:7053->7053/tcp, :::7053->7053/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp orderer.example.com
有一个orderer 和两个peer 节点容器
- 接下来创建一个channel 通道
./network.sh createChannel
这个命令可以加 -c … 后面可以自定义通道名,若不加 -c 则使用默认通道名createChannel
结果
+ configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output Org2MSPanchors.tx
2023-08-30 01:58:17.162 UTC 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2023-08-30 01:58:17.173 UTC 0002 INFO [channelCmd] update -> Successfully submitted channel update
Anchor peer set for org 'Org2MSP' on channel 'mychannel'
Channel 'mychannel' joined
- 创建通道完成后,就可以在其环境部署链码【这里我们使用go语言】
部署链码的命令
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
–ccn 是链码名, --ccp是链码路径 --ccl 是链码语言
但是我们部署之前 ,我们在../asset-transfer-basic/chaincode-go
目录里 ,发现这个go项目依赖还没有导入
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/asset-transfer-basic/chaincode-go# ll
总用量 140
drwxr-xr-x 3 root root 4096 8月 29 16:43 ./
drwxr-xr-x 17 root root 4096 8月 29 16:43 ../
-rw-r--r-- 1 root root 530 8月 29 16:43 assetTransfer.go
drwxr-xr-x 3 root root 4096 8月 29 16:43 chaincode/
-rw-r--r-- 1 root root 1574 8月 29 16:43 go.mod
-rw-r--r-- 1 root root 121771 8月 29 16:43 go.sum
所以我们需要执行 go mod vendor
,导入依赖包
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/asset-transfer-basic/chaincode-go# ll
总用量 144
drwxr-xr-x 4 root root 4096 8月 30 10:04 ./
drwxr-xr-x 17 root root 4096 8月 29 16:43 ../
-rw-r--r-- 1 root root 530 8月 29 16:43 assetTransfer.go
drwxr-xr-x 3 root root 4096 8月 29 16:43 chaincode/
-rw-r--r-- 1 root root 1574 8月 29 16:43 go.mod
-rw-r--r-- 1 root root 121771 8月 29 16:43 go.sum
drwxr-xr-x 6 root root 4096 8月 30 10:04 vendor/
可以看到vendor依赖已经导入进来
然后回到test-network目录,执行上面部署链码的命令
结果
Chaincode definition committed on channel 'mychannel'
Using organization 1
Querying chaincode definition on peer0.org1 on channel 'mychannel'...
Attempting to Query committed status on peer0.org1, Retry after 3 seconds.
+ peer lifecycle chaincode querycommitted --channelID mychannel --name basic
+ res=0
Committed chaincode definition for chaincode 'basic' on channel 'mychannel':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
Query chaincode definition successful on peer0.org1 on channel 'mychannel'
Using organization 2
Querying chaincode definition on peer0.org2 on channel 'mychannel'...
Attempting to Query committed status on peer0.org2, Retry after 3 seconds.
+ peer lifecycle chaincode querycommitted --channelID mychannel --name basic
+ res=0
Committed chaincode definition for chaincode 'basic' on channel 'mychannel':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
Query chaincode definition successful on peer0.org2 on channel 'mychannel'
Chaincode initialization is not required
与fabric网络进行交互
前置: 我们需要将两个配置文件路径导入
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
- 我们先用org1 来操作peer
导入组织1的环境
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export 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
官方解释
CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。 如果您使用 ./network.sh deployCC -ccl go 安装和启动 asset-transfer (basic) 链码,您可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产(如果使用 typescript 或者 javascript,例如 ./network.sh deployCC -l javascript,你会调用相关链码的 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":[]}'
结果
2023-08-30 10:25:47.999 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200
查询账本
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/test-network# peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}]
在链上进行转账操作
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":"TransferAsset","Args":["asset6","Christopher"]}'
同理可以使用org 2 进行操作
前提也需要导入组织环境
组织2的环境
# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
然后执行链上操作
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
关闭fabric网络
./network.sh down
可以看到fabric的容器网络已经全部停止了
root@192-168-19-133:/yijiu/fabricfile/fabric-samples/test-network# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
结语
本篇文章知识作为入门操作使用,并没有过多的解释fabric命令的操作用意和参数的作用,有需要可以去官网查看命令详解fabric
后期有空我也会考虑写fabric的具体使用文章