我创建了一个链码,并将其部署在测试网络上。我从命令行调用事务。
peer chaincode invoke -C mychannel -n basic -c '{"function":"createStore","Args":["1","Target","Weyburn","false"]}'
peer chaincode invoke -C mychannel -n basic -c '{"function":"createCashDesk","Args":["1","1","false"]}'
peer chaincode invoke -C mychannel -n basic -c '{"function":"openStore","Args":["1"]}'
peer chaincode invoke -C mychannel -n basic -c '{"function":"openCashDesk","Args":["1"]}'
如果我同时运行这四个命令,通过使用"&"将它们连接起来,最后一个命令会抛出错误。
如果我一个接一个地运行命令,等待几秒钟,直到我看到命令输出,所有命令都可以正常运行。
我该如何调试这个问题?
我怀疑有一些同步或挖掘问题。是否有可能在第三个命令返回并输出时,数据没有完全同步,从而导致第四个命令进入坏状态,然后失败?
当我在开发以太坊链码时,我需要打开另一个终端并不断挖掘新的区块来提交以太坊链码调用。
在Hyperledger Fabric中,我如何停止挖掘以使交易请求在网络中保持待处理?
我建议将--waitForEvent
添加到每个调用命令中,否则您不会等待事务提交到分类帐,因此后续调用可能无法看到先前调用的结果
你应该把错误贴出来。
在这种情况下,我假设您正在尝试读取尚未提交的值。当块未提交时,世界状态不会更新。因此,嵌入到块中的事务不会在世界状态中更新。已经模拟了执行过程,但是还没有更新世界状态。因此,您正在尝试读取一个尚不存在的值。
您可以等待事务提交,然后再执行涉及同一文档的下一个操作。对于NodeJS SDK,这是这样执行的:https://hyperledger.github.io/fabric-sdk-node/release-2.2/tutorial-transaction-commit-events.html.
peer
命令仅用于"播放"。不完全确定,但我认为当peer
命令返回时,事务已经提交。但是您使用&
在后台启动命令,因此您不需要等待命令返回。
另一个相关的错误可能是MVCC_READ_CONFLICT
,关于同一块中相同文档的事务。文档可能存在,但是当试图提交并返回错误时,对等体检测到读/写集中的版本不匹配。
编辑
为了给出一个快速的解决方案,david_k建议指定--waitForEvent
并将命令与&&
连接,而不是&
。不管怎样,记住我以前告诉过你的话。