随手记录下Fabric的链码部署调用,
仓库地址:
参考将智能合约部署到通道 — 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"]}'