PSBT 离线签名是什么?一台不联网的机器怎么签比特币交易 图 1
PSBT 离线签名是什么?一台不联网的机器怎么签比特币交易 · 图 1

一个格式解决什么问题

普通钱包签名默认“这台机器知道链上还有什么钱”:它从节点或接口读取你的未花费输出,把要花的输入信息一起塞进交易。冷钱包场景恰恰相反——签名设备不联网,读不到链上状态。BIP-174 定义的 PSBT(Partially Signed Bitcoin Transaction,部分签名比特币交易)就是为此设计的中间格式:一个半成品交易包,除了未完成的交易本身,还打包了签名方需要的所有背景材料——每个输入对应的完整前一笔交易、公钥和脚本信息,让离线设备不需要任何网络查询就能核对“我到底在签什么”,并在信息不全时拒绝签。规范里明确说明:所有必要信息都会随交易提供,签名方可以完全离线工作。这份规范状态为已部署(Deployed),Bitcoin Core 自 2018 年合入相应序列化与 RPC 支持,文件以 .psbt 为扩展名,传输时常用 Base64 编码。

PSBT 离线签名是什么?一台不联网的机器怎么签比特币交易 图 2
PSBT 离线签名是什么?一台不联网的机器怎么签比特币交易 · 图 2

六个角色的流水线

规范把一次协作签名拆成六个角色,实际流程里常常是两台机器分摊:联网端做创建(Creator)和更新(Updater),把交易草案和输入材料填齐;离线设备做签名(Signer),只往里添加自己那部分签名;多方共管时由合并方(Combiner)汇总各家签名;终结器(Finalizer)把集齐的签名组装成完整解锁脚本;最后由提取器(Extractor)导出标准交易并广播。Bitcoin Core 为此提供了一组配套 RPC,例如 analyzepsbt 用来查看一个 PSBT 当前缺什么、下一步该谁动手,joinpsbts 合并多个 PSBT,finalizepsbt 完成组装。

一个值得单独说的边界:签名方按规范“只添加数据、不删改内容”。一个被恶意构造的 PSBT 如果偷偷改了收款或找零结构,核对环节应能暴露——这也是离线设备显示“变更金额与找零地址”给你人工确认的意义。找零地址不是你认识的地址类型时(例如声称是同一钱包的找零却对不上派生路径),要停止签名继续核查。

典型操作动线

以“热机建单 + 冷机签名”为例:热端创建并填齐材料,导出 unsigned.psbt;经 U 盘一类的单向介质拷贝到离线机;离线设备上验读收款地址、金额、找零和手续费,确认无误后签名,导出加了签名的 PSBT;回到热端合并、终结、提取,广播上链。整条动线中私钥只出现在离线设备内部,联网端从头到尾接触到的都是没有私钥的材料。

还要分清 PSBT 和“签好待广播的交易”:PSBT 是过程容器,签完但最终化前的内容不能直接上链;反过来,一个已经完整的交易用 analyzepsbt 看会显示可终结或可提取,不代表还能安全地追加别的签名方。多人共管钱包(多家各持一词)是 PSBT 使用最集中的场景,但单用户冷钱包也适用同一流程。

多人共管时的实际形态

两家各持一个密钥的共管钱包是 PSBT 的教科书场景:热端建单后先给 A 的离线设备签,导出后转给 B 的设备再签,Combiner 汇总两份部分签名,凑齐脚本要求的签名数量后才能终结。这也是为什么 PSBT 的输入区可以为同一个输入保留多份不同公钥的部分签名——普通完整交易格式没有这个位置。分析下一步该谁签名,用 analyzepsbt 一类的分析工具最直接,它会按输入列出还缺哪些签名、脚本是否可终结,避免靠人脑记忆各方进度。

常见翻车点

  • 在联网电脑上完成“全部流程”只是把私钥搬回了危险区,离线签名的价值就归零了。
  • 中间介质被双向使用(同一个 U 盘在两台机器之间来回读写)会稀释隔离效果,能单向就单向。
  • 只核对收款金额忘了找零地址,是变更地址攻击的经典入口。
  • 签完忘了广播:PSBT 不提取不上链,钱哪儿也没去,隔几天链上环境变化后还得重新建单。

本文只讨论工具机制与流程,不构成投资建议。