本文档介绍了 go-ethereum 中的交易池系统,该系统负责在交易被包含在区块之前对其进行管理。交易池负责验证、存储、组织和优先处理交易,以确保网络高效且安全地运行。
交易处理系统通过专门的子池处理多种交易类型,并协调它们从提交到包含在区块中的整个生命周期。有关区块创建和挖矿的信息,请参阅 挖矿与区块创建。有关 EVM 中交易执行的详细信息,请参阅 以太坊虚拟机。
交易池系统采用模块化架构,有一个主协调器(TxPool)管理多个专门的子池。每个子池负责处理特定的交易类型,并实现 SubPool 接口。
来源: core/txpool/txpool.go66-79 core/txpool/subpool.go96-186 core/txpool/reserver.go41-51
| 组件 | 目的 | 关键文件 |
|---|---|---|
TxPool | 所有交易池的主协调器 | core/txpool/txpool.go |
LegacyPool | 处理 Legacy、AccessList、DynamicFee 和 SetCode 交易 | core/txpool/legacypool/legacypool.go |
BlobPool | EIP-4844 blob 交易的专用池 | core/txpool/blobpool/blobpool.go |
ReservationTracker | 防止账户在多个池中拥有交易 | core/txpool/reserver.go |
来源: core/txpool/txpool.go66-79 core/txpool/legacypool/legacypool.go228-257 core/txpool/blobpool/blobpool.go306-335
交易从最初提交到最终包含在区块中,会经历几个阶段。这个过程包括验证、池分配、状态管理和最终移除。
来源: core/txpool/txpool.go333-374 core/txpool/validation.go62-169 core/txpool/validation.go222-272
交易在池中处于不同的状态
TxStatus 枚举定义了这些状态:core/txpool/txpool.go35-43
所有子池都实现 SubPool 接口,该接口定义了标准化的交易管理方法
来源: core/txpool/subpool.go96-186
ReservationTracker 确保账户一次只能在一个子池中拥有交易,从而防止不同交易类型之间的冲突
来源: core/txpool/reserver.go41-51 core/txpool/reserver.go79-138
交易验证分为两个阶段:基本验证和状态验证。
来源: core/txpool/validation.go62-169 core/txpool/validation.go222-272
不同的池通过 ValidationOptions 和 ValidationOptionsWithState 结构使用不同的验证配置
| 选项 | 目的 | Legacy Pool | Blob Pool |
|---|---|---|---|
接受 | 接受的交易类型的位图 | Legacy, AccessList, DynamicFee, SetCode | 仅 BlobTx |
最大尺寸 | 最大交易尺寸 | 128KB | 1MB |
MaxBlobCount | 每笔交易的最大 Blob 数量 | 0 | 7 |
MinTip | 最小 Gas 提示 | 可配置 | 可配置 |
来源: core/txpool/validation.go42-49 core/txpool/validation.go194-215
LegacyPool 处理传统的以太坊交易,并维护两个主要队列
来源: core/txpool/legacypool/legacypool.go242-247
Legacy Pool 会持续将队列中的交易提升到待处理状态,当它们可以执行时
来源: core/txpool/legacypool/legacypool.go1030-1178
BlobPool 专门用于 EIP-4844 blob 交易,具有独特的特性
来源: core/txpool/blobpool/blobpool.go311-335 core/txpool/blobpool/blobpool.go92-114
两个池都支持广泛的配置选项
来源: core/txpool/legacypool/legacypool.go138-154
交易池系统通过 Reset 方法与区块链状态变化同步,当添加新区块时会调用该方法
来源: core/txpool/txpool.go149-258 core/txpool/txpool.go400-403