扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要介绍Fabric2.0中如何实现链码管理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都工商代办小微创业公司专业提供成都企业网站建设营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。
Fabric-sample工程自带了很多示例链码,位于fabric-samples/chaincode目录中,本文测试安装abstore工程的go版本到org1.peer0和org2.peer0两个节点。
链码安装成功之后,就可以调用链码完成交易操作了。
安装链码的所有操作均需要先进入cli容器,执行如下命令:
docker exec -it cli bash
链码打包执行如下命令:
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1
abs.tar.gz:打包合约包文件名
--path:智能合约路径
--lang:智能合约语言,支持golang、Java、node
--label:智能合约标签,起描述作用
执行成功之后,当前目录下将生成文件abs.tar.gz。
本节将把上述打包的代码安装到org1.peer0和org2.peer0两个节点上,因此需要切换环境变量。
通过命令查看当前使用的是org1.peer0的环境。
执行链码安装命令,则可以把上述打包的合约代码安装到org1.peer0节点上。
peer lifecycle chaincode install abs.tar.gz
执行结果如下:
查看安装结果,执行命令:
peer lifecycle chaincode queryinstalled
接下来为org2.peer0安装智能合约代码,执行如下命令切换环境变量:
source scripts/utils.sh setGlobals 0 2
查看切换结果,如下图所示:
执行链码安装命令,则可以把上述打包的合约代码安装到org2.peer0节点上。
peer lifecycle chaincode install abs.tar.gz
链码安装完成之后需要被组织认证,认证通过之后才能将链码提交并运行,该过程又可以称为合约定义,定义了合约的名称、版本、序列号,后续合约升级即修改版本或序列号,重新定义合约。
执行如下代码,完成当前节点所在组织对上述安装链码的认证。
peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6 --sequence 1 --waitForEvent
参照上节的方法切换环境,实现org2组织对上述安装链码的认证。
最后查看链码认证结果,执行如下命令:
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 1 --output json --init-required
上图结果表示:通道mychannel中的两个组织Org1和Org2均已对智能合约链码abs认证通过。
只有通过组织认证的链码才能被提交。执行如下命令提交链码:
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
查看提交结果,执行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
链码调用主要包括invoke和query两个操作,本节将演示智能链码数据初始化、数据查询以及数据更新。
执行如下命令调用链码初始化方法,并指定初始化参数和值。
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}'
执行如下命令查询参数a的值。
peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'
执行如下命令调用合约的invoke方法,实现参数a的值减少10,参数b的值增加10。
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
执行结果如下图所示:
链码(合约)升级的关键之处在于合约定义,即4.1.3节的链码认证。升级链码之后将重新定义合约,修改合约的版本号或者序列号。
巧妇难为无米之炊。升级链码的第一步应该是获取合约代码,获取合约代码有两种方式:
根据4.1.1节链码打包命令参数--path指定的路径获取代码;
通过peer脚本获取已安装的合约代码包,执行如下命令:
#查看已安装的合约代码包,获取对应包的package-id值 peer lifecycle chaincode queryinstalled
执行结果如下图所示:
#下载指定合约代码包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6
执行结果如下图所示:
上图中,我们可以看到当前目录下多了一个以package-id值命名的压缩文件,重命名该文件为abs.tar.gz,通过tar命令查看该压缩包包含一个json文件和一个压缩包。Json文件是对压缩包的描述,code.tar.gz则是合约源码,是我们本次的修改目标,将该包解压之后我们继续接下来的操作。
假设大家已经把下载的合约源码包解压了,或者找到了样例自带源码的路径,接下来开始修改合约代码。
本次修改目标文件为:abstore.go,增加一个Add函数,具体内容如下:
func (t *ABstore) Add(ctx contractapi.TransactionContextInterface, A string, X int) error { var err error //Get the state from the leger Avalbytes, err := ctx.GetStub().GetState(A) if err != nil { return fmt.Errorf("Failed to get state for " + A) } if Avalbytes == nil { return fmt.Errorf("Nil amount for " + A) } var Aval int Aval, _ = strconv.Atoi(string(Avalbytes)) Aval = Aval + X // Write the state back to the ledger err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return err } return nil }
修改后的文件内容如下图所示:
代码修改完成之后,重新打包,执行如下命令:
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1
执行完成之后请自行检测当前目录是否生成代码包。
# 安装链码 peer lifecycle chaincode install abs.tar.gz # 查询链码安装结果 peer lifecycle chaincode queryinstalled
执行结果如下图所示:
上图结果表示:通道mychannel中的两个组织Org1和Org2对新打包的智能合约认证通过。
重新提交合约与4.1.4节链码提交使用相同的命令,唯一不同的就是sequence参数值为2。
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
查看提交结果,如下图所示:
从上图的执行结果来看,a的原值为90,调用add方法给a值增加30,再次查询a的值为120,说明合约更新成功,新增的方法也调用成功。
之前的操作仅在org1.peer0和org2.peer0两个节点上安装并升级了链码,org1.peer1和org2.peer1两个节点未安装链码。当运行基于Fabric SDK编写的Java代码时,调用查询方法失败,报错“abs链码未安装”,应该是客户端把请求发到了未安装链码的两个节点,基于此原因,补充本节内容。
补充安装链码的步骤如下:
(1) 从已安装的peer节点获取安装包
# 下载链码包 peer lifecycle chaincode getinstalledpackage --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 # 重命名链码包 mv abs_1\:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7.tar.gz abs.tar.gz
(2)在org1.peer1和org2.peer1节点上安装链码
# 切换环境到org1.peer1 source scripts/utils.sh setGablobs 1 1 # 执行安装命令 peer lifecycle chaincode queryinstalled setGablobs 1 2 # 执行安装命令 peer lifecycle chaincode queryinstalled
(3) 获得org1和org2两个组织的认证
本过程最重要的是注意sequence参数值,该值必须在sequence最新值上增加1,查询该链码最新的sequence值,执行如下命令:
peer lifecycle chaincode querycommitted --channelID mychannel --name abs
假如链码abs的sequence最新值为2,则获取组织认证命令如下:
peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 --sequence 3 --waitForEvent
切换到另外1个组织的任意节点,执行上述相同的命令。
最后查看认证结果,必须两个组织都认证通过才行。
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 3 --output json --init-required
(4) 提交链码
提交代码同样需要注意修改sequence参数即可,命令如下:
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 3 --init-required
当org1.peer1和org2.peer1两个节点成功安装链码之后,ContractAPI的样例代码才能运行成功,如果还是有问题,则需要检查证书文件。
以上是“Fabric2.0中如何实现链码管理”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流