PSBT里的未签名交易:scriptSig和见证为什么必须留空

PSBT全局映射里的未签名交易字段(PSBTGLOBALUNSIGNED_TX = 0x00)要求每个输入的scriptSig和见证数据都为空,这是BIP 174对字段序列化的硬性规定,不是可选项。该字段承载的是尚未签名的交易骨架,任何已填入的解锁脚本或见证数据都会让字段内容偏离类型定义。这条要求只说明字段的序列化条件,不涉及签名流程的先后顺序。

未签名交易、空scriptSig、旧序列化
本文涉及的概念与核对环节。

字段本身规定了什么

按BIP 174的全局类型表,0x00类型的keydata为None,valuedata是一段“网络序列化格式的交易”,并附带两条约束:每个输入的scriptSig和见证必须为空;交易必须采用不含见证的旧序列化格式。换言之,写入该字段的交易在结构上不能携带任何解锁数据。这一规定适用于所有携带0x00类型字段的PSBT,条件是该字段存在并被解析。

scriptSig为什么不能预填

scriptSig是输入中用于满足锁定脚本的解锁数据。在未签名交易阶段,这部分数据尚未产生,也不应由某一方预先写入。若允许非空,同一笔交易骨架在不同参与方之间就可能携带不同的解锁数据,各方对同一份未签名交易的共同基准便不复存在。要求留空,等于把这部分统一留给后续环节填充,使所有参与方面对同一份可识别的交易骨架。这是由字段定义直接推出的约束,不是额外约定。

见证数据为什么同样必须为空

同一字段还要求旧序列化格式(不含见证)。见证数据在隔离见证结构中单独存放,若在未签名交易里预先带入见证,字段内容就不再符合旧序列化格式的类型定义。把见证留空,使该字段只描述“花哪些输入、产生哪些输出”的骨架,不承载任何证明性数据。

留空带来的实际意义

对PSBT的解析方而言,空的scriptSig和空的见证使未签名交易成为一个稳定、可校验的基准:各参与方可以据此核对输入输出,再分别提供各自的签名材料。若该字段被填入非空数据,解析方无法区分这是未签名骨架还是夹带了部分解锁数据的半成品,字段的语义就被破坏。因此,这条要求属于PSBT全局映射的格式前提,而非可有可无的惯例。

原始资料

bips.dev

上一篇 比特币内存池交易为何要数祖先和后代:ancestor与descendant字段怎么读