节点维护者大概都试过这个操作:把 savemempool 生成的 mempool.dat 拷到另一台机器,或者在重装系统后试图用 importmempool 把它喂回节点。命令本身很短,文档里那三个不起眼的命名参数却决定了导入结果可能完全不同。它们默认值各不相同,官方对每一项都挂了一句同样的警告:Importing untrusted metadata may lead to unexpected issues and undesirable behavior——导入不可信元数据可能带来不期望的行为。这句话不是客套,值得逐项拆开。
importmempool 的第一个参数是文件路径,指向一个此前由 savemempool(或节点自动持久化流程)写出的 dump 文件。第二个参数是一个 JSON 选项对象,目前文档列出三个布尔项。第一项 use_current_time,默认 true。每笔进入内存池的交易在 dump 时会记录一个”入场时间”元数据,内存池的过期与驱逐逻辑都会参考它。设为 true 时,导入的交易按当前系统时间重新计时,相当于当作刚收到的交易;设为 false 则沿用文件里记录的旧时间——如果这份文件是几天前导出的,交易一进来就濒临过期线,可能下一轮清理就被扔出去。日常”维护后恢复”的场景保持默认即可;做回放实验、想还原当时的过期节奏时才需要关掉。
第二项 apply_fee_delta_priority,默认 false。这里的 fee delta 指通过 prioritisetransaction 对单笔交易施加的优先级偏移,它作为元数据一起写进 dump 文件。默认不应用,意味着即便文件里带着”这台节点曾经特别照顾某些交易”的记录,导入后也一律按普通交易对待。这个默认值是合理的:fee delta 是节点主人的本地调度意图,把别人机器上的调度偏好原样搬进自己的内存池,等于接受了别人的排序意志。只有当你明确知道这份文件来自自己的旧实例、想原样恢复排序状态时,才把它打开。文档在这里的措辞也更重:Only set this bool if you understand what it does。
第三项 apply_unbroadcast_set,默认 false。unbroadcast 集合是节点”已经接受进内存池、但还没成功广播给任何对端”的交易清单。打开它,导入文件里的未广播清单会接管当前节点的对应集合。对普通单节点用户,这个状态重启后自然会重建,没必要跨机器搬运;它更多服务于双节点热备或迁移场景,让接管方立刻继承”这些交易还欠着广播”的账务。同样的警告依旧适用:不可信文件里的这份清单会直接影响你的节点接下来主动重发什么。
把三个选项放在一起看,会发现一个共同的设计姿态:文件里的交易本体可以照收,但”原节点的行为意图”一律默认不继承。交易合不合法由你自己的验证逻辑重新判定,这一点无论选项怎么设都不变;选项只决定那些改变处理方式的附属信息带不带来。换句话说,importmempool 传输的是账本线索,不是信任状。
实操建议按场景分。本机重装后恢复自己导出的文件:三个选项按默认,必要时用 getrawmempool 详细模式核对几笔关键交易还在不在。跨机器导入来源不明的文件:默认值下风险已经收窄,但要清楚导入的交易仍然会占用你的内存池预算、参与你的区块组装候选,别把它当只读操作。多机排障、想把某台高水位节点的内存池”复制现场”过来复现拥堵:记得 use_current_time 设 false 才能还原时间线,同时接受驱逐顺序可能与原机不同。
最后一条纪律:mempool.dat 是明文可解析的文件,内容会随时间过时,导入前顺手确认导出时间,并且只从自己控制的存储读取。
风险提示:本文参数默认值与行为随比特币核心版本变化,以所用版本官方 RPC 文档复核为准;导入不当可能改变本地内存池状态,操作前建议对数据目录与 dump 文件做备份。本文不构成投资建议。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。