术语表 /交易与手续费
PSBT
又称部分签名比特币交易、BIP174。
- PSBT 是什么?
- PSBT 是一种尚未完成的交易文件:它包含输入、输出以及签名方验证这些内容所需的全部信息,并在设备之间传递,而不是通过网络传输。
规定于 BIP-174。
过去,签署比特币交易意味着把私钥交给构建该交易的任何程序。BIP174 于2018年把这两件事拆开,Bitcoin Core 在0.17.0版本中加入了支持,因此保管私钥的设备可以不同于联网的设备。如今所有硬件钱包和多重签名协调程序都支持该格式。
运作方式
PSBT 是一个由键值映射组成的容器:一个全局映射描述正在组装的交易,其后每个输入和每个输出各有一个映射。
文件以五个魔术字节 70 73 62 74 ff 开头,拼出"psbt"加一个分隔符。Base64 是传递它的常用方式,因此粘贴到文本框中的 PSBT 总是以字符 cHNidP8 开头。以其他方式开头的字符串不是 PSBT,无论发送者怎么说。
每个输入映射包含离线签名方无法自行查询的信息:
- 被花费的输出,使设备知道其所授权的确切金额和锁定脚本
- 赎回脚本或见证脚本,适用于币由某种策略而非单一密钥保护的情形
- 每个需要签名的密钥的派生路径和主密钥指纹,使持有正确种子的设备能够找到正确的子密钥
- 目前已收集的部分签名,每位签名方一个
输出映射同样携带派生信息,签名方由此可以确认找零输出确实属于其所保护的钱包。
BIP174 按角色而非程序划分工作。创建者生成骨架,更新者补全输入详情,签名者添加部分签名,合并者合并分别签名的文件,终结者把部分签名转换为有效的脚本或见证,提取者生成可广播的原始交易。同一款软件往往同时承担多个角色,但正是这种分工使不同厂商的文件得以互通。
该格式的设计允许签名方不理解某些字段。每个字段都带一个类型字节,不理解某个字段的签名方必须原样传递而不是丢弃,因此2018年编写的钱包仍能把文件交给为 Taproot 编写的钱包。BIP371 加入了 Taproot 字段;BIP370 定义了版本2,其中输入和输出在创建之后仍可添加,这正是协作式交易所需要的特性。
购买比特币时为何重要
当您把币从交易所转入自己的硬件钱包时,无论屏幕上是否显示,您都在使用 PSBT 格式。
它让私钥远离您的电脑。 您的笔记本电脑构建支出并生成 PSBT,Trezor 或 Ledger 读取后向您显示其内容,签名,再把文件交还。任何机密都不会经过数据线。这就是电脑被攻陷(尚可挽回)与助记词被攻陷(无法挽回)之间的区别。
它能防范找零地址被调包。 控制了您电脑的恶意软件可以显示一个看似正常的付款界面,同时悄悄把找零转到它自己的地址,而找零通常是较大的金额。由于文件为每个输出注明了派生路径,签名设备可以检查找零是否来自其自身的种子,并在不是时向您发出警告。请读设备屏幕,不要读浏览器标签页。
它让非工程师也能使用多重签名。 在两个硬件钱包和另一栋建筑中的一份备份之间分布的2-of-3方案,只有在未签名交易能够通过 SD 卡、二维码或电子邮件传递而不泄露任何信息时才可行。PSBT 不包含私钥,因此传输中丢失一份不会造成任何损失。
它是您的继承人所需要的部分。 对于比单密钥钱包更复杂的情形,一信封助记词不构成恢复计划。把助记词与钱包的输出描述符,以及一份注明可读取 PSBT 的软件的说明放在一起,这份计划就能在您身后继续有效。本站安全指南涵盖了该配置的其余部分。
逐步签署2-of-3提币
假设您在交易所购买了0.4 BTC,并提币到由三个密钥控制的保险库,其中任意两个即可花费。
数月后,您想转出其中一部分。笔记本电脑上的只读钱包加载了该保险库的描述符,不含任何私钥,由它构建交易:一个输入、一个付款输出和一个找零输出。2-of-3原生 segwit 输入约占105虚拟字节,两个输出约再占62,加上固定开销,整笔交易约为177虚拟字节,按8 sat/vB 计算,手续费约为1,400聪。
笔记本电脑写出一个 PSBT。您接入第一个硬件钱包,它读取文件,显示收款方、金额和手续费,并在输入映射中写入一个签名。随后您用 microSD 卡把文件带到第二台从未接触过网络的设备,它添加第二个签名。
回到笔记本电脑上,合并者合并这两份文件,终结者按脚本期望的顺序把签名组装成见证,提取者生成原始交易。直到此时,才有内容到达网络。在此之前,没有任何私钥离开设备,您所做的任何操作也不会被任何人看到。
PSBT vs 序列化交易
序列化交易是已完成的交易;PSBT 是一个工作区。广播 PSBT,所有节点都会拒绝,因为点对点协议不承载这种格式。反过来也成立:PSBT 包含已完成交易会丢弃的上下文,例如每个被花费输入的价值,以及每个地址由哪个密钥派生,而这恰恰是硬件钱包需要而区块不需要的信息。
PSBT vs 输出描述符
输出描述符描述的是一个钱包;PSBT 描述的是一笔支出。描述符是一行内容,注明脚本类型、密钥和派生路径,逐年不变。PSBT 是一次性的,每笔交易一个。对于单密钥钱包,仅凭助记词即可恢复一切,但对于多重签名,两者都需要:描述符用来确定哪些地址属于您,PSBT 用来把币从这些地址转出。