交易池与网络层
一笔交易从签名到被 EVM 执行之间还有一段完全链下的旅程:先经 P2P 网络传播到全网节点,再在各节点的内存池里排队等待打包。这段路程决定了一笔交易的确认速度与可见性,也是 MEV 的发源地。交易进入执行引擎之后发生了什么,见 EVM 与内部状态。
P2P 网络:交易如何流动
以太坊节点的组网由三层协议叠成:
- 节点发现(discv4):跑在 UDP 上的 Kademlia 风格分布式哈希表。新节点从内置的 bootnodes 入网,逐跳交换邻居信息,最终维持几百个对等连接。
- 传输层(RLPx):TCP 上的加密多路复用协议,握手完成后所有业务数据都走这条加密通道。
- 应用层(eth 协议):定义“说什么“。交易的传播采用“先广播哈希、按需拉全文“:节点收到新交易并验证通过后,向部分 peers 发送
NewPooledTransactionHashes(哈希 + 类型 + 大小);对方发现自己缺这笔,再用GetPooledTransactions取回全文——全文只在必要时传输,控制带宽。
合并(The Merge)后区块的产生与传播由共识层主导:出块者经 Engine API 把执行 payload 交给执行层,执行层再经 eth 协议向 peers 同步。交易与区块的路径不同,但共用同一套 devp2p 底座。
关键性质:gossip 即公开。交易一旦走上公共传播路径,数十秒内全网可见——这是私有内存池存在的根本原因。
交易池(TxPool)
交易池是节点内存里的“待办队列“。它不属于共识协议,只是节点实现的好意,各客户端细节不同(下以 Geth 为准):
- 入池预检:签名(ecrecover)、chainID、nonce、余额、gas 上限全部合法才收——进不了池的交易不会被继续广播。
- pending / queued 两个子池:pending 收纳“当前就能执行“的交易(nonce 顺序接得上、余额足够);nonce 有空洞或余额不足的进 queued,缺口补上后升入 pending。出块方只从 pending 按序打包。
- 排序规则:同一账户严格按 nonce 串行;不同账户按 gas price 竞争——价高者先入块,这是“加价插队“的机制基础。
- 替换(replace-by-price):同账户同 nonce 的新交易可以顶替旧交易,但 gas price 必须高出一定比例(Geth 默认 10%),防止零成本刷池。
- 驱逐:池有容量上限,满了优先驱逐最“不值钱“的远端交易(price 最低、nonce 最靠后的)。本地(local)交易享受豁免:不驱逐、替换无需加价。
- 无强制保证:池是节点的好意而非协议义务——gas price 跌出队伍的交易可能被驱逐后再无人重新广播,只能由用户重新提交。
公共池的透明性问题
公共池人人可见,机器人因此能做一件普通用户做不到的事:在交易上链前模拟它。模拟出高利润就复制交易、出更高 gas price 抢先上链——抢跑(frontrunning)由此而生;围绕同一笔 DEX 交易做“前置买入 + 跟随卖出“则构成三明治(sandwich)攻击。二者都不是合约漏洞,而是内存池透明性与公开排序规则的直接产物,与授权竞争攻击同属“交易可见性“这一攻击面。
私有内存池
思路是绕开公共 gossip,把交易只交给少数可信的出块参与者:
- 私有 RPC(如 Flashbots Protect):交易直接发给 builder 而非广播全网,上链前不出现在任何公共池里;配合 MEV-Share 还可以选择只向 builder 回传加密提示,backrun 收益与用户分成。
- Bundle:若干交易打包成一个原子单元,要么全部上链要么全部不上链;模拟失败的 bundle 直接丢弃,用户不消耗 gas。
- 信任边界:私有是“防搜索者“,不是匿名——builder 看得到全部内容。把交易交给谁,就是把模拟与排序的机会交给谁。
MEV-Boost:出块权与出块内容的分离
合并后以太坊引入提议者-构建者分离(PBS):builder 专职构建区块并竞价,relay 负责中转与验证报价,验证者(proposer)只挑标价最高的区块头签名——出块权与出块内容解耦。公共池交易与私有 bundle 最终都汇入 builder 的竞价,MEV 从“矿工的隐性收入“变成 builder 市场上的显式拍卖。Builder 生态与隐私通道的协议细节见 Flashbots 文档。