节点重启后未确认交易去哪了:mempool.dat 的保存与读回规则 图 1
节点重启后未确认交易去哪了:mempool.dat 的保存与读回规则 · 图 1

内存池是台内存里的账本

比特币节点收到但尚未被打包的交易,排队在内存池里。它本质上是一块可随时丢弃的缓存:交易本身有洪泛广播机制,邻居节点会不停向新连接的邻居转发。但洪泛是“一次性喊话”——你的节点断线重连后,那批喊过你一次的旧交易不会主动再喊一遍。早期节点重启后只能干等新交易进来或等全量同步,重启窗口里恰好没人转发的低活跃交易,就会从你的视野里安静消失。这正是 0.14 版引入的机制要解决的问题:节点关闭前把内存池快照写进数据目录下的 mempool.dat,下次启动再灌回去,顺带把此前对交易做过的优先度调整一并保留,避免重启把“我自己的排队偏好”也洗掉。

读档不是无条件恢复

恢复不是简单回放。文件里的交易重新进入内存池前要走完整验证:脚本、签名、双花检查一个不少;更要紧的是过期规则——内存池条目有存活时限,默认三百三十六小时(两周),重启时已经过期的交易不会被重新向网络广播。换句话说,mempool.dat 保住了你“看见过哪些单”的记忆,但超过两周的老单会被扫进淘汰流程,这是内存池防积压的常规卫生规则,不是针对重启的特例。规范同时留了新旧两种序列化格式:默认使用较新的格式,-persistmempoolv1 可以退回旧格式以兼容更老的版本工具。

它跟你的钱包不是一回事

很多用户把两件事混在一起:节点保存了内存池,并不等于你的转账被“保管”了。交易的存活依赖至少一个节点持续为它广播,mempool.dat 的作用只是让你的节点在重启后仍记得并继续帮助传播。真正对你那笔钱负责的是钱包的重发机制:主流钱包会周期性地把自己未确认的交易重新洪泛一遍。节点重启后,你的转账大概率活得好好的——前提是你的交易此前至少被网络正常中继过。反过来说,如果你刚用极低费率发了一笔单就拔电重启,恰好所有邻居也把它丢了,那这笔单要等钱包主动重发才会重新出现在视野里,两种机制互为保险。

实操含义

家用节点升级版本、断电维护、换硬盘搬迁之前,正常关机即可,默认行为(关机保存、开机加载)不需要额外配置;如果你把 -persistmempool 显式关了,内存池记忆就真的归零。排障时值得记住一条推论:刚重启的节点给出的费率估算和“未确认交易列表”可能虚少——不是网络没单,是你还没想起来。怀疑某笔交易“不见了”时,先区分三种身份:仍在别人的内存池里(还活着)、被某节点丢弃(钱包会重发)、进块或被永久双花(另有结局),对照钱包广播状态和区块浏览器交叉核对。本文讨论节点机制,不构成投资建议。

与另外两个“重启”混淆点

内存池持久化常被和另外两件事搞混。第一是 -persistmempool 与钱包无关:节点记得交易不代表你的钱包记得,钱包有自己的一套未确认交易记录与广播循环,两者各自独立,任何一环失效都需要各自排查。第二是它与 savemempool 这类手工命令的关系:两者写的是同一份文件,如果你曾对某笔交易做过优先度调整,这份调整会随文件一起被带走,重启后仍然生效——这既是特性也是隐患,某些调试期调高的优先度可能悄悄影响很久之后的排队判断,遇到费率估算反常时值得把它列入嫌疑名单。还有一处细节:文件序列化有新旧两种格式,跨大版本回滚时老版本可能读不懂新版本写下的文件,读不进去的表现是重启后内存池空荡,而不是报错崩溃。

家用节点的三条实操推论

第一,正常关机比强制断电友好:快照是在关闭流程里写出的,异常断电时这次记忆大概率没落盘,但代价只是重启后少一批“见过的旧单”,账本不受任何影响。第二,刚重启完的节点不适合立刻做费率判断:内存池尚未被邻居重新灌满,费率估算器和“未确认交易数量”都会偏乐观,等几分钟与邻居对完账再取数更可信。第三,如果你把内存池上限调得很小,重启读档时超容量的交易会被按费率规则边灌边丢,最终看到的池子可能明显小于关机前——这不是丢币,是同一套限额规则在两个时刻各自生效的正常结果。记住内存池的定位:一块可再生缓存,谁也没有义务替你保存交易,能替你重复喊话的是钱包的广播循环。