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

Why do I take more than 2 seconds to just do a transaction?

我的 Hyperledger Fabric 正在运行 docker 容器。 我有我的 Hyperledger 客户端,使用 Fabric Node SDK 在 Node.js 中编写。

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

我发送了数据,我在对等方的 docker 日志中正确地看到合约函数被正确调用,它在几毫秒后终止,将新数据添加到区块链中。 但是实际响应 Node.js 服务器交易已经完成并写入数据需要大约 2 秒。 所以,我的 Node.js 服务器正在等待答案 2 秒。

只是为了有一些时间:

这是在我调用 createEntity API 时由 Node.js 服务器打印的: 创建实体: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 秒,它必须是即时的。

谢谢

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

您告诉您的节点写入数据,节点将创建签名的提案,该提案将发送给排序者。如果一切正常,那么订单会回复,节点最终可以将数据添加到它的账本副本中。

就是这个原因,不能即时。

在 configtx.yml 上,用于创建工件的文件在排序器部分有一个参数,上面写着

BathTimeout: 2s

这决定了在将事务提交给对等方之前要保留事务的时间。默认为 2 秒,但您可以更改它,例如

BathTimeout: 500ms

当然要明智地使用它,因为它可能会根据您的分类账的负载创建一个交易块。

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

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)