跳到正文

Mempool 与交易池

从节点本地视角介绍以太坊交易准入、待执行与 nonce 缺口排队、传播、费用资格、替换、私有订单流、纳入、逐出和重组。

更新于

仅供教育参考,不构成交易或安全建议。Mempool 视图属于节点本地状态,变化频繁且取决于策略;在把交易视为已接受或已完成前,请核验具体链、客户端、nonce、费用上限、提交路径、收据和最终性。

直接答案

Mempool(即交易池)是节点临时保存在内存中、有时也持久化到磁盘的一组已签名交易;这些交易已按节点当前的验证和策略规则获准进入,但尚未进入该节点所认定的规范链。它不是共识对象、全网统一队列或纳入承诺。两个诚实节点也可能持有不同交易,因为它们收到的 gossip 不同、使用不同客户端或设置、经历过重启或逐出,或者采用不同的公开与私有提交路径。

在以太坊执行客户端中,具有账户下一个 nonce、可立即执行的交易通常称为 pending;被 nonce 缺口阻塞的较高 nonce 交易通常称为 queued。这些是客户端接口标签,并非最终的协议状态。交易可能在准入前被拒绝、被传播、被同一发送者和 nonce 的另一笔已签名交易替换、被逐出、被丢弃、成功纳入、纳入后回滚,或者在重组后重新进入候选范围。

1
创建

钱包填写目标、金额、费用参数,以及已花费输入或 nonce 等防重放数据,并构造交易。

运行机制

  1. 锁定环境:链 ID、执行客户端及版本、当前链头和基础费、交易类型、发送者、nonce、转账价值、calldata、gas 上限、费用上限和提交路径。区分公开 gossip、私有中继或构建者,以及 ERC-4337 UserOperation 路径;它们并不共用一个通用交易池。
  2. 解码已签名字节并执行准入前检查。验证签名与发送者、链 ID、类型与编码、固有 gas、nonce 关系、足以覆盖转账价值与最大费用敞口的余额、费用字段,以及所需的 blob sidecar。此处的拒绝不是 EVM REVERT,通常不会产生收据或链上费用。
  3. 映射本地交易池策略。记录客户端把交易归为 pending 还是 queued、单账户和全局容量、最低费用过滤器、存续期、本地账户豁免、替换加价和持久化行为。Geth 的标志和默认值只描述 Geth,并非以太坊共识或每家提供商的规则。
  4. 观察传播,但不要虚构全网统一视图。对照多个独立节点上的原始交易哈希与已签名字节,但缺失状态有多种解释:节点可能尚未收到、按本地策略拒绝、已经逐出,或不公开其交易池。私有路径可以绕过公开 gossip,同时把交易交给路径运营者和构建者查看。
  5. 在候选区块上评估纳入资格和排序。对于 type-2 交易,执行 gas 价格为 min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas);若基础费超过最高费用,该交易在此上限下不具备纳入资格。nonce 依赖、gas 与 blob 限制、状态有效性、构建者 bundle 和 MEV 的影响可能大于首次可见时间。
  6. 主动管理生命周期。等待,或仅在确认活跃链、发送者和替换策略后,提交有明确依据的同 nonce 替换交易。发给自己的同 nonce 转账也只是一笔替换候选,并不是取消原语。不要因为某个浏览器不再显示原交易就重复发送价值转账。
  7. 依据共识状态完成对账。保存每个已签名哈希及替换谱系,再按所需确认或最终性级别检查规范收据、区块哈希、状态、gas 使用量、日志、已消耗 nonce 以及账户或合约状态。若重组移除区块,仍然有效的交易可能返回部分本地交易池,但具体行为取决于客户端与状态。

计算示例

  • 费用上限资格。 某 type-2 转账的 gasUsed = 21,000baseFeePerGas = 32 gweimaxPriorityFeePerGas = 3 gweimaxFeePerGas = 34 gwei。实际价格为 min(34, 32 + 3) = 34 gwei,所以实际小费为 2 gwei。费用是 21,000 * 34 = 714,000 gwei = 0.000714 ETH,其中 0.000672 ETH 是被销毁的基础费,0.000042 ETH 是小费。若候选区块基础费升至 35 gwei,则 34 gwei 上限不足以在该区块纳入。
  • Nonce 缺口。 账户的规范 nonce 为 10。某本地交易池收到 nonce 为 1012 的交易,但没有 11;它可以把 10 归为 pending,把 12 归为 queued。nonce 10 纳入后,规范 nonce 变为 11,而 12 仍被阻塞,直至有效的 nonce 11 交易被纳入。在交易池中看到 nonce 12 并不代表它可以独立执行。
  • 取决于策略的替换。 在某教学 Geth 配置下,txpool.pricebump = 10,旧交易的 maxFeePerGas = 40 gweimaxPriorityFeePerGas = 2 gwei。按 10% 加价计算的替换门槛为 44 gwei2.2 gwei。提出 43 gwei3 gwei 仍可能被拒绝,因为其中一个上限未达到所配置的加价;44 gwei2.2 gwei 则达到两项教学门槛。具体整数取整、交易类型和准入逻辑取决于版本,另一节点可能保留不同候选。
  • 不存在全网统一交易池。 节点 A 报告 120,000 个不同交易哈希,节点 B 报告 100,000 个,交集为 80,000 个。并集是 120,000 + 100,000 - 80,000 = 140,000;Jaccard 重合度为 80,000 / 140,000 = 57.1428571429%。仅 A 可见的哈希有 40,000 个,仅 B 可见的有 20,000 个。两项数量都不能证明构建者、私有中继或其余网络能看见什么。

风险

  • 在错误的链 ID 或网络上签名或广播。
  • 信任恶意、陈旧或配置错误的 RPC 端点。
  • 签名、交易类型、编码或 blob sidecar 无效。
  • 余额不足以覆盖转账价值与最大费用敞口。
  • 固有 gas 或 calldata 规则导致准入前拒绝。
  • nonce 已被使用或过低。
  • nonce 缺口使后续交易继续排队。
  • 同 nonce 替换因本地策略判定加价不足而被拒绝。
  • 最高费用低于候选区块基础费。
  • 实际优先费过低或资源限制延迟纳入。
  • 客户端、提供商、版本或配置策略不一致。
  • 交易池容量、过期、重启或逐出移除交易。
  • peer 传播不良、日蚀攻击或选择性中继。
  • 私有中继泄漏、审查、停机或构建者不参与。
  • 公开订单流遭受抢先交易、三明治攻击或其他 MEV。
  • 构建者重排、bundle 或私有交易改变执行状态。
  • 模拟结果在纳入前失效。
  • 盲目重复提交或丢失替换谱系。
  • 虽已获交易池接受,但纳入后发生 REVERT、gas 耗尽或被捕获的子调用失败。
  • 重组、最终性混淆,或把 ERC-4337 替代交易池当成普通 txpool。

常见误区

  • Mempool 是一个全网同步的先进先出队列。
  • 交易哈希能证明全网已经接受或传播该交易。
  • Pending 表示已经纳入、执行成功、不可逆或收款人已到账。
  • 费用足够高就能保证纳入和执行成功。
  • 私有提交路径会自动保密、抗审查且保证上链。

相关主题

来源

导航

搜索知识库...