显示包…

4个版本 (稳定)

2.0.4 2021年6月8日
2.0.3 2021年2月18日
2.0.3-alpha2021年3月10日
2.0.1 2021年2月20日

#8 in #pending

MIT/Apache

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 可能不会明确可用。

  1. 池将特定发送者的交易分组在一起,并按 Scoring 在该组中排序存储,即 HashMap<Sender, Vec<Transaction>>
  2. 此外,我们维护每个发送者的最佳和最差交易(通过 Scoring 而不是 priority)并按 priority 排序。这意味着我们可以轻松地识别整个池中的最佳交易和最差交易。
  3. 每当有新的交易插入队列时
    • 首先检查所有限制(总体、内存、按发送者划分)
    • 检索发送者的所有交易
    • 进行二分搜索以确定插入交易的位置
    • 决定是否替换现有交易(3种结果:删除、替换、插入)
    • 如果受到影响,则更新该发送者的最佳和最差交易
  4. 待处理列表构建
    • 将所有发送者的最佳交易(按优先级)添加到列表中
    • 用该发送者下一个交易(按顺序)替换交易(如果有)
    • 重复

依赖关系

~160KB