钱包标志七件套:flags 数组里哪一项能改、哪六项落子无悔 图 1
钱包标志七件套:flags 数组里哪一项能改、哪六项落子无悔 · 图 1

用 Bitcoin Core 的 RPC 自查钱包时,getwalletinfo 的返回里有一个容易被忽略的角落:flags 数组。它列出的不是零散布尔值,而是一张固定的字符串映射表——v31.0 源码 wallet.h 里的 WALLET_FLAG_TO_STRING 把内部位标志翻译成 avoid_reuseblankkey_origin_metadatalast_hardened_xpub_cacheddisable_private_keysdescriptor_walletexternal_signer 七个字符串。对照同一文件里的两张集合可以看出钱包子系统的能力边界:KNOWN_WALLET_FLAGS 收录全部七位,MUTABLE_WALLET_FLAGS 却只有 avoid_reuse 一位——能安全开关的只有它,其余六个一旦写定就跟随钱包终生。

为什么可改的只有一个?每个标志背后的含义解释了这一点。descriptor_wallet 决定账本的地址管理范式,legacy 到描述符的转换要走 migratewallet 的完整迁移;disable_private_keys 是观察钱包的封条,打上它的目的就是”让任何人再也无法给这个钱包塞私钥”,可逆的话封条就毫无意义——想恢复签名能力,正确路径是从备份新建钱包;external_signer 意味着签名工作全部外包给 -signer 配置的外部设备,钱包本体只保留公钥与描述符,这个状态由 createwalletexternal_signer 参数在创建时一次性敲定,且官方文档写明它要求 disable_private_keysdescriptors 同时为真。blank 记录的是”创建时故意不装密钥”的空白状态,导入第一条描述符后钱包开始工作,但这个标志位作为出生证明留在表里。key_origin_metadatalast_hardened_xpub_cached 则记录钱包是否维护密钥来源元数据、是否缓存了最后一层硬化扩展公钥,属于结构性优化开关。

由此可以整理一份实用的读法。看到 flags: [] 空数组,说明这是最普通的创建路径:没开防复用、不是空白钱包、没有禁用私钥、也不是硬件签名钱包,但它几乎一定带着 descriptor_wallet——注意 v31 文档里 createwalletdescriptors 参数默认值已变为必真,纯 legacy 钱包在 v28 之后进入退役通道,新建钱包不再提供非描述符选项。看到 disable_private_keys,这是一台观察钱包,配对的用法是用 importdescriptors 导入 xpub 派生的描述符,能查账不能花钱。看到 external_signer,说明这个节点只是遥控器,动钱需要设备确认。看到 avoid_reuse,就该预期 getbalances 会多出一组 “trusted/maybe_untrusted/immature” 之外的脏币统计,钱包在选币时也强制整地址清扫——avoidpartialspends 的行为帮助文本写明:启用了 avoid_reuse 的钱包永远启用按地址归组选币,不留关闭余地。

一个常见事故与这张表直接相关:有人为了”更安全”在别处看到建议,就用文本编辑器硬改钱包数据库里的 flag 位,比如强行关掉 disable_private_keys。正确答案是它关不掉——数据库里的位只是映射表的投影,恢复签名能力的唯一路径是备份短语重建。反过来,avoid_reuse 开着觉得碍事,setwalletflag 一条命令即可,官方给这个命令写的唯一可改标志就是它,文档与源码在这里严丝合缝。所以记住那条分层:能进 MUTABLE 集合的才允许命令改,改不了的靠重建,绕开映射表直接改文件属于自毁行为。

还有一格值得填上:blankkeypoolsize 的关系。空白钱包刚建好时两条池子都是 0,getnewaddress 会失败——这不是 bug,钱包此刻连一条描述符都没有,生成地址自然无从谈起。正确流程是 createwallet "名字" true(第二个参数置真即建空白钱包),随后立即 encryptwallet 设定口令,最后用 importdescriptors 注入第一条描述符:空白钱包存在的意义正是”先加密、后放钥匙”,让密钥进入钱包的第一刻起就处于口令保护之下,跳过这个顺序,空白特性就白设计了。加密之后 getwalletinfo 里还会多出一个 unlocked_until 字段(仅对口令加密钱包出现),文档写明它是”钱包保持解锁用于转账的截止时间戳,锁定时为 0”——拿它和当前时间一比,就知道签名窗口还剩几秒、或者钱包根本没解锁,是排查”明明没操作却提示钱包已锁定”时最直接的钟。

风险提示:标志位集合与默认值以 Bitcoin Core v31.0 源码及 RPC 文档为准,版本升级可能调整;对钱包文件的直接改写可能导致资产不可用,本文不构成操作建议或投资建议。

钱包标志七件套:flags 数组里哪一项能改、哪六项落子无悔 图 2
钱包标志七件套:flags 数组里哪一项能改、哪六项落子无悔 · 图 2