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个有效签名"。

完整的赎回脚本只有在花费时才需要公开,而在锁定资金时只需要提供这个脚本的哈希值。这大大简化了发送方的工作,并允许更复杂的支付条件。无论底层脚本多么复杂,锁定脚本格式都是统一的。

验证过程

  1. 计算提供的赎回脚本的哈希

  2. 验证这个哈希是否与锁定脚本中的脚本哈希匹配

  3. 执行赎回脚本,使用提供的数据

从P2SH,我们再次看到比特币脚本堆栈的套路大概就是,解锁脚本:签名相关、公钥或脚本;锁定脚本:公钥或脚本的哈希,操作码。

Last updated