精通比特币(35):签名哈希类型(SIGHASH)及使用

  • A+
数字签名被应用于消息,在比特币中,就是交易本身。签名意味着签字人对特定交易数据的承诺( commitment)。

 

在一个交易中一个签名可以只承诺(commit)一个数据子集。

 

比特币签名具有指示交易数据的哪一部分包含在使用 SIGHASH 标志的私钥签名的哈希中的方式。 SIGHASH 标志是附加到签名的单个字节。每个签名都有一个SIGHASH标志,该标志在不同输入之间也可以不同。具有三个签名输入的交易可以具有不同SIGHASH标志的三个签名,每个签名签署(承诺)交易的不同部分。

 

记住,每个输入可能在其解锁脚本中包含一个签名。因此,包含多个输入的交易可以拥有具有不同SIGHASH标志的签名,这些标志在每个输入中承诺交易的不同部分。还要注意,比特币交易可能包含来自不同“所有者”的输入,他们在部分构建(和无效)的交易中可能仅签署一个输入,继而与他人协作收集所有必要的签名后再使交易生效。许多SIGHSASH标志类型,只有在你考虑到由许多参与者在比特币网络之外共同协作去更新仅部分签署了的交易,才具有意义。

 

有三个SIGHASH标志:ALL,NONE和SINGLE
精通比特币(35):签名哈希类型(SIGHASH)及使用
SIGHASH标志在签名和验证期间应用的方式是建立交易的副本和删节其中的某些字段(设置长度为零并清空),继而生成的交易被序列化,SIGHASH标志被添加到序列化交易的结尾,并将结果哈希化 ,得到的哈希值本身即是被签名的“消息”。 基于SIGHASH标志的使用,交易的不同部分被删节。 所得到的哈希值取决于交易中数据的不同子集。 在哈希化前,SIGHASH作为最后一步被包含在内,签名也会对SIGHASH类型进行签署,因此不能更改(例如,被矿工)。
小贴士:所有SIGHASH类型对应交易nLocktime字段。 此外,SIGHASH类型本身在签名之前附加到交易,因此一旦签名就不能修改它。

 

如何在实践中使用SIGHASH类型

ALL | ANYONECANPAY
这种构造可以用来做“众筹”交易,试图筹集资金的人可以用单笔输出来构建一个交易,单笔输出将“目标”金额付给众筹发起人。这样的交易显然是无效的,因为它没有输入。但是现在其他人可以通过添加自己的输入作为捐赠来修改它们,他们用ALL | ANYONECANPAY签署自己的输入,除非收集到足够的输入以达到输出的价值,交易无效,每次捐赠是一项“抵押”,直到募集整个目标金额才能由募款人收取。

 

NONE
该结构可用于创建特定数量的“不记名支票”或“空白支票”。它对输入进行承诺,但允许输出锁定脚本被更改。任何人都可以将自己的比特币地址写入输出锁定脚本并兑换交易。然而,输出值本身被签名锁定。

 

NONE | ANYONECANPAY
这种构造可以用来建造一个“吸尘器”。在他们的钱包中拥有微小UTXO的用户无法花费这些费用,因为手续费用超过了这些微小UTXO的价值。借助这种类型的签名,微小UTXO可以为任何人捐赠,以便随时随地收集和消费。
有一些修改或扩展SIGHASH系统的建议。作为Elements项目的一部分,一个这样的提案是Blockstream的Glenn Willen提出的Bitmask Sighash模式。这旨在为SIGHASH类型创建一个灵活的替代品,允许“任意的,输入和输出的矿工可改写位掩码”来表示“更复杂的合同预付款方案,例如已分配的资产交换中有变更的已签名的报价”。