在第5章中,我们已经介绍过,不同链的账本数据和状态数据等都是物理隔离或者逻辑隔离的。对于同一个链不同链码的状态 数据,会按链码名称生成不同前缀的键,对状态数据进行逻辑隔离。不同的链码实现不同的业务逻辑,是可以相互调用的。调用的方法通过 shim.InvokeChaincode:
InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response
其中,chaincodeName是被调用链码的名称,链码名称可以指定版本,比如mycc:1.0这样的形式,args是被调用链码的参数,channel是被调用链码的通道名称,默认调用的是同一个链的链码。链码名称会规范化处理,生成的链码名称是:
chaincodeName:chaincodeVersion/channelName
其中的链码版本chaincodeVersion和通道名称channelName都是可选的,对应的分隔符也是可选的,所以链码名称可能有如下几种组合,如表9-10所示。
表9-10 链码相互调用的名称列表
从上面链码的规范化名称,我们可以看到,链码的相互调用分为以下两种情况:
·同一个链的链码相互调用;
·不同链的链码相互调用。
同一个链或者不同链的调用流程是基本一样的,调用shim.InvokeChaincode后会构造一个类型为 ChaincodeMessage_INVOKE_CHAINCODE的ChaincodeMessage,消息是通过链码和背书节点之间的gRPC连接 直接提交给背书节点的有限状态机处理的,不是通过背书节点接收Proposal的背书流程。背书节点对链码相互调用的处理过程如图9-9所示。
不同链的链码相互调用不同的地方在于会生成一个新的交易模拟器TxSimulator,实现对被调用链数据的访 问,最终生成交易的读写集只会包含调用链的数据,并不会修改被调用链的状态数据。如果是调用相同链的链码,会复用相同的交易模拟器 TxSimulator,链码执行的结果会修改最终的状态数据。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=1055