Hyperledger Fabric:如何在JS / Node中使用链码捕获事务错误?

我在基于JS / Node的链码中使用以下依赖项:

  • “ fabric-contract-api”:“〜1.4.0”,
  • “ fabric-shim”:“〜1.4.0”

查询我的分类帐。该代码看起来像:

'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”。此时的问题是是什么原因导致这些错误。相反,我想抓住错误。就像在基于go的链式代码中一样,这似乎很简单:Hyperledger Fabric Chaincode throws MVCC_READ_CONFLICT

在JS中没有引发执行或返回错误。我没有发现任何代码示例,还有进一步的错误处理:https://fabric-shim.github.io/release-1.4/index.html

所以问题是如何使用基于JS / Node的链码捕获事务错误?

非常感谢您!

yhwx_88 回答:Hyperledger Fabric:如何在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)和超账结构示例。

本文链接:https://www.f2er.com/3101345.html

大家都在问