BIP16 P2SH交易脚本

当前位置:首页 > 币圈百科 > BIP16 P2SH交易脚本

BIP16 P2SH交易脚本

2023-02-07币圈百科196

摘要

这个BIP描述了比特币脚本系统中一种新的标准交易类型,并定义了额外的验证规则,但它只能应用于新的交易。

bitcoin

动机

pay-to-script-hash脚本类型的目的是将构建交易的成本从发送方转移到赎回方。

它的优点是允许事务发起者构造各种事务,不管多复杂,只需要使用一个固定长度为20字节的hash。这个足够短的hash可以通过扫描二维码或者简单的复制粘贴来完成。

描述

一个新的事务类型,可以被转发和打包成块,定义如下:

op _ hash 160 [20字节散列值] op _ equal

[20字节散列值]应该是opcode(.这一新交易通过标准解锁脚本来兑现:

.签名.{序列化脚本}

如果交易的序列化脚本(也称为赎回脚本)本身,即其他标准交易类型之一,则此交易被视为唯一标准,可以赎回付款脚本交易的输出。

在转发事务或将事务打包成块之前,这些事务输出的验证规则如下:

如果unlock脚本中有push data操作码之外的任何操作码,则验证失败。初始化的堆栈空间是通过蓑衣网小编2023签名和序列化脚本创建的。如果序列化的脚本哈希与outpoint中的哈希不匹配,验证将立即失败。序列化脚本从初始堆栈中弹出,通过使用弹出的堆栈和反序列化脚本作为锁定脚本,事务被视为有效。

在验证交易时,这些新规则将仅在时间戳大于或等于1333238400(2012年4月1日)时使用。时间戳早于1333238400的交易将无法使用新的交易验证规则进行验证。旧事务必须在旧事务验证规则下有效(参见向后兼容性的详细信息)。

例如,包含只有一个签名的锁定脚本和相应的解锁脚本的事务:

script SIG:[signature]{[pubkey]op _ checksig } script pubkey:OP _ hash 160[20字节-hash of {[pubkey]OP _ check SIG }]OP _ EQUAL

序列化脚本中的签名数需要低于一个块中20,000个签名的最大限制,如下:

无论是否求值,OP _ check SIG和OP_CHECKSIGVERIFY都被视为无论是否求值,OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY都会被认为是OP_1到OP_16操作码之前的1~16个签名操作。所有其他OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY被视为20个签名操作。

举例:

3签名操作:

{ 2[pubkey 1][pubkey 2][pubkey 3]3 OP _ checkmultisig }

22签名操作

{ OP _ checksigop _ if OP _ checksigverifyop _ else OP _ checkmultisigverifyop _ endif }

基本原理

这个BIP取代了BIP12,BIP12试图通过新的交易代码OP_EVAL等完成这个BIP的所有事情。

关于这个BIP(以及BIP13,描述P2SH地址类型)的动机有一些争议;很多人认为没有必要,复杂的多签名事务类型,只需要发起者完成序列化脚本就可以支持。但笔者认为这个BIP被改到了最低限度,鼓励商家、交易所等软件支持多重签名,向base58编码的20字节比特币地址发送资金。

虽然识别一个特殊的锁定脚本格式并进行额外的验证很恶心。但一直认为要么实现越来越复杂,要么以非常危险的方式扩展语言表达能力。

这种签名操作的计数规则倾向于通过静态扫描序列化脚本简单快速地实现。比特币指定了一个块可以包含的最大签名数量,以防止恶意DOS攻击。如果没有这种限制,不诚实的旷工者可能广播包含数十万个ECDSA签名的块。当其他节点验证当前块时,这个不诚实的节点已经率先计算下一个块。

在旧的实现中有一个确认攻击,但实际上它非常昂贵和困难。攻击如下:

攻击者创建一个P2SH事务,被旧版本软件认为有效,但被新软件验证为非法。攻击者利用该交易向自己发送一些硬币。然后,攻击者创建一个标准交易来花费这个P2SH交易,并向运行旧软件的受害者付款。攻击者创建一个块并包含这两个事务。如果受害者接受确认付款,因为其他节点验证该块是非法的,所以非法块被覆盖,但攻击者已经赢了。

但是,这种攻击代价很大。第一,攻击者想要创建一个block,但是其他网络节点会认为这是无效的,而自己创建block是非常困难的。因此,用户不应接受金额非常大的确认交易。

向后兼容性

这些事务对于旧版本的软件是非标准的,它们不会转发这些事务,也不会将它们打包成块。

旧版本的软件将在验证块(由支持BIP的新软件创建)中验证序列化脚本哈希的一致性,并且不会进行额外的验证。

为了防止区块链被恶意的P2SH交易瓜分,需要处理以下几种情况:

一个P2SH交易对软件新版本无效,对软件旧版本有效。

为了顺利完成升级,并确保不会出现永久的区块链分裂,需要将50%以上的旷工同时从旧版本验证规则更改为新版本验证规则,并支持新交易类型的完整验证规则。

为了判断是否有超过50%的计算能力支持BIP,旷工者需要升级软件,在他们创建大宗货币交易的输入中加入“/P2SH/”字符串。

2012年2月1日,区块链将检查过去7天内支持P2SH事务的块数。如果“/P2SH/”包含在550个或以上的造币交易中,则所有在2012年2月15日00:00:00 GMT之后带有时间戳的区块将完全支持P2SH交易。在一周内,大约有1000个积木被制作出来。所以550,全网大概55%的节点支持这个新特性。

如果大多数计算能力不支持这个新的验证规则,BIP将被推迟。如果明确表示大多数计算能力永远不会支持这个提议,那么BIP将被取消。

序列化脚本的520字节限制

作为向后兼容性要求的结果,序列化脚本本身遵循与任何其他PUSHDATA操作相同蓑衣网小编2023的规则,包括大于520字节的数据不会被推送到堆栈。因此,如果赎回脚本长于520字节,则不可能花费P2SH事务。例如,当OP_CHECKMULTISIG操作码本身接收多达20个pubkey时,使用一个33字节的压缩公钥,只能花费最多包含15个pubkey的P2SH赎回脚本:3个字节,15个pubkeys * 34个字节/pubkey=513个字节。

BIP16 P2SH交易脚本 | 分享给朋友: