3.1 P2PKH和P2SH
1. 再复习一下P2PKH:比特币脚本的基础
由锁定脚本(scriptPubKey)和解锁脚本 (scriptSig)配合。把钱支付到的锁定脚本(scriptPubKey),主要的组成部分就是公钥的某种压缩和加密格式(公钥哈希),以及操作码(OPCODE)
锁定脚本 (scriptPubKey)
OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
这个脚本的含义是:"只有能提供与此公钥哈希匹配的公钥,并能用对应私钥生成有效签名的人,才能花费这笔比特币。"
解锁脚本 (scriptSig),主要部分就是签名加上公钥。
<签名> <公钥>
那么脚本堆栈的逻辑大概就是,解锁脚本的公钥和锁定脚本的公钥(或其变形形式),先比对一致,然后再让签名和公钥进行比对。而签名和公钥进行比对的过程,本质就是私钥和公钥的对应。
2. P2SH:把钱支付到一个多签脚本
随着比特币的发展,人们希望使用更复杂的脚本条件,如多重签名。但P2PKH的限制是,复杂脚本会使地址变得很长,并且要求发送方理解和构建这些复杂脚本。2012年,BIP-16引入了Pay to Script Hash (P2SH)来解决这个问题。
锁定脚本
OP_HASH160 <脚本哈希> OP_EQUAL
注意这里的关键变化:我们不再锁定到公钥哈希,而是锁定到一个完整脚本的哈希。
解锁脚本
<满足脚本条件的数据> <赎回脚本本身>
以多签为例:
<签名1> <签名2> <OP_2 <公钥1> <公钥2> <公钥3> OP_3 OP_CHECKMULTISIG>
其中<满足脚本条件的数据> 就是<签名1> <签名2>,你看跟P2PKH里面的签名是类似的。而 OP_2 <公钥1> <公钥2> <公钥3> OP_3 OP_CHECKMULTISIG 就是一种2-3多签的脚本本身,它意味着"需要3个公钥中的至少2个有效签名"。
完整的赎回脚本只有在花费时才需要公开,而在锁定资金时只需要提供这个脚本的哈希值。这大大简化了发送方的工作,并允许更复杂的支付条件。无论底层脚本多么复杂,锁定脚本格式都是统一的。
验证过程
计算提供的赎回脚本的哈希
验证这个哈希是否与锁定脚本中的脚本哈希匹配
执行赎回脚本,使用提供的数据
从P2SH,我们再次看到比特币脚本堆栈的套路大概就是,解锁脚本:签名相关、公钥或脚本;锁定脚本:公钥或脚本的哈希,操作码。
Last updated