内存池上限怎么起作用:节点拒绝低费交易的那条线 图 1
内存池上限怎么起作用:节点拒绝低费交易的那条线 · 图 1

收件箱不是无限的

比特币节点把还没进块的待打包交易存放在内存池里,向对端转发、供挖矿接口挑选。2016 年之前的版本对内存池只有一个软约束:交易费不低于最低中继费率就能进来,而总容量没有硬上限。这个设计有一个可被利用的缝隙——攻击者可以生成海量贴着最低费率线的交易,把节点内存撑爆,内存有限的节点会直接宕机。防范手段一度是靠人工调高最低中继费率参数,属于治标。

0.12 引入的硬性天花板

Bitcoin Core 0.12.0 的发布说明把这个机制说得很清楚:内存池有了严格的总大小上限,默认三百兆字节,可用 maxmempool 参数调整。每当一笔新交易会撑破上限,节点就把”连同其在池中的全部后代交易一起、单位费率最低”的那组交易踢出去,并把本节点的有效最低中继费率抬高到被踢交易的费率之上。也就是说,池子越满,进门的门槛自动水涨船高,而且这个门槛不是固定档位,是被当前最穷的那笔交易实时顶上去的。发布说明同时给出了基准:初始最低中继费率是每千字节一千聪,驱逐线在它之上浮动。两个容易误解的点值得展开。第一,被踢看的是”整包费率”而不是单笔费率:一笔自身费率尚可但父交易极吝啬的子交易,包费率会被父交易拖下水,所以低费父交易连累孩子的钉住问题在这套排序里同样成立。第二,抬高的是该节点自己的接收线,不代表全网都不收——你的交易可能在这台节点被拒,在另一台内存富余的节点安然入座。

排队的人实际面对的是什么线

钱包给你推荐费率时常常显示”最快几分钟”,这条推荐值和网络真实的接收线是两套东西。每个全节点因内存水位不同各有一条动态 min relay fee,矿工的打包线通常又高于中继线。用户侧能观测的是自己那笔交易是否被广播出去、是否出现在足够多节点里;观测不到全网平均水位。一个实用的判断习惯:如果交易被自己的节点拒收、或长时间只有零星节点转手,往往说明当前排队线已高于你支付的水位,此时考虑 RBF 提费或 CPFP 加急,而不是换钱包重复广播同一笔——重复广播不会让同一笔交易插队,只会增加隐私暴露。

边界与代价

这套机制也有代价。内存池有限意味着节点天然看不见某些交易,费率估算器据此估计的”网络费率”带幸存者偏差:池子里只剩下付得起门槛的交易,被门槛挡掉的低费交易对估算不可见。另外,为省内存开启修剪模式或压低 maxmempool 的节点,会更容易错过低费交易的传播,这也是为什么排查卡单时”换几台公开节点查询”比”问自己那台”更接近网络真相。机制的原意始终是防御资源耗尽攻击,而不是惩罚低费用户——理解了这条线怎么算出来,就不会把”进了这台节点的池”或”没进这台节点的池”误读成网络对你的态度。

三个容易混淆的数字

最后把三组数字钉清楚,避免日常讨论里的张冠李戴。第一组是容量参数 maxmempool,默认三百兆字节,那是这台机器愿意为待打包交易划拨的内存预算,与你的交易大小无关;第二组是初始最低中继费率每千字节一千聪,那是门槛的地基,动态上浮都从它起步;第三组是钱包界面显示的推荐费率,那是估算器给出的市场水位预测,既不是下限也不是保证。三者量纲相近、来源完全不同:一个是资源预算,一个是政策地基,一个是行情预测。讨论”网络最低费率是多少”时先问清指哪一组,多数口径争吵会当场消失。

风险提示:本文内容仅为技术说明,不构成任何投资建议;涉及资产操作请自行核验当前版本行为与官方文档。