比特币核心在正常退出时会把内存池写进 mempool.dat,下次启动再读回来——这个行为由 persistmempool 控制,默认开启,已有专文讲过。但很少有人问:这份文件的格式改版了怎么办?v27 起源码里多了一个过渡开关 -persistmempoolv1,v31.0 仍在参数表中,帮助文本自己写明”这是一个未来会被移除的临时选项”。本文拆解它存在的理由、读写两条路径的兼容性设计,以及降级节点时它真正能帮上忙的场景。
文件为什么会分版本
mempool.dat 的 v2 格式与 v1 的差异不在交易结构,而在文件层的混淆处理:27.0 的发布说明写明,新格式给文件加入了 XOR 混淆键,目的是减少外部程序(比如杀毒软件)试图解析并改动这份文件引发的问题;同时明说新格式无法被旧版本软件读取。v31.0 源码把这件事写成了两个魔数:常量 1 对应无混淆键的旧格式,常量 2 对应在文件头携带混淆键的新格式。读端两种魔数都认;写端则按配置选择——-persistmempoolv1 打开时写 1,默认关时写 2。也就是说”能不能读”和”写成什么”是两套独立策略,这个开关只管后者。
读端宽容带来的直接结论:新版本二进制无论遇到哪种文件都能装载;但把 v2 文件拿给只会 v1 的旧二进制,读盘直接返回失败,重启后在途交易视图回到冷启动状态。这份缓存的容错等级很高——日志留下一行 “Failed to deserialize mempool data” 后节点照常工作——版本不匹配不会伤及链上数据,丢的只是一次”无缝重启”的体验。

真正的用武之地:降级而非升级
升级方向通常不需要动这个开关:新二进制读得懂旧文件。参数设计的意图恰恰相反——当你要把节点退回旧版本时,如果直接让新版本写 v2,旧版本读不懂,在途交易视图就丢了。提前把 -persistmempoolv1=1 打开,让落盘文件保持 v1 格式,降级后旧二进制仍可读回。帮助文本提到”临时选项、未来移除”,指的是格式迁移完成后这个兼容桥会被拆掉,因此不要把它写进长期配置里当作常规项。
操作顺序上有两个纪律值得强调。第一,降级前先正常停止节点(stop,而不是强杀进程),因为手动触发落盘的 savemempool 与关机自动保存走的都是写入端逻辑,配合 v1 开关才能产出旧版本可读的文件;第二,降级完成、确认稳定后,把这行配置删掉,让文件重新回到当前格式,否则将来升级时又欠一次格式债。
读盘时的验收不是走过场
无论文件来自哪个版本,装载时每一笔交易都会重新走一遍标准验收,而不是无条件信任磁盘内容。依赖输入已经进块的残单、费率过期的条目会在加载阶段被静默丢弃。这意味着文件更像”重启后的视图恢复提示”,不是权威状态;哪怕文件被精心构造,也不会让节点接受它本来会拒绝的交易。
顺带一个常被误读的点:这份文件只帮本机恢复视图。如果全网只剩你的节点记得某笔低费率交易,重启后它仍可能消失在网络里,需要手动重发。文件级的容错也提醒运维注意权限——文件里是未确认交易的明文,同机多人环境应收紧数据目录读取权限。
怎么确认当前写的哪个版本
最直接的办法是文件字节层面看头部魔数差异,但对多数人更实用的做法是记住三件事:默认写 v2;只有配置里显式打开 v1 开关才会写旧格式;读盘永远两种都试。若怀疑版本问题,把文件改名备份后重启节点,看日志是否还有反序列化失败行即可判别——这是无破坏性的二分法。
最后划一条边界:-persistmempool 决定”写不写”,-persistmempoolv1 决定”写成什么版本”,两个参数一个管开关一个管格式,把它们混为一谈是社区帖子里的高频错误。排查问题时先分清自己在问哪个问题。
风险提示:本文为客户端参数与文件格式机制说明,对应 Bitcoin Core v31.0 源码与 v27 起的变更历史,该开关将在未来版本移除;不构成投资建议,任何降级操作前请完整备份数据目录并在测试环境演练。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。