-prune 参数的三个档位:0、1 和那个 550 的数字 图 1
-prune 参数的三个档位:0、1 和那个 550 的数字 · 图 1

比特币核心的配置手册里,-prune 是唯一一个”取值不同档位、行为语义就完全不同”的参数:0、1、以及一个不小于 550 的整数,三档分别对应”不修剪""只许手动修剪""自动维持容量目标”。多数教程只讲第三档,本文把三档的确切语义、两个隐藏门槛(550 MiB 与十万块高度)和不可回退性一次讲清,全部依据 v31.0 源码。

一、参数文本里的三档。init.cpp 对 -prune 的官方解释是:启用后允许调用 pruneblockchain RPC 删除特定区块;提供目标容量(单位 MiB)时启用自动修剪。括号里的默认值说明写着三行——0 表示关闭区块修剪;1 表示允许通过 RPC 手动修剪;不小于某个常数表示自动把区块文件维持在目标大小之下,而这个常数就是 validation.h 里的 MIN_DISK_SPACE_FOR_BLOCK_FILES,等于 550 MiB。也就是说写 -prune=100 不会得到 100 MiB 的目标,参数文本上低于 550 的自动档位根本不成立。

二、被修剪的到底是什么。修剪删除的是区块正文所在的 blk 开头的.dat 文件,区块头全部保留——这决定了修剪节点仍然验证每一条共识规则、仍然知道链上每个区块的哈希与工作量,只是拿不出正文。后果清单:不能给新全节点提供历史区块,不能执行重扫(钱包首次同步类操作依赖 getblock 回读历史区块),REST 与 RPC 取历史区块会报”已修剪”。交易本身没有”被删”——只要它还在 UTXO 集合里,其存在性由 UTXO 数据库维护;丢的是那笔交易完整原始字节以及重放历史的能力。

三、隐藏门槛一:十万块高度。链参数里 mainnet 的 nPruneAfterHeight 等于 100000。含义是自动修剪即便开启,也只对高度超过十万的区块动手;测试网络与回归测试用 1000、调试开关 fastprune 用 100,都是同一机制的不同档位。这个设计保证修剪节点至少保留从创世到十万块约两年历史的一整段连续正文——早期链状态出问题时有据可查,也避免新节点刚同步就把自己掏空。

四、隐藏门槛二:与 -txindex 互斥,且不可回退。参数文本明写修剪模式与 -txindex 不兼容:事务索引要求随时能按交易 ID 找回正文,与删除正文的存在性矛盾。更要紧的是那句警告——把 -prune 改回 0 不会找回数据,唯一的补救是从头重新下载整条链。容量规划的纪律因此是单向门:先把目标容量按”区块链当前体积加未来一两年的年增量”算够,再开自动档;宁大勿小,因为扩容易、回退难。

五、档位怎么选。第一档 0 适合日常全节点:硬盘充裕时保留全部历史,还能给全网供块,这是参与网络最完整的方式。第二档 1 是夹在中间的选项:不自动删任何东西,但保留 pruneblockchain 这个手动工具——典型用法是磁盘临时告急时手工删掉最老的若干文件救急,平时行为与全节点完全一致。第三档适合”只想验证、不想存史”的小容量设备,用磁盘换掉历史访问能力。三档之外没有第四档:prune 数字不是”保留多少 GB”的承诺,自动修剪只在磁盘逼近水位时才动手删文件,平时区块照常增长,所以实际占用会在目标值上下波动而不是钉死。

六、一个常见误解。有人把修剪节点当轻节点用,这是范畴错误:修剪节点仍然下载并验证每一个新区块的每一笔交易,同步成本、内存成本与全节点几乎相同,省的只是长期存储。如果你的目标是”少干活只验证”,对应方案是 SPV 或带区块过滤器的轻客户端,那是另一套安全假设。修剪是三档参数里最不可逆的一档,开之前值得把”你多久需要一次历史区块”这个问题想清楚。

风险提示:本文内容为技术机制科普,不构成任何投资建议、收益承诺或买卖时机判断。涉及协议规则与软件行为的描述以对应软件版本(文中已标注)的官方源码与规范为准。涉及资金操作的(如通道强制关闭、修剪开关),请先在测试网或小额环境验证。

-prune 参数的三个档位:0、1 和那个 550 的数字 图 2
-prune 参数的三个档位:0、1 和那个 550 的数字 · 图 2