长安链Batch交易池是业内首个生产可用的批量交易池。区块中只需放入批次ID,实现对区块的极致剪裁;通过以批次为单位的交易并发处理机制,进一步提升交易池性能。在一轮共识中(16核/64G,4节点),长安链Batch交易池相较Single交易池性能整体提升32倍,提升区块压缩率至0.23%,并且支持更具扩展性和理论性能更优的MaxBFT共识算法。
一、背景与不足1、背景
长安链中的批量交易池为了提升性能,在交易池Broadcast交易、主节点产块时从交易池Fetch交易、从节点验证区块从交易池Get交易和验证完将交易移入Pending、以及主从节点在提交区块从交易池Remove区块中交易时,均以批次为粒度进行操作。
点击图片放大
在原来批量交易池的实现中,各节点交易池内部各自维护一个自增的CurrentBatchId,收到其他节点广播过来的Batch后更换为自身的CurrentBatchId。为了以批次为单位对交易进行操作,各节点交易池内部还维护了BatchId->TxId的映射表,从节点Core模块从交易池Get交易时,根据入参TxId检索BatchId,然后将该批次所对应的交易直接返回给Core模块,Pending和Remove操作也是同理。
2、存在的不足之处按照上述的实现思路,批量交易池存在两个明显不足。
(1)批量交易池无法兼容一笔交易同时发给多个节点,无法生产可用
点击图片放大
如上图所示,如果将5笔交易只发送给一个节点,那个该节点基于收到的交易构造交易批次并广播给其他节点,此时,各个节点交易池的Batch间不存在重复的交易(不考虑接收交易构造批次的节点作恶),在Get、Pending、Remove时,各个节点操作的Batch中的交易是一致的,不存在任何问题。
但是,若将5笔交易同时发给多个节点,各个节点自行构造Batch并广播给其他节点,最终这5笔交易在不同节点大概率会分布在不同的Batch中。在某一轮共识中,假设Node1是主节点,打包Batch1中的交易构造了区块,后续其他从节点在Get和Remove交易时会根据区块中首笔交易的TxId从各自的交易池中找到映射的BatchId,并基于整个Batch进行处理。那么对于Node2来说,最终交易池将会少删除交易tx3,在后续打包的时候,就会重复打包交易tx3;对于Node3来说,将会多删除交易tx4,在后续打包的时候,就会丢失交易tx4;Node4和Node5分别是两种更极端的情况。
(2)批量交易池无法应用于更具扩展性和性能更优的MaxBFT(HotStuff)共识算法
点击图片放大
在交易池中存在两个结构,分别是缓存待打包交易批次的Queue和缓存已打包交易批次的Pending。并且在Pending中也会维护交易批次Batch被打包进的区块高度,用于防止Batch被重复打包进不同的区块。
在MaxBFT共识中,若先收到区块b2并验证有效后,交易池认为Pending中Batch1被打包进了高度为2的区块,但是后续在另外一条分支收到了区块b2'和区块b3,为了使得区块b3验证成功,只能对区块b2剪枝。
由于MaxBFT共识的3-chain机制,该节点在验证完区块b3后,还可能收到原来分支上的区块b3',在验证区块b3'之前需要先对区块b2验证有效,但此时不会对更高的区块b3进行剪枝,这将导致该节点无法对b2
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?