深度学习
在同一个区块链上可以部署多个链码,链码与链码之间可以相互调用。这种方式有助于将智能合约的工作模块化,并为应用开发带来更多灵活性。
本节将通过一个示例介绍如何在链码中调用其他链码,详细代码可见examples/chaincode/go/passthru/passthru.go。
该链码的功能可以形容为同一个区块链中其他链码的“网关”,其对外暴露的Invoke接口功能可以使用户指定想要调用的其他链码的ID、方法和参数,通过该“网关”链码传递给指定链码,获得调用结果后再返回给用户。
这里对最核心的Invoke方法进行分析,其核心实现代码如下:
func (p *PassthruChaincode) iq(stub shim.ChaincodeStubInterface, function string, args []string) pb.Response { if function == "" { return shim.Error("Chaincode ID not provided") } chaincodeID := function return stub.InvokeChaincode(chaincodeID, util.ToChaincodeArgs(args...), "") } func (p *PassthruChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { function, args := stub.GetFunctionAndParameters() return p.iq(stub, function, args) }
调用其他链码需要使用stub.InvokeChaincode方法。该方法用于调用另一个链码中的Invoke方法, 格式为InvokeChaincode(chaincodeName string,args[][]byte,channel string)pb.Response,其中chaincodeName为链码ID,args为调用参数,channel为调用的链码所在通道。如果 channel为空,则默认为当前通道。
需要注意,stub.InvokeChaincode方法目前仅限于读操作,同时不会生成新的交易。
示例中,将Invoke的参数原封不动传递给iq方法,其中function的值表示想要调用的链码的ID。
iq方法以链码ID、调用参数(需要用"github.com/hyperledger/fabric/common /util"的To-ChaincodeArgs方法将[]string类型转换为[][]byte类型)、默认当前通道为参数,通过Invoke- Chaincode来完成对另一个链码的调用,并返回结果。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=892
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区