区块链/等级 II · 运作机制/2.2 交易/课程 5
内存池
每个节点独立管理的本地等待室
材料提供内存池查看功能的区块浏览器(例如 mempool.space)可选:一个Bitcoin Core节点('getmempoolinfo')
好奇
- 为什么在一个全节点上有效的交易会被其相邻节点拒绝?
- 当节点的内存容量达到上限时,费用最低的交易会怎样?
- 矿工们如何决定哪些未确认的交易值得被纳入下一个区块中?
探索
- 内存池并不是一个中央数据库,而是由每个全节点独立维护的本地内存列表。Bitcoin Core会丢弃停留过久的未确认交易:0.12版本引入过期机制时为72小时,自0.14版本起为两周(336小时)。接收交易顺序不同或配置不同的两个节点,所持有的内存池也会略有差异。
- 每个节点除了应用共识规则(如脚本有效、没有双花)外,还会应用本地策略规则,例如最低费率和RBF设置。如果一笔交易未达到某个节点的最低费率阈值,即使其他节点接受了它,该节点也会拒绝它;若该交易已在其内存池中,则会将其驱逐。
- 默认情况下,Bitcoin Core 通过 bitcoin.conf 文件中的 ‘maxmempool’ 参数将内存池大小限制在 300 MB。当达到这一上限时,节点会动态提高最低手续费阈值,以便为更高收益的交易腾出空间,同时优先剔除价值最低的交易。运行 ‘getmempoolinfo’ 命令,即可观察到当内存池被填满时 ‘mempoolminfee’ 的数值是如何高于固定的 ‘minrelaytxfee’ 值的。
- 矿工从自己的内存池中选择交易来构建区块,优先选择每虚拟字节手续费最高的交易,并将其与所有未确认的父交易合并评估。当一个有效区块到达时,每个节点都会将已确认的交易以及任何与之冲突的交易从内存池中移除。
- 策略并不等于共识。一笔因低于手续费下限或采用非标准格式而被大多数节点拒绝转发的交易,在区块中仍可能是有效的,而且有些矿工会直接接收此类交易。因此,每个节点的内存池只是对下一个区块内容的估计,不同节点在边缘情况上可能存在分歧。
- 在关闭时,Bitcoin Core会将内存池保存到mempool.dat文件中,并在启动时重新加载,同时丢弃已不再有效的内容,因此重启后的节点不会从空的内存池开始。若要观察内存池的运作,可打开mempool.space:其中的预测区块显示了矿工接下来可能打包的交易,而每个新区块都会清除最上面的一层。
关键事实
- 内存池是每个节点上的本地内存池,并非某种统一的公共服务。
- Bitcoin Core通过'maxmempool'参数将内存池大小默认限制为300 MB。
- Bitcoin Core默认在两周后丢弃未确认交易(336小时,自0.14版本起)。
- 节点会同时应用共识规则和本地策略规则,包括最低费率。
- 当内存池满载时,节点会动态提高费用阈值,以剔除收益较低的交易。
- Bitcoin Core在关闭时会将内存池保存到'mempool.dat',使其在重启后得以保留。
练习 九、六、三、一
9收集从区块浏览器的内存池视图中列出9笔不同的未确认交易。注明它们当前的费率、以虚拟字节计的大小以及确认数(均为零)。
6归类根据交易可能卡住的原因,将这9笔交易分为6类:费率过低、体积过大、RBF信号、输入未确认、孤儿状态,或其他策略原因。
3提炼将这6组归纳为3个核心原因,说明为何一笔符合共识规则的交易仍会被节点拒绝或从其内存池中驱逐。
1凝结用1句话解释:节点之间本地策略的差异如何使全网对待处理交易的视图变得碎片化、不统一。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。
- Bitcoin Core documentation: -maxmempool and -mempoolexpiry configuration parameters
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023)
- mempool.space documentation on real-time mempool visualization