FISCO BCOS中交易池及其优化策略

Posted 软件工程小施同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FISCO BCOS中交易池及其优化策略相关的知识,希望对你有一定的参考价值。

作者:陈宇杰|FISCO BCOS 核心开发者

作者语

FISCO BCOS区块链系统中,交易上链之前,均存储在交易池中

交易池是区块链小能手,

  • 一方面担任质检员的职务,将所有非法交易拒之门外;
  • 一方面担任供应商的职责,向共识模块输送合法交易;
  • 还负责向客户端推送上链通知。

可以说,FISCO BCOS区块链系统的交易池异常忙碌,其性能会直接影响区块链系统性能。本文就带领大家揭开交易池面纱,了解交易池多重身份,并一起领会FISCO BCOS区块链系统中的交易池如何在多重角色间游刃有余。


初识交易池

../../../../_images/IMG_5193.PNG

如上图所示,FISCO BCOS区块链系统中,接收存储客户端发送的交易是交易池基本职责,这些交易是共识模块打包交易同步模块广播交易的“原材料”。

交易池需要保证这些交易“原材料”的质量,对交易合法性进行验证。

当然,为了防止DOS攻击,FISCO BCOS对交易池容量进行了限制,当交易池内交易数目超过容量限制后,会拒绝客户端发送的新交易。

交易池的重要性

FISCO BCOS区块链系统中,交易池作为关键系统模块,同时肩负着和SDK以及后端多个模块的交互,本节就以交易池的多重职责为切入点,和大家一起看看交易池有多忙。

交易池的四重职责

../../../../_images/IMG_5194.PNG

上图展示了交易从客户端发出到上链整个生命周期里,交易池所扮演的多重角色:

  • 交易质量检测员:交易放入交易池前,检测交易的有效性,有效的交易必须满足:①签名有效;② 非重复交易;③ 非已上链交易。
  • 交易供应商存储合法交易,为后端模块提供交易“原材料”。
  • 验签防重小助手:为共识模块提供区块验签接口,仅验证在交易池内未命中交易,提升共识区块验证效率。
  • 交易上链通知员:交易上链成功后,将交易执行结果通知到客户端

交易池作为区块链核心模块,身兼四职,每笔交易处理流程中,均需与后端三个模块、内部四个模块以及客户端进行多达八次交互,确实是异常忙碌。

交易池的作用

下面就以区块链节点交易处理生命周期为例,详细了解交易池各重角色在其中所起的作用。

../../../../_images/IMG_5195.PNG

如上图,客户端发送的交易到节点会被流水线式处理,每条流水均需有五个处理流程:

  • 交易检测:客户端发送的交易发送到节点后,首先要经过交易池的质量检测员的检验,交易池仅会把签名有效、不重复、未上链的交易放入交易池内。
  • 交易存储:交易过了“质量检测”后,被存储交易池内,此时交易池身负“供应商”的角色,共识模块从交易池内获取新交易用于打包成区块;同步模块从交易池内获取新增交易,广播给所有其他共识节点。
  • 交易打包&&交易共识:共识模块从交易池内获取合法交易,打包成新区块,并广播到所有其他共识节点,其他共识节点收到打包的新区块后,为了保证区块的合法性,会验证区块内每笔交易签名。考虑到交易验签是非常耗时的操作,且新区块内交易有极大概率在其他节点交易池内命中,为了提升共识验证效率,交易验签防重小助手此时派上了用场,它会仅验证新区块中未在本地交易池命中的交易签名。
  • 交易提交:交易共识达成后,会调用存储模块,将交易及其执行结果提交到区块链数据库。
  • 交易通知:交易上链成功后,交易池的上链通知员将交易执行结果通知给客户端。

在交易从发出到上链的整个生命周期里,每个过程都有交易池的参与,因此交易池对于整个区块链系统非常重要,交易池每个处理过程都直接影响了区块链系统性能。

交易池优化

通过前面介绍,我们了解到FISCO BCOS区块链系统的交易池异常忙碌,并且直接影响了区块链系统性能,本节就来详细说说交易池的优化历程和优化方法。

优化交易处理流水线效率

通过上面交易处理流水线示意图可看出,交易池参与了交易处理的每个流程,因此交易池每个处理流程都对系统性能影响很大。

FISCO BCOS区块链系统采用拆分且并行执行交易验证任务交易异步通知策略来优化交易流水线处理效率。

优化交易验证效率

FISCO BCOS rc2引入并行交易后,FISCO BCOS开发者们发现压测过程中共识模块每个区块经常无法打满交易,偶尔还会出现共识模块出空块、等待交易池提供新交易的现象。排查发现,交易池作为交易检测员任务太重,既要验证交易签名,又要检查交易是否重复、是否已上链,导致向交易供应商提供交易效率非常低,经常出现交易供不应求的情况,严重影响了区块链系统TPS。

下图描述了这种供不应求的现象:

../../../../_images/IMG_5196.PNG

为了打破交易池供不应求的困局,优化交易流水线处理效率,FISCO BCOS区块链系统引入专门的交易验签模块,并将“交易检测员”的“验证签名”职责分担给了这个新模块,且为了进一步提升交易存储效率,交易验签模块并行对交易进行验证。优化交易处理流水线后,“交易检测员”的工作负担轻了很多,交易供应商完全能满足共识模块的交易需求,而且还留有部分存货。

../../../../_images/IMG_5197.PNG

优化处理流水线后,”交易检测员”的重活被”人力充足”的”验签模块”分担了,系统性能显著提升:采用并行交易压测,FISCO BCOS区块链系统性能突破了1W

交易异步通知

通过前面的介绍,大家了解到交易池还承担着交易通知的职责,”交易通知员”也是个忙碌的角色,它需要在收到区块落盘信号后,将所有上链交易通知给客户端,当且仅当共识模块确认上一轮共识的上链交易都会被通知到后,共识模块才会开始下一轮共识,交易同步推送无疑会拖慢共识流程。

为了进一步优化流水线处理效率,FISCO BCOS区块链系统采用了交易异步通知策略:存储模块将交易通知结果放置于交易通知队列后直接返回,共识模块直接开始下一轮共识流程,与此同时,交易通知模块将交易执行结果依次返回给客户端。

如下图所示:

../../../../_images/IMG_5198.PNG

采用交易异步通知策略后,交易通知不会阻塞共识流程,大约能提升10%的系统性能。

双缓存队列

FISCO BCOS 2.1之后,FISCO BCOS团队认真统计了每个区块的处理时间,觉得系统性能还有继续上升的空间,于是决定继续优化性能,进一步提升FISCO BCOS区块链系统的处理能力。

当存储模块和执行模块性能优化到极致后,可是最终的压测结果总是不符合预期。经过排查发现交易池又出现了供不应求的情况,只是这种供不应求是客户端引起的,客户端发送交易后,大量线程阻塞在等待交易验证通过,返回交易哈希,无法空出更多线程发送新交易

为了提升节点对客户端的响应速度,从而提升客户端交易发送速率,FISCO BCOS区块链系统在“交易供应商”持有的交易储存队列基础上,引入了交易预缓冲区,存放客户端发送到节点的交易,并直接对客户端进行响应

交易预缓冲区会持续将缓存的交易送到”验签模块”和”交易检测员”处进行验证,验证通过的交易最终会被放入到真正的交易队列供交易供应商调度,如下图所示:

../../../../_images/IMG_5199.PNG

这种双缓存队列机制,大大提升了交易池对客户端的响应速度,客户端也可以持续腾出线程继续发送新交易,优化后,客户端发送性能更高,交易池供大于求。

小结

交易池很忙,FISCO BCOS区块链系统中,交易池更忙,它被用来验证交易、存储交易、防止交易重复验签、向客户端推送交易执行结果等。交易池很重要,FISCO BCOS区块链系统中,交易池更重要,任务繁重的”交易检测员”会大大降低交易插入速率,导致交易供不应求;没有”交易预缓冲区”的交易池会阻塞客户端交易发送线程,降低客户端交易发送速率;交易同步推送,会损耗10%左右的系统性能… …

在性能优化的道路上,交易池性能优化一直会被排在重要的位置。

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/3_features/30_architecture/transaction_pool_optimization_strategy.html?highlight=%E4%BA%A4%E6%98%93%E6%B1%A0%E5%8F%8A%E5%85%B6%E4%BC%98%E5%8C%96%E7%AD%96%E7%95%A5

以上是关于FISCO BCOS中交易池及其优化策略的主要内容,如果未能解决你的问题,请参考以下文章

fisco bcos区块链的同步及其性能优化方法

以太坊虚拟机 EVM交易流(FISCO BCOS为例)

FISCO BCOS共识优化之路

FISCO BCOS 数据结构与编码协议 交易结构 区块结构

FISCO BCOS 区块最大最长交易执行时间

FISCO BCOS 构造交易体 使用WeBASE-Front组装交易提交交易