Mempool 是比特币节点保存已接收但尚未进入区块确认的交易的地方。节点就是接入比特币网络的计算机。每个节点都有自己的池,因此不存在一个全网共用、保证先后顺序的队列。 区块浏览器是可以查询交易和区块的网站。
按下发送后,钱包会把签好名的交易交给网络。收到交易的节点会检查交易是否符合网络规则和各自的本地接收条件。通过检查后,节点可以把它存入自己的 mempool,并继续转发。因此,在区块浏览器中看到一笔付款,只说明该浏览器的运营方已经知道这笔交易,并不表示它已获确认。只有交易进入当前链上的有效区块,才获得第一次确认。即使如此,确认也可能因链重组而改变:网络会转向另一条累积工作量更多的有效分支。 [2]
Mempool 不是超市收银台前的队伍。区块空间有限,矿工有动力选择能为这些空间支付更多手续费的交易。这里要看的是 sat/vB,即每个虚拟字节支付多少聪。聪是 BTC 的最小单位,虚拟字节则是比特币衡量交易大小的单位。例如,100 vB 的交易采用 10 sat/vB 的费率,手续费就是 1,000 聪,与转账金额的百分比无关。如果交易花费的是另一笔未确认交易的输出,还要考虑整个相依交易包的手续费。费率再高,也无法保证在某个具体区块或时间确认。 [4]
各节点接收交易的情况并不完全相同,内存设置以及接收、转发交易的规则也可能不同。节点有时还缺少新付款所依赖的前一笔交易。所以,待确认交易数和手续费估算出现差异并不奇怪。这些本地运行规则不同于共识规则;后者规定哪些区块有效。即使一个有效区块包含的某笔交易从未进入自己的 mempool,节点仍可以接受该区块。 [2]
交易确认后,就不再留在 mempool 中等待。但它也可能因内存不足、等待过久,或被另一笔花费相同资金的交易替代而离开。从一个节点移除,并不是全网取消:其他节点可能仍保留原交易,矿工以后也可能将它确认。因此,不能只因为查不到一条记录,就认定可以安全地用另一笔资金重新付款。应先检查钱包显示的状态,以及是否存在替代交易。链重组后,一些从原区块中移出的交易只要重新通过检查,也可能回到待确认池。 [1] [2]
一般查看付款状态时,先分清交易尚未确认还是已经进入区块,再检查费率和它所依赖的前序交易。如果你运行自己的 Bitcoin Core 节点,getmempoolentry 可显示本地已知的一笔交易的信息,getmempoolinfo 则汇总整个池的状态。这些命令查询的是你的节点,不是全网统一的中央列表。公共区块浏览器同样只提供自己的视角;随着新交易和新区块到来,等待时间估算也会变化。 [3]
要获得更完整的理解,请将本词条与以下词条结合阅读: 交易, Transaction Fees, 挖矿, Full Node, UTXO. 反向关联还来自: 挖矿, 交易, UTXO, Transaction Fees.
01比特币是否只有一个全球统一的 mempool?+
不是。每个节点都有自己的池,内容取决于它收到的交易、设置、内存,以及它接受和转发哪些交易。
02交易从 mempool 中消失意味着什么?+
先检查交易是否已经在区块中确认。如果没有,可能是一个节点将它移除或替换。但其他节点可能仍保留它,矿工以后也可能确认它;从一个 mempool 中消失,本身并不等于取消付款。