Hyperledger Fabric nodejs sdk 性能问题

Hyperledger Fabric nodejs sdk performance issue

我在使用 Hyperledger fabric node.js sdk 时遇到性能问题。

当我向 sdk 发出调用请求并使用以下代码使用链码给出的响应时

var proposalResponse = results[0];
            var proposal = results[1];
            let isProposalGood = false;

            if(proposalResponse
                && proposalResponse[0].response
                && proposalResponse[0].response.status === 200){
                    isProposalGood = true;
                    var res = JSON.parse(proposalResponse[0].response.payload.toString());
                            res.event_status = 'VALID'
                            resolve(res);
                }else{
                    reject(createErrorResponse(proposalResponse[0].message,500))
                    return
                }

api 会在 50 毫秒内做出响应,如下图所示:

但是,当我使用以下代码等待订购者确认交易时:

if (code === 'VALID'){
                            //get payload from proposal response
                            var res = JSON.parse(proposalResponse[0].response.payload.toString());
                            res.event_status = 'VALID'
                            resolve(res);
                        }else{
                            var return_status = createErrorResponse("Transaction was not valid", 500);
                            return_status.tx_id = transaction_id_string
                            reject(return_status)
                            return
                        }

响应时间接近2500ms,如下邮递员截图:

如有错误请指正

我知道这需要时间,因为 orderer 确认交易并提交到 ledger。但是你不认为只有 orderer 同意交易并提交给 ledger 我们才应该继续。如果是,则需要 2.5 秒才能响应(网络在 docker 上 运行 在本地计算机和 sdk 在同一台计算机上)这是一个性能问题。

如果数据被写入链代码,然后排序者拒绝将交易写入账本,会发生什么情况?

如有任何帮助,我们将不胜感激

the orderer confirms the transaction and commits into the ledger.

排序服务(顾名思义)的任务只是将收到的背书交易按照通道的时间顺序进行排序,然后将它们传递给通道中的所有节点。排序者实际上并不将交易提交到账本中。

提交者同行 这样做。提交是一个耗时的过程,因为所有对等方都验证块内的所有交易,以确保背书政策得到履行,并确保自交易生成读取集以来,读取集变量的分类帐状态没有发生变化执行。区块中的交易被标记为有效或无效。然后每个节点将块附加到通道的链,并且对于每个有效事务,写入集都提交到当前状态数据库。 发出一个事件,以通知客户端应用程序交易(调用)已被不可变地附加到链中,以及交易是有效还是无效的通知。

所以在了解 Transaction Flow 中的所有这些细节后,应该注意客户端应用程序不应该等待订购者收到的响应。相反,它应该只请求排序者交付背书的交易,并且应用程序应该订阅节点发出的事件,以便它应该知道或被通知交易实际上是在通道链中不可变地提交的。

您可以在 Fabric Node SDK docs 中获得有关事件订阅的更多帮助。

What happen if data is written into the chaincode and after that orderers deny to write the transaction into the ledger?

这根本不可能,因为只有当交易通过背书节点(由背书策略指定)的适当背书进行验证时,数据才会附加到链中,然后最终交付给提交节点以将新值附加到链中链并更新世界状态。数据只有在通过所有验证后才会写入链中,因此排序者永远不能拒绝对数据所做的更改。

我找到了延迟的另一个原因。

configtx.yaml 中的 batchtimeout 变量设置为 2 秒。所以它会进行处理,然后等待 2 秒,然后切割一个块。所以写操作大约需要2.5秒。