您当前的位置: 首页 > 

长安链开源社区

暂无认证

  • 8浏览

    0关注

    44博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

长安链Batch交易池生产可用重构方案设计及其成效

长安链开源社区 发布时间:2022-09-26 10:43:26 ,浏览量:8

 引  言 

长安链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

关注
打赏
1656301027
查看更多评论
立即登录/注册

微信扫码登录

0.3406s