Hyperledger fabric 为什么Hyperledger Fabric 1.0中的链码不能同时调用?
注册、安装和实例化chaincode结构/example/chaincode/go/chaincode\u example02后,我运行以下步骤Hyperledger fabric 为什么Hyperledger Fabric 1.0中的链码不能同时调用?,hyperledger-fabric,Hyperledger Fabric,注册、安装和实例化chaincode结构/example/chaincode/go/chaincode\u example02后,我运行以下步骤 peer chaincode instantiate --orderer orderer0:7050 --tls true --path example02 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/
peer chaincode instantiate --orderer orderer0:7050 --tls true --path example02 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem --chainID mychannel --name example02cc --version 1.0 --ctor '{"Args":["init","A","1000","B","2000"]}'
peer chaincode query --chainID mychannel --name example02cc --ctor '{"Args":["query","A"]}'
peer chaincode query --chainID mychannel --name example02cc --ctor '{"Args":["query","B"]}'
到目前为止,我确认A等于1000,B等于2000。之后,如果我以不同的时间调用下面的步骤,结果将是可变的
peer chaincode invoke --orderer orderer0:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem --chainID mychannel --name example02cc --ctor '{"Args":["invoke","A","B","1"]}'
具体来说,如果我以10秒的暂停运行上一步两次,A将等于998,B将等于2002。如果我在每一步之间暂停10秒,运行前一步10次,A将等于990,B将等于2010。但是,如果我运行上一步两次,A将等于999,B将等于2001。如果我在每一步之间不停顿地运行前一步十次,A将等于999,B将等于2001
我用不同的论点测试了好几次。此外,我还测试了其他链码。链码似乎只接受第一个调用请求,并丢弃后续的调用请求。因此,问题是:
链码需要进行背书,然后在下一次调用之前将其提交到分类账状态 当您调用对等链码调用…时,结构会在背书完成后快速响应。但是提交仍然需要一些时间。如果在第一次调用之后直接运行第二次调用,则第二次调用将被正确地认可,但不会发生提交 因此,对于您的问题:
CompletableFuture
,类似于js中的承诺。事务完成后,将触发CompletableFuture.thenApply()。例如,您可以检查src/test/java/org.hyperledger.fabric.sdkintergration/End2endIT.javam映射[string]string
和toDelete[]string
,调用时将密钥/val对放入m
,查询时首先从m
获取密钥/val,如果找不到,则从存根中查询,删除要求时,从m
中删除,并将键置于toDelete
,完成所有要求后,立即提交m
和toDelete
中的所有数据。我在我的项目中尝试了这种机制,效果很好链码需要进行背书,然后在下一次调用之前将其提交到分类账状态 当您调用对等链码调用…时,结构会在背书完成后快速响应。但是提交仍然需要一些时间。如果在第一次调用之后直接运行第二次调用,则第二次调用将被正确地认可,但不会发生提交 因此,对于您的问题:
CompletableFuture
,类似于js中的承诺。事务完成后,将触发CompletableFuture.thenApply()。例如,您可以检查src/test/java/org.hyperledger.fabric.sdkintergration/End2endIT.javam映射[string]string
和toDelete[]string
,调用时将密钥/val对放入m
,查询时首先从m
获取密钥/val,如果找不到,则从存根中查询,删除要求时,从m
中删除,并将键置于toDelete
,完成所有要求后,立即提交m
和toDelete
中的所有数据。我在我的项目中尝试了这种机制,效果很好从织物的角度来看,这实际上是正常的行为——尽管首先看起来有点违反直觉 从逻辑上讲,您所看到的情况是根据(+知道在批处理超时的订购方上执行了一些批处理)。假设在模拟(背书)过程中,变量A被读取,然后被链码模拟标记为重新设置。读取了什么值以及您希望变量集成为拟定交易一部分的值(+背书人是否接受交易+加密内容)。然后我们通过提交给订购方+分销给渠道同行+渠道同行检查(除其他外)提案的原始“读取值假设”是否仍然有效。(见5.:参考对等方的验证