我在基于JS / Node的链码中使用以下依赖项:
查询我的分类帐。该代码看起来像:
'use strict';
const { Contract } = require('fabric-contract-api');
const shim = require('fabric-shim');
...
class ThingsChainCode extends Contract {
async queryThing(ctx, id) {
const thingAsBytes = await ctx.stub.getState(id);
if (!thingAsBytes || thingAsBytes.length === 0) {
throw new NotFoundError(`${id} does not exist`);
}
return thingAsBytes.toString('utf8');
}
async updateThing(ctx, id, jsonData) {
await ctx.stub.putState(id, Buffer.from(jsonData));
var succMesg = `${id} updated`;
retVal = shim.success(succMesg);
}
}
不幸的是,状态验证器有时会不时(当一批中存在并发读取/写入操作时)将其标记为无效。原因码指出“ MVCC_READ_CONFLICT”。此时的问题是not这些错误的原因是什么。相反,我想抓住错误。就像在基于go的链码中一样,这似乎很简单:Hyperledger Fabric Chaincode throws MVCC_READ_CONFLICT
JS中没有引发执行或返回错误。我没有发现任何代码示例,还有进一步的错误处理:https://fabric-shim.github.io/release-1.4/index.html
所以问题是如何使用基于JS / Node的链码捕获事务错误?
非常感谢!
MVCC_READ_CONFLICT在验证时发生,而不是在执行链代码时在提案模拟期间发生。因此,就此而言,使用哪种语言编写chaincode实现都无关紧要。
要确定事务是否未通过验证,从而被标记为无效,您需要侦听事务事件并检查以查看尝试提交的事务的状态。我假设您将在此处使用node作为客户端语言,并建议您使用fabric-network npm软件包,该软件包为您内置了事务处理功能。您何时在合同实例上提交事务,如果由于说MVCC_READ_CONFLICT而导致事务提交失败,则会引发错误。
建议您查看使用结构网络api(有时称为高级api而不是低级api的各种超账结构文档(例如https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/application.html)和超账结构示例)