【问题标题】:Hyperledger Fabric: How to catch transaction errors with chaincode in JS/Node?Hyperledger Fabric:如何使用 JS/Node 中的链码捕获交易错误?
【发布时间】:2019-11-14 15:22:58
【问题描述】:

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

  • "fabric-contract-api": "~1.4.0",
  • “织物垫片”:“~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 中没有抛出 execption 或返回错误。我没有发现任何代码示例是否有进一步的错误处理:https://fabric-shim.github.io/release-1.4/index.html

那么问题是如何使用基于 JS/Node 的链码捕获交易错误?

非常感谢!

【问题讨论】:

    标签: node.js hyperledger-fabric hyperledger


    【解决方案1】:

    MVCC_READ_CONFLICT 发生在验证时,而不是在执行链代码的提案模拟期间。所以在这方面,你用哪种语言编写链码实现并不重要。

    要确定事务是否未通过验证并因此被标记为无效,您需要侦听事务事件并检查尝试提交的事务的状态。我假设你会在这里使用 node 作为你的客户端语言,并建议使用 fabric-network npm 包,它为你内置了事务事件处理。你什么时候在合约实例上提交事务,如果事务由于说 MVCC_READ_CONFLICT 而无法提交,那么它会抛出一个错误。

    建议您查看各种超级账本结构文档(例如 https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/application.html)和使用结构网络 API(有时称为高级 API,而不是低级 API)的超级账本结构示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多