Fabric 2.5版本的第一个测试网络【入门篇】

环境
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的具体使用文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

已久依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值