createwatchonly 只读闪电钱包:十个密钥家族与签名外包的边界 图 1
createwatchonly 只读闪电钱包:十个密钥家族与签名外包的边界 · 图 1

AUG56 bitcoin body 254: createwatchonly

闪电节点的私钥一定存在节点机器上吗?LND 有一个几乎没人提的启动命令 lncli createwatchonly,它能在钱包初始化那一刻起就让节点里一把私钥都没有:账本照常记账,签名永远外包。这条命令是给远程签名部署准备的,但它顺带划清了一个很多人没想明白的边界:闪电节点的状态和它的密钥,本来就可以分居两处。

它只活在钱包解锁器阶段

createwatchonly 属于 walletunlocker 阶段命令,和 create、unlock、changepassword 这些启动期命令同场——也就是说,它只在 lnd 还没初始化钱包的窗口期可用,跑完这一次就再无此店。命令唯一的参数是一个 JSON 文件路径,作用是在只读模式下从零初始化钱包:钱包里不放任何私钥,官方描述明确它只适合搭配远程签名器使用,或者把 lnd 当作纯 PSBT 交互的链上钱包用。

JSON 文件的格式从哪来

这个账户清单 JSON 的格式与 lncli wallet accounts list 的输出一致,最省事的流程正是:先在远程签名器一侧用种子生成账户,导出各账户的扩展公钥,原样搬进 JSON。文件里每个账户两个关键字段:extended_public_key 与 derivation_path,例如 m/84'/0'/0' 这类派生路径配对应的公钥前缀。有一道硬校验值得抄下来:清单必须覆盖 lnd 内部使用的每一个密钥家族,源码在说明里写着目前是 0 到 9 共十个家族——少一个家族直接拒绝初始化。家族里除了普通收款用的外部与变更密钥,还包括撤销密钥、HTLC 密钥、付款基点密钥这些通道内部的秘密,这也解释了为什么只读节点离了签名器只能看不能动。

初始化后的三种姿势

命令支持 --stateless_init、--save_to 与 --mac_root_key 三个旗标。无状态初始化时守护进程不落盘任何 macaroon 文件,而是在响应里返回序列化的 admin macaroon,必须当场保存,否则得重建钱包才能找回访问权;--save_to 只在配合无状态初始化时有意义,单独设置会直接报错。--mac_root_key 允许指定十六进制的 macaroon 根密钥,让令牌体系可以在两台机器上确定性重建——这对灾备演练是实打实的便利。

值得想清楚的取舍

把私钥搬出节点,换来的是热机被攻破时通道资金不在抢劫路线上;代价是每一笔链上动作——开通道、清扫、出资交易——都要现场连线签名器,签名器的可用性变成了节点的可用性。而且要注意,远程签名器拿到的是完整的签名授权,它看到交易内容、决定签不签,信任只是从硬盘搬到了另一台机器和另一套访问控制上,并没有消失。闪电状态本身(通道进度、HTLC 记录)依旧存在节点本地,这部分不受密钥搬家影响,SCB 备份的义务一天都不能少。

什么部署值得走这条路

远程签名体系的经典分工是:签名器离线保管种子、按策略审批每一笔签名请求,闪电节点作为热机只负责状态机与网络。只读初始化让这种分工在钱包层面就是干净的——节点机器从第一天起没接触过种子,泄露面只剩状态数据与令牌。反过来说,只是想把节点跑在小机器上的用户并不需要它:普通 create 加良好的备份纪律足够,只读模式带来的每次签名多一跳延迟、多一个故障点,对单人自用是净负担。判断标准始终是一个问题:这台机器被完全攻破时,你损失的是状态还是资金。前者值得为此搭一套签名器运维,后者交给更简单的自托管方案即可。

风险提示:远程签名部署涉及密钥托管与通道资金安全,配置错误可能导致节点无法签署交易;本文为机制说明,不构成投资建议。