术语表 /交易与手续费
内存池(Mempool)
又称内存池、Mempool。
- 内存池(Mempool)是什么?
- 内存池(mempool)是某个节点已经收到、但尚未在任何区块中见到的有效交易的集合,这些交易暂存在该节点的内存中,等待矿工将其选中并打包进区块。
不存在唯一的内存池。每个节点都维护各自的内存池,在 Bitcoin Core 中默认上限为300 MB,达到上限后会丢弃手续费最低的交易。内存池网站向您展示的,只是某一个节点眼中的交易队列,用来选择手续费足够准确,但绝非权威数据。
运作方式
交易到达节点是一个过滤过程,而不是领取排队号码。交易到达节点后,先按共识规则检查,再按该节点自身的转发策略检查,只有两项都通过,节点才会存储并转发给其他节点。被拒绝的交易不会被转发,如果有足够多的节点拒绝它,它就根本到不了任何矿工手中。
存储空间是有上限的,这会让那些以为等候区没有尽头的人感到意外。-maxmempool 设置的默认值为300 MB,存储已满时,节点会逐出费率最低的交易,并把自身的接受门槛提高到常规最低值之上。等待超过 -mempoolexpiry 小时的交易也会被丢弃,该默认值为336小时,即恰好14天。自 Bitcoin Core 0.14.0起,内存池内容会写入 mempool.dat 文件,因此重启后得以保留,关闭节点不再清空其已知的内容。
排序依据是每单位大小的价格。矿工组装候选区块时,按费率排序,从最高处开始填充4,000,000权重单位的容量,并把一笔交易与其所依赖的未确认父交易放在一起评估。Bitcoin Core 31.0正是围绕这一思路重建了内存池,将相互关联的交易归入最多包含64笔交易的簇,并按其实际会被打包的费率排序。到达时间毫无作用,因此今早广播的交易,整个下午都可能被后来支付更高费用的交易超过。
由于每个节点采用各自的设置,不同机器上的内存池内容并不相同。一小时前刚重启的节点,了解的信息比运行了一个月的节点少;运行 Bitcoin Knots 的节点,过滤方式与运行 Bitcoin Core 的节点不同;矿工还可能被直接交付从未经过网络传播的交易。
购买比特币时为何要关注这一点
转移比特币前先查看队列,是比特币领域成本最低的习惯。同一笔提币,在安静的周末可能只需几百聪,在拥堵时段则可能高达数万聪,而您的钱包不会提示您当前处于哪种情况。在点击提币前看一眼下一个区块的当前费率,比钱包提供的任何手续费设置都更有价值。
您使用哪家交易所,会改变这一点的重要程度。Binance、Kraken 和 Coinbase 的比特币提币费用都根据网络定价,因此其报价会在队列拥堵时上升,在队列疏通后回落,等到安静时段提币能省下实实在在的钱。而公布固定提币费用的平台,无论队列状况如何都收取相同金额,因此在平静时段显得偏贵,在拥堵时段则相当划算。了解您所处的是哪种模式,就知道等待是否有好处。
拥堵还会毫无征兆地出现,而且原因与支付无关。2023年的代币铸造热潮和2024年4月的 Runes 发行,都让区块充满了数据,把普通的储蓄用户推入了他们毫无意愿参与的竞价。如果您通过 Swan 或 River 进行定期购买并设置了自动提币,合理的做法是设定一个阈值,以更少、更大额的交易转移比特币,而不是采用无视队列状况的固定每周计划。
点击提币前先查看队列
打开任何内存池仪表板,您会看到三项内容:等待中的交易、它们所处的费率区间,以及这些区间预计会填满的区块。标注为下一个区块的区间,是您要在大约十分钟内被打包所需支付的费率;较低的区间则是您为等待而支付的费率。
用一笔将一个币归集到一个输出的交易来说明。该交易使用原生 SegWit 输入时约为110虚拟字节,因此费率为2 sat/vB 时费用为220聪,费率为90 sat/vB 时费用为9,900聪。两种情况下的交易逐字节完全相同,不同的只是您选择的时机,这就是全部要点。
底线也值得了解。出价过低,您的交易可能根本不会被其他节点接受,因此不会出现在区块浏览器中,也无法加价。若故意把出价压得略低,就是在赌队列会在14天内清空,此后节点会丢弃该交易,您钱包中的比特币将恢复可花费状态。
内存池 vs 内存池策略
内存池是容器,策略是守门人。容器存放通过检查的所有交易,其大小和过期时间的配置方式与策略相同,但两者回答的是不同的问题。策略决定一笔交易是否被允许进入并向外转发;内存池则决定交易之后的去向,包括空间不足时哪些交易会被逐出。
内存池 vs 区块
区块是已确定的永久记录,硬性上限为4,000,000权重单位;内存池是临时的、私有的、原则上没有上限的推测,预测接下来几个区块可能包含哪些交易。交易被打包后会离开内存池,若包含它们的分支被放弃,它们会再次离开内存池,重新回到等待状态。身处内存池并不意味着任何人作出了承诺。