BIP-143把输入金额写进version 0见证签名摘要,让离线设备能对主机提供的金额作出承诺。但摘要中的三个聚合哈希会随SIGHASH和ANYONECANPAY变化。
本文提供字段顺序和分支矩阵,区别于一般PSBT签名流程。
一手规范给出的结论
摘要字段顺序
BIP-143为version 0见证程序定义新的签名摘要,包含version、hashPrevouts、hashSequence、当前outpoint、scriptCode、输入金额和nSequence等字段。
金额承诺
输入金额被纳入承诺,使离线签名器可以在不下载完整前序交易的情况下验证主机提供的金额是否进入签名哈希。
SIGHASH分支矩阵
hashPrevouts、hashSequence与hashOutputs是否为空取决于SIGHASH类型和ANYONECANPAY标志,不能用一套固定摘要覆盖所有输入。
SIGHASH分支矩阵实操清单
- 识别当前输入的见证版本,确认适用BIP-143
- 取得scriptCode、前序输出金额和输入索引
- 按SIGHASH矩阵决定三个聚合哈希
- 按规定字节序拼接并做双SHA-256
- 用独立实现和已知测试向量比对摘要
摘要字段按什么顺序拼接
nVersion → hashPrevouts → hashSequence → outpoint → scriptCode → amount → nSequence → hashOutputs → nLockTime → sighashType。
| 标志 | hashPrevouts | hashSequence | hashOutputs |
|---|---|---|---|
| SIGHASH_ALL | 所有输入前序点 | 所有输入sequence | 全部输出 |
| SIGHASH_NONE | 视规则保留或置零 | 置零 | 置零 |
| SIGHASH_SINGLE | 视规则保留或置零 | 置零 | 仅对应索引输出 |
| ANYONECANPAY叠加 | 置零 | 置零 | 仍由基础类型决定 |
签名器收到输入金额后,应把它作为8字节小端整数放入摘要,再把设备显示的金额与该值对应。主机若伪造金额,最终签名承诺也会改变;但设备仍要知道输出和手续费,不能只看当前输入。
故障与停止条件
| 误判 | 正确处置 |
|---|---|
| 对所有SIGHASH类型固定使用同三个聚合哈希 | 保留原始证据,停止外推并按本文步骤复核 |
| 把BTC显示小数直接写入amount而非聪整数 | 保留原始证据,停止外推并按本文步骤复核 |
| 把BIP-143套到Taproot输入 | 保留原始证据,停止外推并按本文步骤复核 |
四问复评SIGHASH分支矩阵
输入是否能被别人重放?
用已知对象执行“识别当前输入的见证版本,确认适用BIP-143”,保存所有必需字段,而不是截图。第二个人根据摘要字段顺序重建同一请求或字节,再做“取得scriptCode、前序输出金额和输入索引”。如果缺少网络、版本、区块、账户或时间上下文,即使数值相同也不能算复现。
错误是否真的被拦住?
先只注入“对所有SIGHASH类型固定使用同三个聚合哈希”,记录预期错误与实际返回;恢复成功样本后,再单独注入“把BTC显示小数直接写入amount而非聪整数”。错误处理不得使用旧缓存冒充新结果,也不能把null、未知类型或权限失败自动改成零值。每个反例只变一个条件,才能定位校验是否生效。
状态变化后旧结论会不会残留?
围绕脚本版本边界制造一次可控变化,并在变化前后分别执行“按SIGHASH矩阵决定三个聚合哈希”。页面同时展示两份证据的对象、上下文和时间;新状态不能覆盖审计历史,旧状态也不能继续显示为当前完成。
什么时候停止自动流程?
一旦出现“把BIP-143套到Taproot输入”,状态转为待核验,并要求人工执行“按规定字节序拼接并做双SHA-256”。交接时把摘要字段顺序原文、金额承诺推导和SIGHASH分支矩阵验收分栏保存,使复核者能判断问题来自规范理解、现场环境还是展示逻辑。
来源、增量与风险边界
| 来源 | 本文用途 |
|---|---|
| Bitcoin Improvement Proposals | 正式接口、字段与规范语义 |
| BIP-141 | 实现路径、兼容性或安全边界 |
本文资料读取于2026-07-20。BIP-143只适用于version 0见证程序;Taproot等新版本使用不同签名规则,签名前必须先识别脚本版本。
站内相邻主题可继续阅读:PSBT签名流程、比特币交易结构。SIGHASH会决定签名承诺哪些输入和输出。硬件钱包若不能明确显示类型、金额与接收方,应停止签名。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。