fabric chaincode 同一channel 与不同channel 间相互调用区别

新项目中需要进行chaincode开发工作。并且可能需要chaincode 间互相调用的操作。这里记录一下我的调研过程。

首先问题

1:chaincode 间是否可以互相调用,是从fabric 哪个版本开始支持,最新版是否支持?

2:chaincode 间互相调用的边界?如,是否支持不同channel 间的chaincode调用?还是只支持同一channel 里的chaincode 调用?

3:chaincode 间的调用是否支持写操作?

 

基于以上三个问题,开始探索之路。

首先利用百度,检索chaincode 间调用的博客。发现还是有很多的文章,这里放一些我看的文章地址:

https://blog.csdn.net/xiaohuanglv/article/details/89033472

通过上面一个文章我们可以发现几乎已经回答了我们所有的问题。1:chaincode 间可以相互调用,笔者当前使用的是fabric1.4 TLS(版本),支持chaincode 间相互调用。2:chaincode 支持不同channel 间与同一channel 间的相互调用。3:不同chaincode 间的相互调用不能执行写操作。同一chaincode 间的调用支持写操作。(也就是会修改最终的状态数据库,我还是喜欢叫世界状态)

接着我们需要查看fabric 官方文章的介绍。

官方文章笔者没有找到,对invokechaincode 的内容介绍。暂不说明

最后就是我们实际操作,以及源码研究了。

先简单曝一下InvokeChaincode 接口的介绍,接口文件在fabric/core/chaincode/shim/interface.go

    // InvokeChaincode locally calls the specified chaincode `Invoke` using the
	// same transaction context; that is, chaincode calling chaincode doesn't
	// create a new transaction message.
	// If the called chaincode is on the same channel, it simply adds the called
	// chaincode read set and write set to the calling transaction.
	// If the called chaincode is on a different channel,
	// only the Response is returned to the calling chaincode; any PutState calls
	// from the called chaincode will not have any effect on the ledger; that is,
	// the called chaincode on a different channel will not have its read set
	// and write set applied to the transaction. Only the calling chaincode's
	// read set and write set will be applied to the transaction. Effectively
	// the called chaincode on a different channel is a `Query`, which does not
	// participate in state validation checks in subsequent commit phase.
	// If `channel` is empty, the caller's channel is assumed.

/*
我是翻译:
InvokeChaincode使用相同的事务上下文在本地调用指定的chaincode“Invoke”;也就是说,
调用chaincode不会创建新的事务消息。如果调用的chaincode在相同的通道上,它只需将调用的chaincode读集和写集添加到调用事务中。
如果被调用的链码位于不同的通道上,则只向调用的链码返回响应;任何来自被调用链码的PutState调用都不会对分类帐产生任何影响;也就是说,
在不同的通道上调用的chaincode不会将其读集和写集应用于事务。只有调用链码的读集和写集将应用于事务。实际上,
不同通道上被调用的chaincode是一个“查询”,它不参与后续提交阶段的状态验证检查。如果“channel”为空,则假定调用方的channel为空。
*/
InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response

 

你可能感兴趣的:(hyperledger)