PSBT是键值映射容器,不是“带签名的交易文件”这么简单。全局、每个输入和每个输出都有独立映射,角色只能添加自己负责的信息,未知字段还必须保留。
本文专门讲字段归属、六种处理角色与v0/v2边界;一般多签步骤请参考站内PSBT流程页。
三个容易造成错误结论的做法
- 不要这样做:合并时丢弃“不认识”的字段导致下游信息消失
- 不要这样做:在错误输入映射写入签名或脚本
- 不要这样做:只改字符串版本号就把v0当成v2
三类映射怎样分工
| 映射 | 常见信息 | 不应放错的位置 |
|---|---|---|
| Global | v0未签名交易、版本、扩展全局字段 | 某个输入的签名 |
| Input Map | UTXO、sighash、脚本、派生、部分签名、最终见证 | 其他输入的字段 |
| Output Map | 输出脚本、派生路径、赎回或见证脚本 | 输入UTXO |
文件先以psbt魔术字节和0xff分隔符开头。每个映射由键值对组成,完整key必须唯一,以零长度key结束。创建者放入交易骨架,更新者补UTXO和脚本,签名者只加可验证签名,合并者合并不冲突字段,最终化者生成最终scriptSig/见证,提取者才输出可广播交易。
解析器遇到未知专有key时应原样保存。把v2字段直接塞进声明为v0的容器,可能让硬件钱包错误理解交易骨架。
事实与证据边界
| 核验项 | 可确认结论 |
|---|---|
| 三类映射 | BIP-174文件以psbt魔术字节和0xff分隔符开头,随后按全局、每个输入、每个输出组织键值映射。 |
| 六种角色流水线 | 创建、更新、签名、合并、最终化和提取角色只应补充自己负责的信息;同一映射中的完整key必须唯一。 |
| 未知字段保留 | 解析器与合并器要保留无法识别的专有或未来字段,BIP-370的PSBT v2改变全局交易表达,不能把两个版本字段直接混用。 |
从输入到验收
| 阶段 | 动作 |
|---|---|
| 准备 | 先验证魔术字节、版本和每个映射终止符 |
| 读取 | 检查同一映射是否存在重复完整key |
| 解释 | 按输入索引核对UTXO、金额、脚本和派生 |
| 复核 | 处理一轮后比较未知字段是否原样保留 |
| 收尾 | 最终化前保存原始PSBT,提取后重新计算txid |
把v0与v2边界写进回归测试
回归用例先准备一份黄金样本:对象、网络、版本和预期结果均已知。脚本完成“先验证魔术字节、版本和每个映射终止符”后只保存原始数据,再由独立模块执行“检查同一映射是否存在重复完整key”。黄金样本的作用是发现实现变化,不代表其他对象天然安全;测试报告必须注明它覆盖的具体范围。
负向用例至少两条。第一条构造“合并时丢弃“不认识”的字段导致下游信息消失”,第二条构造“在错误输入映射写入签名或脚本”。两条用例分别运行,禁止同时改变多个字段。合格实现会保留原始错误并停止在对应层级;自动切换网络、猜测未知字段或引用旧缓存都应让用例失败。
状态用例在动作前取得三类映射快照,执行“按输入索引核对UTXO、金额、脚本和派生”后再次取证,并对照六种角色流水线和未知字段保留。如果状态由节点视图、缓存或索引延迟造成,结果应注明观察来源。A时点和B时点必须各自保留,不能只存一条被覆盖的最终记录。
发布前由人工检查结果页是否同时显示原始字段、推导规则、单位或版本以及三态结论。触发“只改字符串版本号就把v0当成v2”时,系统必须建议“处理一轮后比较未知字段是否原样保留”并停止自动动作。回归记录由此覆盖正常、错误、状态变化和人工接管四条路径。
来源、增量与风险边界
- Bitcoin Improvement Proposals:正式接口、字段与规范语义。
- BIP-370:实现路径、兼容性或安全边界。
本文资料读取于2026-07-20。硬件钱包支持的PSBT版本与字段集合不同,传递前应校验版本并保存未经修改的原始文件。
站内相邻主题可继续阅读:PSBT签名流程、输出描述符。PSBT可能包含地址、余额和派生信息。传输前应保护隐私,硬件钱包不支持的版本不得强行降级。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。