Bitcoin---P2SH;P2SH举例;P2SH的局限性
文章目录
- 1. 摘要
- 2. P2SH举例
- 3. P2SH局限性
1. 摘要
Pay-to-Script-Hash (P2SH) 交易输出的开发是为了简化更复杂和功能性脚本的使用,就像需要提供相应签名才能解锁的支付脚本(即 P2PKH 脚本)一样简单。为了轻松使用此类兑换脚本,P2SH 输出使用兑换脚本<兑换脚本哈希> 的哈希,它本质上将计算开销从包含此 P2SH 输出的交易转移到在其输入中引用此 P2SH 输出的交易。通过封装兑换脚本哈希(较小)而不是完整兑换脚本(较大),P2SH 减少了区块链和 UTXO 集的存储要求。要使用 P2SH 交易输出,解锁脚本需要包含兑换脚本和满足解锁条件的签名。当且仅当解锁脚本中的兑换脚本<兑换脚本>能够与锁定脚本中的兑换脚本 <兑换脚本哈希>的哈希值匹配时,比特币客户端软件堆栈才会无错误地执行组合验证脚本。
2. P2SH举例
我们考虑一个兑换脚本的例子,该脚本需要提供至少 2 个与指定的 5 个公钥 PubKey1、…、PubKey5 相对应的签名才能解锁付款,如图下图所示。我们比较了使用和不使用 P2SH 脚本的此兑换脚本的组合验证脚本。不使用 P2SH 脚本时,锁定脚本包含兑换脚本“2 PubKey1 … PubKey5 5 OP_CHECKMULTISIG”,表示需要来自五个公钥的两个签名才能满足解锁条件,解锁脚本包含两个提供的签名 <Sig1> <Sig2>。使用 P2SH 脚本时,锁定脚本包含兑换脚本的哈希值 <Redeem Script hash >和另外两个操作码,用于在解锁时验证兑换脚本的哈希值是否正确;解锁脚本包含两个提供的签名 <Sig1> <Sig2>以及兑换脚本。除了将兑换脚本(相对较大)封装到交易输出中之外,P2SH 脚本还将兑换脚本哈希(相对较小)封装到交易输出中,从而将存储负担从创建输出的人转移到使用输出的人。因此,使用 P2SH 脚本可以节省用于存储区块链和 UTXO 集的空间。要使
用 P2SH 交易输出,解锁脚本需要包含兑换脚本和满足解锁条件的签名。当且仅当解锁脚本中的兑换脚本 <兑换脚本>能够与锁定脚本中的兑换脚本 <兑换脚本哈希>的哈希值匹配时,比特币客户端软件堆栈才会无错误地执行组合验证脚本。
3. P2SH局限性
在Bitcoin的P2SH交易输出中,当支出条件需要多个签名时,解锁脚本(即见证数据)的大小会随着签名者的数量增加。这是因为锁定脚本只包含赎回脚本的哈希值<赎回脚本哈希>,而多个签名和赎回脚本<赎回脚本>则包含在解锁脚本中。实际上,一个P2SH赎回脚本最多可以包含15个用于多重签名验证的公钥。这个限制基于以下原因:
- OP_CHECKMULTISIG操作码设计用于验证最多15个公钥。这个设计平衡了脚本执行的效率和可靠性,同时支持在多重签名交易中合理数量的签名。
- Bitcoin对每个交易的总大小有限制,最大为1MB。考虑到每个公钥大约占用33字节,每个签名大约占用72字节,带有15个签名和相应公钥的解锁脚本接近这个最大限制。