Hyperledger fabric 为什么Hyperledger Fabric 1.0中的链码不能同时调用?

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/

注册、安装和实例化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/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

我用不同的论点测试了好几次。此外,我还测试了其他链码。链码似乎只接受第一个调用请求,并丢弃后续的调用请求。因此,问题是:

  • 这是防止双重开支的机制吗?还是仅仅是一个弱点
  • 如何解决这个限制交易率的问题
  • 我认为链码应该支持并发调用。链码实际上可以支持并发调用吗
  • 单个链码能否在单个块周期内调用多个请求

  • 链码需要进行背书,然后在下一次调用之前将其提交到分类账状态

    当您调用对等链码调用…时,结构会在背书完成后快速响应。但是提交仍然需要一些时间。如果在第一次调用之后直接运行第二次调用,则第二次调用将被正确地认可,但不会发生提交

    因此,对于您的问题:

  • 您可以尝试通过JavaSDK或NodeSDK调用链码。以javasdk为例,进度是首先将transactionProposalRequest发送到chaincode,这是fabric中的认可过程。完成背书后,您的背书政策正确通过。该事务由sdk客户端发送给fabirc,该API将返回一个
    CompletableFuture
    ,类似于js中的承诺。事务完成后,将触发CompletableFuture.thenApply()。例如,您可以检查src/test/java/org.hyperledger.fabric.sdkintergration/End2endIT.java

  • 您可以在链码中编写批处理。这可以同时支持多个调用和查询,在一定程度上解决了您的问题。该批处理的设计如下:在cc中新建一个
    m映射[string]string
    toDelete[]string
    ,调用时将密钥/val对放入
    m
    ,查询时首先从
    m
    获取密钥/val,如果找不到,则从存根中查询,删除要求时,从
    m
    中删除,并将键置于
    toDelete
    ,完成所有要求后,立即提交
    m
    toDelete
    中的所有数据。我在我的项目中尝试了这种机制,效果很好

  • 区块链不是为高并发性而设计的。它是为保密性、可扩展性和安全性而设计的

  • 见2


  • 链码需要进行背书,然后在下一次调用之前将其提交到分类账状态

    当您调用对等链码调用…时,结构会在背书完成后快速响应。但是提交仍然需要一些时间。如果在第一次调用之后直接运行第二次调用,则第二次调用将被正确地认可,但不会发生提交

    因此,对于您的问题:

  • 您可以尝试通过JavaSDK或NodeSDK调用链码。以javasdk为例,进度是首先将transactionProposalRequest发送到chaincode,这是fabric中的认可过程。完成背书后,您的背书政策正确通过。该事务由sdk客户端发送给fabirc,该API将返回一个
    CompletableFuture
    ,类似于js中的承诺。事务完成后,将触发CompletableFuture.thenApply()。例如,您可以检查src/test/java/org.hyperledger.fabric.sdkintergration/End2endIT.java

  • 您可以在链码中编写批处理。这可以同时支持多个调用和查询,在一定程度上解决了您的问题。该批处理的设计如下:在cc中新建一个
    m映射[string]string
    toDelete[]string
    ,调用时将密钥/val对放入
    m
    ,查询时首先从
    m
    获取密钥/val,如果找不到,则从存根中查询,删除要求时,从
    m
    中删除,并将键置于
    toDelete
    ,完成所有要求后,立即提交
    m
    toDelete
    中的所有数据。我在我的项目中尝试了这种机制,效果很好

  • 区块链不是为高并发性而设计的。它是为保密性、可扩展性和安全性而设计的

  • 见2


  • 从织物的角度来看,这实际上是正常的行为——尽管首先看起来有点违反直觉

    从逻辑上讲,您所看到的情况是根据(+知道在批处理超时的订购方上执行了一些批处理)。假设在模拟(背书)过程中,变量A被读取,然后被链码模拟标记为重新设置。读取了什么值以及您希望变量集成为拟定交易一部分的值(+背书人是否接受交易+加密内容)。然后我们通过提交给订购方+分销给渠道同行+渠道同行检查(除其他外)提案的原始“读取值假设”是否仍然有效。(见5.:参考对等方的验证