为什么我需要超过 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)
我的 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)