显示包…
4个版本 (稳定)
2.0.4 | 2021年6月8日 |
---|---|
2.0.3 | 2021年2月18日 |
2.0.3-alpha | 2021年3月10日 |
2.0.1 | 2021年2月20日 |
#8 in #pending
73KB
1.5K SLoC
通用交易池
这是Vapory交易池的可扩展和高效实现。该池按照某些可插拔的 Scoring
实现存储排序、验证的交易。该池还允许您根据某种 Readiness
概念(可插拔)构建一组 pending
交易。
池对交易是通用的,不应对其做出任何假设。我们唯一可以依赖的是定义
- 单个发送者的交易排序
- 与其他发送者交易的优先级
注意:单个发送者的交易不是按优先级排序的,但在构建待处理集时,我们始终需要维护排序(即 txs[1]
总是在 txs[0]
之后包含,即使它有更高的优先级)
设计细节
性能假设
- 处理成千上万笔交易的可能性
- 快速插入和替换
O(per-sender + log(senders))
- 合理快速的停滞交易移除
O(per-sender)
- 合理快速的待处理集构建
O(txs * (log(senders) + log(per-sender)))
通过牺牲一些内存,可以改善移除性能。目前使用 SmallVec
存储发送者交易,而我们可以使用 VecDeque
并有效地使用 pop_front
来弹出最佳交易。
通过引入 nonce
的概念——交易的一个绝对、数值排序,可以降低待处理集构建和插入的复杂性。我们不这样做,因为 EIP208 可能会有影响,其中 nonce 可能不会明确可用。
- 池将特定发送者的交易分组在一起,并按
Scoring
在该组中排序存储,即HashMap<Sender, Vec<Transaction>>
。 - 此外,我们维护每个发送者的最佳和最差交易(通过
Scoring
而不是priority
)并按priority
排序。这意味着我们可以轻松地识别整个池中的最佳交易和最差交易。 - 每当有新的交易插入队列时
- 首先检查所有限制(总体、内存、按发送者划分)
- 检索发送者的所有交易
- 进行二分搜索以确定插入交易的位置
- 决定是否替换现有交易(3种结果:删除、替换、插入)
- 如果受到影响,则更新该发送者的最佳和最差交易
- 待处理列表构建
- 将所有发送者的最佳交易(按优先级)添加到列表中
- 用该发送者下一个交易(按顺序)替换交易(如果有)
- 重复
依赖关系
~160KB