一、FundPsbt 在 LND 里的位置
LND 的链上钱包能力拆在两个 gRPC 接口里:lightning.proto 负责通道与支付流程,walletkit.proto(lncli wallet 命令群)负责出资、签名与广播。FundPsbt 是 walletkit 里负责”把 PSBT 装到够钱”的主力接口:你给它一份目标输出和费率,它把输入凑够,返回一份出资完成但未必签名的 PSBT。它和比特币核心的 walletcreatefundedpsbt 是同类角色,但选币与锁币的细节规则完全不同。本文按 LND v0.19.0-beta 的接口定义与注释核对。

二、三种递交模板的方式
接口注释写明有三种模式:第一种 psbt 字段,传统方式,直接塞一份你自己拼好输入输出的 PSBT,不做选币;第二种 raw 字段,用 RPC 原生消息逐条列输入输出,规则与第一种同款;第三种 coin_select 字段,是 0.19 系列新增的模式,接受一份已经写了输入输出的 PSBT,同时允许 LND 在此基础上继续做选币补齐。
前两种模式带着两条硬约束:模板里没有输入,LND 自动选币补上;模板里已经写了输入,LND 就认定选币已在外部完成,一个输入都不会多给,如果这些输入按你给的费率不够覆盖输出,直接返回错误而不是自作主张加钱。coin_select 模式正是为解除这条二选一边界而生——保留你挑的输入,缺的部分由选币器续上。选择哪种模式,可以先问一句:我要不要”我挑的保留、剩下的你来补”?要,就只有第三种。
三、锁币规则:进门先锁,出门自理
注释里有一句覆盖全部三种模式的说明:凡是在模板里指定的输入,只要属于本节点钱包,就必须由调用方提前锁定;而无论走选币还是走输入校验,结束后所有输入 UTXO 都会以一个内部应用 ID 统一上锁。最后一段 NOTE 是整个接口最要紧的部分——FundPsbt 只要不带错误返回,这批被锁 UTXO 的责任就整体移交调用方:要么把交易走完签名、打包、广播,真正把锁住的币花掉;要么在任何出错分支上主动解锁。锁不会自己消失,选币、wallet sendcoins、开通道等其他流程都会绕开这些被占用的币。忘记释放的典型症状,是钱包明明有余额,各种操作却反复报”没有可用输入”。
四、和周边命令的配合姿势
FundPsbt 产出的只是”已出资”:输入带齐了 UTXO 信息,签名还没动。常见链路是接着 wallet psbt sign 补本节点签名、wallet psbt finalize 收尾见证、最后 wallet publishtx 广播。签名接口的注释明确说自己只做签名,不做选币、不锁币、不广播——每个接口只承担一段,这正是 PSBT 分段设计在 LND 里的落法。排障时最常见的事故来源,就是把释放锁的责任寄托在”后面一步会自动处理”上:后面任何一步失败,解锁只可能发生在调用方自己的代码路径里。
五、和核心版 walletcreatefundedpsbt 的对照
习惯比特币核心的维护者迁移过来时,最容易踩的三个差异都在这里:核心版选币在钱包内部一次完成且不向调用方暴露锁概念(靠 lockunspent 另行管理),LND 则把锁作为接口语义的一等公民写进注释;核心版的模板只有一种 PSBT 形态,LND 拆出 coin_select 解决”已有输入仍想补币”的空档;核心版对 feeRate 与 changePosition 有一组选项对象,LND 侧对应的是费率与选币策略字段。两套 PSBT 工具在报文层互通——同一份半成品在两边都能被继续签名——但”谁在管锁”这条线不互通,把核心版脚本习惯直接搬到 LND 上跑,事故几乎都出在忘了解锁。
六、边界与自查清单
第一,锁是 LND 钱包层的记账,链上没有任何约束力;如果有其他程序或另一套系统也在同一钱包上动币,它挡不住别人按原样花掉同一枚 UTXO,只能靠同一进程内的约定。第二,交付脚本时把三件事列进验收:出错分支是否调用解锁、wallet listleases 定期盘点有没有过期未放的租约、重启节点后锁状态是否符合预期。FundPsbt 的内部应用 ID 锁与显式 wallet leaseoutput 签发的租约是两套记账,别拿一个命令去查另一个的锁。
风险提示:本文涉及的钱包操作会真实动用资金,请先在测试网验证出错分支与解锁路径。本文只做机制说明,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。