
签名标识用于指示交易的哪一部分已由ECDSA签名签署。这种标识签名的机制提供了构建交易的灵活性。比特币里一共有6种不同的标识组合可以添加到交易中的数字签名上。请注意,不同的输入可以使用不同的签名标识,从而在花费资金的条件上实现复杂的组合。
注意:目前所有的BSV交易都需要一个额外的签名标识,称为SIGHASH_FORKID,具体表示为 0x40。
下表展示了使用不同类型的SIGHASH,表示交易的哪些部分已被ECDSA签名、哪些部分未被ECDSA签名。
始终被签名的项目
所有输入上的签名都会对TXID和VOUT进行签名,这些TXID和VOUT包括正在使用的输出点(outpoint),以及正在评估交易的协议版本,和应用于该交易的锁定时间。
永远不会被签名的项目
交易的解锁脚本部分永远不会被签名。
SIGHASH_ALL
SIGHASH_ALL对用于构建交易的所有输入和输出进行签名。一旦使用 SIGHASH_ALL签名的输入被添加到交易中,除非该签名失效,否则交易内的任何信息都将无法被更改。
SIGHASH_SINGLE
SIGHASH_SINGLE对所有输入和与被签名的输入有相同索引的输出进行签名。 如果该输出或任何输入发生更改,则该签名将失效。
SIGHASH_NONE
SIGHASH_NONE对所有输入进行签名,而不为输出签名。在签名未失效的情况下,任何输出都可以更改;但是如果对任何输入进行变更,签名就会失效。
SIGHASH_ALL|ANYONECANPAY
一旦将使用 SIGHASH_ALL|ANYONECANPAY 签名的输入添加到交易中,除非该签名失效,否则将无法更改或添加输出。
SIGHASH_SINGLE|ANYONECANPAY
SIGHASH_SINGLE|ANYONECANPAY用来对正在签名的输入和与之有相同索引的输出进行签名。如果该输出被更改,则该签名就会失效。
SIGHASH_NONE|ANYONECANPAY
SIGHASH_NONE|ANYONECANPAY用来签署单个输入,但不签署输出。这种类型的签名可用于轻松地在不创建链上操作的情况下,将资金分配给个人或智能合约。
应用实例
签名标识在构建支付信道(payment channel)中的智能合约和可协商交易时,应用广泛。
用例1:众筹项目
使用ALL|ANYONECANPAY允许交易有一个或多个固定输出,同时保持输入列表处于可编辑的状态。也就是说,任何人都可以将带有签名的输入添加到交易中,而不会使所有现有签名失效。
用例2:空白支票
使用NONE系列的标识,允许任何人将他们想要的输出添加到交易中,以声明他们对输入中的资金的合法使用权。
用例3:模块化交易
使用SINGLE|ANYONECANPAY可将交易模块化。任何数量的交易都可以合并为一个交易。
参考资料
https://github.com/bitcoin-sv/bitcoin-sv/blob/master/src/script/sighashtype.h