一次运行所有命令会抛出错误,而一个接一个地运行命令是可以的



我创建了一个链码,并将其部署在测试网络上。我从命令行调用事务。

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并将命令与&&连接,而不是&。不管怎样,记住我以前告诉过你的话。

最新更新