Fabric链码调用实践

随手记录下Fabric的链码部署调用,

仓库地址:

fabric-samples/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go at main · hyperledger/fabric-samples (github.com)​github.com/hyperledger/fabric-samples/blob/main/asset-transfer-basic/chaincode-go/chaincode/smartcontract.goicon-default.png?t=N7T8https://link.zhihu.com/?target=https%3A//github.com/hyperledger/fabric-samples/blob/main/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go

参考将智能合约部署到通道 — hyperledger-fabricdocs master 文档

1.启动网络并创建通道

./network.sh up 
./network.sh creatChannel

2.使用peer创建链码包,命令参考peer lifecycle chaincode — hyperledger-fabricdocs master 文档

确保链码包已经被打包(go mod vendor),并检查可以使用peer cli(peer version)

peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0

此时目录下会生成一个basic.tar.gz文件

3.安装链码

因为测试网络中有两个组织,所以此后的所有操作都需要指定不同组织的管理员操作,即通过设置环境变量保证当前有足够的权限和身份操作命令。

例如设置Org1的环境变量

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

再安装,此操作将在Org1上安装链码

peer lifecycle chaincode install basic.tar.gz

Org2同理,操作如图

4.批准链码定义

首先查询此时的包ID,类似合约地址

peer lifecycle chaincode queryinstalled

将获取的包ID设置为环境变量,根据实际包ID替换

export CC_PACKAGE_ID=basic_1.0:3cfcf67978d6b3f7c5e0375660c995b21db19c4330946079afc3925ad7306881

此时的组织环境变量仍是Org2,所以直接运行此命令

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

同理重新设置环境变量回到Org1,再批准一次,操作如图

此时可以检查该链码的批准定义,显示两个组织

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json

5.提交链码定义到通道

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --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"

可以通过此部署命令部署,本质是对以上五步的封装操作,通过脚本封装了以上手动命令

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

例如,此图是运行过程的部分截图,绿色部分它分别完成了链码的打包,链码在两个组织的安装,和组织1批准

6.调用链码

本质就是使用peer chaincode,写就是invoke,读就是query

(1)使用peer chaincode invoke命令调用链码中的InitLedger函数,此函数将向账本写入预先定义的资产列表,返回状态码200,invoke成功

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":[]}'

(2) 使用peer chaincode query命令调用链码通过GetAllAssets函数查询账本中所有资产的信息,命令如下:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

(3)使用peer chaincode invoke命令调用链码的TransferAsset函数将资产asset6转移给Johney,命令如下:

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","Johney"]}'

(4)执行peer chaincode query命令调用链码的ReadAsset函数查看资产asset6的详细信息,命令如下:

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃哧哧·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值