该BIP (Bitcoin Improvement Proposal) 描述了一种新的比特币脚本交易类型,即“Pay to Script Hash (P2SH)”,并定义了适用于新交易的额外验证规则。P2SH 的目的是将提供交易赎回条件的责任从资金发送者转移到赎回者,允许发送者使用固定长度的 20 字节哈希来资助任何复杂的交易。
派生自 bitcoin/bips
bip-anyprevout
搜索此仓库
/
复制路径
BlameMore file actions
BlameMore file actions
Apr 9, 2019
18f43a6 · Apr 9, 2019
打开提交详情
119 行 (71 loc) · 8.64 KB
/
顶部
预览
代码
Blame
119 行 (71 loc) · 8.64 KB
复制原始文件
下载原始文件
轮廓
编辑和原始操作
BIP: 16
Layer: Consensus (soft fork)
Title: Pay to Script Hash
Author: Gavin Andresen <gavinandresen@gmail.com>
Comments-Summary: No comments yet.
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0016
Status: Final
Type: Standards Track
Created: 2012-01-03
## 目录<br>Permalink: 目录<br>- 摘要<br>- 动机<br>- 规范<br>- 原理<br>- 向后兼容性 <br> - 序列化脚本大小的 520 字节限制<br>- 参考实现<br>- 参见<br>- 参考 |
这个BIP描述了比特币脚本系统的一种新的“标准”交易类型,并定义了仅适用于新交易的附加验证规则。
pay-to-script-hash 的目的是将提供赎回交易的条件的责任从资金的发送者转移到赎回者。
好处是允许发送者使用固定长度的 20 字节哈希来资助任何任意交易,无论多么复杂,该哈希足够短,可以从二维码扫描或轻松复制和粘贴。
定义了一种新的标准交易类型,该类型在中继并包含在已挖掘的区块中:
OP_HASH160 [20-byte-hash-value] OP_EQUAL
[20-byte-hash-value] 应该是 push-20-bytes-onto-the-stack 操作码 (0x14),后跟 20 个字节。
可以通过标准 scriptSig 赎回这种新的交易类型:
...signatures... {serialized script}
只有当 serialized script (也称为 redeemScript)本身是其他标准交易类型之一时,赎回这些 pay-to-script 输出点的交易才被认为是标准的。
在传递交易或考虑将它们包含在新区块中时,验证这些输出点的规则如下:
这些新规则仅应在验证时间戳 >= 1333238400(2012 年 4 月 1 日)的区块中的交易时应用 [ 1]。在区块链中,早于 1333238400 的交易未能通过这些新的验证规则。 [ 2]。较早的交易必须在旧规则下进行验证。(有关详细信息,请参阅向后兼容性部分)。
例如,单签名所需交易的 scriptPubKey 和相应的 scriptSig 为:
scriptSig: [signature] {[pubkey] OP_CHECKSIG}
scriptPubKey: OP_HASH160 [20-byte-hash of {[pubkey] OP_CHECKSIG} ] OP_EQUAL
{serialized script} 中的签名操作应计入每个区块允许的最大数量 (20,000),如下所示:
例子:
+3 签名操作:
{2 [pubkey1] [pubkey2] [pubkey3] 3 OP_CHECKMULTISIG}
+22 签名操作
{OP_CHECKSIG OP_IF OP_CHECKSIGVERIFY OP_ELSE OP_CHECKMULTISIGVERIFY OP_ENDIF}
此 BIP 取代了 BIP 12,后者提出了一种新的 Script 操作码 ("OP_EVAL") 来完成此 BIP 中的所有内容以及更多内容。
这个 BIP(和 BIP 13,pay-to-script-hash 地址类型)的动机有些争议;有些人认为这是不必要的,并且复杂/多重签名交易类型应该通过简单地给发送者完整的 {serialized script} 来支持。作者认为,此 BIP 将最大限度地减少对已创建的用于将资金发送到 base58 编码的 20 字节比特币地址的所有支持基础设施所需的更改,从而使商家、交易所和其他软件能够更快地开始支持多重签名交易。
识别一种“特殊”形式的 scriptPubKey 并在检测到它时执行额外的验证是很糟糕的。但是,共识是替代方案要么更糟糕,要么实现起来更复杂,和/或以危险的方式扩展了表达语言的能力。
签名操作计数规则旨在通过静态扫描 {serialized script} 来轻松快速地实现。比特币对每个区块的最大签名操作数有限制,以防止对矿工的拒绝服务攻击。如果没有限制,恶意矿工可能会广播一个需要数十万个 ECDSA 签名操作才能验证的区块,并且它可能能够在网络的其余部分努力验证当前区块的同时抢先一步计算下一个区块。
对旧的实现存在 1 确认攻击,但在实践中成本高昂且困难。攻击是:
如果受害者接受 1 确认付款,那么攻击者获胜,因为当网络的其余部分覆盖攻击者的无效区块时,这两个交易都将失效。
这种攻击代价高昂,因为它要求攻击者创建一个他们知道会被网络其余部分失效的区块。这是很困难的,因为创建区块很困难,并且用户不应接受高价值交易的 1 确认交易。
这些交易对于旧的实现来说是非标准的,旧的实现(通常)不会转发它们或将它们包含在区块中。
当旧的实现验证由完全支持此 BIP 的软件创建的区块时,它们将验证 {serialize script} 的哈希值是否匹配,但不会执行其他验证。
通过恶意的 pay-to-script 交易避免区块链拆分需要仔细处理一种情况:
为了平稳升级并确保不会发生持久的区块链拆分,超过 50% 的矿工必须支持对新交易类型的完全验证,并且必须同时从旧的验证规则切换到新的规则。
为了判断是否有超过 50% 的算力支持此 BIP,要求矿工升级他们的软件,并将字符串“/P2SH/”放在他们创建的区块的 coinbase 交易的输入中。
2012 年 2 月 1 日,将检查区块链以确定在过去 7 天内支持 pay-to-script-hash 的区块数量。如果 550 个或更多区块的 coinbase 中包含“/P2SH/”,那么所有时间戳在 2012 年 2 月 15 日 00:00:00 GMT 之后的所有区块都应完全验证其 pay-to-script-hash 交易。大约在一周内创建 1,000 个区块; 因此,550 个区块应该大约是支持新功能的网络的 55%。
如果大多数算力不支持新的验证规则,那么将推迟发布(或者如果明确永远无法实现多数,则拒绝发布)。
由于向后兼容性的要求,序列化脚本本身必须遵守与任何其他 PUSHDATA 操作相同的规则,包括不得将大于 520 字节的数据推送到堆栈的规则。因此,如果它引用的赎回脚本长度 >520 字节,则无法花费 P2SH 输出。例如,虽然 OP_CHECKMULTISIG 操作码本身最多可以接受 20 个公钥,但使用 33 字节压缩公钥只能花费最多需要 15 个公钥才能赎回的 P2SH 输出:3 字节 + 15 个公钥 * 34 字节/公钥 = 513 字节。
https://gist.github.com/gavinandresen/3966071
- 原文链接: github.com/ajtowns/bips/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!