P2SH和P2WSH是比特币交易的高级脚本,能够构建复杂条件的智能合约交易。
首先,我们将看看多重签名脚本。接下来,我们介绍最常见的交易脚本P2SH,即Pay-to-Script-Hash支付给脚本哈希, 它打开了一个复杂脚本的整个世界。最后我们介绍P2WSH,即Pay-to-Witness-Script-Hash支付给见证脚本哈希, P2WSH的结构性调整对比特币交易产生了多方面的影响。
1 、多重签名
多重签名脚本设置了一个条件,其中N 个公钥被记录在脚本中,并且至少有M 个必须提供签名来解锁资金。这也称为M-N 方案,其中N 是密钥的总数,M 是验证所需的签名的数量。例如,2/3 的多重签名是三个公钥被列为潜在签名人,至少有2 个有效的签名才能花费资金。此时,标准多重签名脚本限制在最多15 个列出的公钥,这意味着您可以从1 到15 之间的多重签名或该范围内的任何组合执行任何操作。在本书发布之前,限制15 个已列出d 的密钥可能会被解除,因此请检查isStandard()函数以查看当前网络接受的内容。
设置M-N 多重签名条件的锁定脚本的一般形式是:
M <Public Key 1> <Public Key 2> ... <Public Key N> N CHECKMULTISIG
M 是花费输出所需的签名的数量,N 是列出的公钥的总数。设置2 到3 多重签名条件的锁定脚本如下所示:
2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG
上述锁定脚本可由含有签名和公钥的脚本予以解锁: 或者由3 个存档公钥中的任意2 个相一致的私钥签名组合予以解锁。两个脚本组合将形成一个验证脚本:
<Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG
当执行时,只有当未解锁版脚本与解锁脚本设置条件相匹配时,组合脚本才显示得到结果为真(Ture)。
上述例子中相应的设置条件即为:未解锁脚本是否含有3 个公钥中的任意2 个相对应的私钥的有效签名。
l CHECKMULTISIG 执行中的bug
CHECKMULTISIG 的执行中有一个bug,需要一些轻微的解决方法。当CHECKMULTISIG 执行时,它应该消耗堆栈(stack) 上的M + N + 2 个项目作为参数。然而,由于该错误,CHECKMULTISIG 将弹出(pop)超出预期的额外值或一个值。
我们来看看这个更详细的/使用以前的/验证示例:
<Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG
首先,CHECKMULTISIG 弹出最上面的项目,这是N(在这个例子中N 是“3”)。然后它弹出N 个项目,这是可以签名的公钥。在这个例子中,公钥A,B 和C.然后,它弹出一个