fabric2.0链码操作
1、打包链码
链码在安装前需要打包为tar文件。我们可以使用peer命令,node sdk,或者第三方工具。
第三方的打包工具需要满足以下要求:
链码以tar.gz结尾;
tar文件需要包含2个文件(不是目录),元文件Chaincode-Package-Metadata.json和chaincode文件。
Chaincode-Package-Metadata.json文件长成下面这样。
{"Path":"fabric-samples/chaincode/fabcar/go","Type":"golang","Label":"fabcarv1"}
peer命令打包示例:
首先我们处理依赖问题:
cd fabric-sample/chaincode/fabcar/go
GO111MODULE=on go mod vendor
# peer0.org2
docker exec \
-e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
-e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
-e CORE_PEER_LOCALMSPID="Org2MSP" \
-e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
cli peer lifecycle chaincode install fabcar2.tar.gz
# peer0.org2
docker exec \
-e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
-e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
-e CORE_PEER_LOCALMSPID="Org2MSP" \
-e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
cli peer lifecycle chaincode queryinstalled
如果我们现在看下peer节点的日志,可以看到出了新块#3
两个机构都已经批准了链码,现在可以提交了。(这里暂时没想明白为什么为false)
4、向通道提交链码
链码提交可以在一个peer节点上完成:
docker exec cli peer lifecycle chaincode commit -o orderer.example.com:7050 \
--tls \
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
--channelID mychannel --name fabcar2 --version 1 --sequence 1 --init-required
可以看到出了新块#5:
注意我们在commit命令中已经包含了init所需的参数。
同样,我们可以使用querycommited命令来查看链码的提交状态:
docker exec cli peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar2
5、调用链码的Init方法
fabcar链码的Init方法需要首先调用。
docker exec cli peer chaincode invoke -o orderer.example.com:7050 \
--tls \
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses peer0.org1.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses peer0.org2.example.com:7051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
-C mychannel -n fabcar2 \
--isInit \
-c '{"function":"initLedger","Args":[]}'
6、调用链码方法并从另一个peer节点查询
和之前一样,我们在peer0.org1上调用链码的changeCarOwner()
方法,在peer0.org2上进行查询:
# peer0.org1
docker exec cli peer chaincode invoke \
> -o orderer.example.com:7050 \
> --tls \
> --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
> --peerAddresses peer0.org1.example.com:7051 \
> --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
> --peerAddresses peer0.org2.example.com:7051 \
> --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
> -C mychannel -n fabcar2 -c '{"function":"changeCarOwner","Args":["CAR9","zmcheng"]}'
# peer0.org2
docker exec \
-e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \
-e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
-e CORE_PEER_LOCALMSPID="Org2MSP" \
-e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
cli peer chaincode query -C mychannel -n fabcar2 -c '{"Args":["queryAllCars"]}'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-03-31 详解MySQL第三篇—DCL语句
2017-03-31 详解MySQL第二篇—DML语句
2017-03-31 详解MySQL第一篇—MySQL简要介绍及DDL语句
2017-03-31 MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL
2017-03-31 解析button和input type=”button”的区别
2017-03-31 转Hibernate Annotation mappedBy注解理解
2017-03-31 转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))