为什么我要花超过2秒钟才能完成交易?

时间:2019-07-08 13:58:23

标签: node.js docker hyperledger-fabric hyperledger

我让Hyperledger Fabric处理docker容器。 我有使用Fabric Node SDK在Node.js中编写的Hyperledger客户端。

我有一个API指针/ createEntity,它使用contract.submitTransaction()在合约上调用函数“ createEntity”,并在区块链上写入一些数据。

我发送了数据,并在对等方的docker日志上正确地看到了合同功能已被正确调用,并且合同仅在几毫秒后终止,将新数据添加到了区块链中。 但是实际上要花费大约2秒钟才能响应Node.js服务器,事务已经完成并且数据已写入。 因此,我的Node.js服务器正在等待答案2秒钟。

只是有一些时机:

这是由Node.js服务器在我调用createEntity API时打印的: 创建实体:2019-07-08T13:29:28.781Z

这是由Hyperledger的Docker日志打印的: createEntity 2019-07-08 13:29:28.814697426

因此,在几毫秒后,交易到达,并且在几毫秒内,创建了交易并将其写入分类账,实际上,我在合同上的createEntity函数完成后编写了计时,我有: createEntity完成于:2019-07-08 13:29:28.818830574

但是对Node.js服务器的答案是: 交易已提交2019-07-08T13:29:30.842Z

有人知道这是什么延迟吗? 我不希望交易花费2秒钟,它必须立即进行。

谢谢

3 个答案:

答案 0 :(得分:3)

submitTransaction 函数将花费一些时间来完成,因为默认情况下已启用提交侦听器。

因此它将等待数据被提交然后返回。

在设置网关时,可以通过在连接选项中添加eventHandlerOptions:{strategy:null}来禁用commitListener。

希望以下代码中的波纹将帮助您。

 let connectionOptions = {
        identity: USER_ID,
        wallet: wallet,
        discovery: { enabled: false, asLocalhost: true },
        eventHandlerOptions: {
             strategy: null
             }
         }

    await gateway.connect(connectionProfile, connectionOptions)

答案 1 :(得分:0)

不要忘记订购者也参与其中。

您要告诉您的对等方写入数据,对等方将创建已签名的投标书,该投标书将到达订购者。如果一切正常,则订单会回复,对等方最终可以将数据添加到其分类帐副本中。

由于这个原因,它不是即时的。

答案 2 :(得分:0)

在用于创建工件的文件configtx.yml上,订购者部分的参数为

BathTimeout: 2s

这确定将事务提交给对等方之前将保留多少时间。默认为2秒,但是您可以更改它,例如

BathTimeout: 500ms

当然会明智地使用它,因为它可能会创建分类帐,具体取决于您的分类帐的负载。

事务的验证应该非常快,只需几毫秒。当然,这取决于您的链码的复杂性和同行的负担。