解锁比特币交易,常用脚本类型与核心作用
摘要:比特币作为首个成功的去中心化数字货币,其安全性和灵活性很大程度上得益于其基于脚本(Script)的交易系统,交易脚本是一种简单的、基于堆栈的编程语言,它定义了比特币交易输出(UTXO)在被花费时必须满...
比特币作为首个成功的去中心化数字货币,其安全性和灵活性很大程度上得益于其基于脚本(Script)的交易系统,交易脚本是一种简单的、基于堆栈的编程语言,它定义了比特币交易输出(UTXO)在被花费时必须满足的条件,它就像一个“锁”,而解锁这个“锁”的“钥匙”就是提供满足该脚本条件的数据,理解比特币常用的交易脚本类型,对于深入把握比特币的工作原理、安全特性以及创新应用至关重要。
比特币脚本的设计并非图灵完备,这意味着它不支持循环等复杂操作,从而有效防止了无限循环攻击等潜在问题,并保证了交易执行的确定性和效率,以下是一些比特币中最常用且核心的交易脚本类型:
P2PKH (Pay-to-Public-Key-Hash) - 最经典的脚本类型
P2PKH是比特币历史上最古老、最广泛使用的脚本类型,我们日常所说的“比特币地址”大多对应的就是P2PKH脚本。
- 锁定脚本 (ScriptSig - 在输入中提供):
当用户想要花费一个P2PKH输出的比特币时,需要在交易输入中提供以下信息:
signature(签名):对交易数据进行签名,证明私钥的所有权。public key(公钥):与签名对应的公钥。 这两部分数据共同构成了ScriptSig,用于解锁。
- 解锁脚本 (ScriptPubKey - 在输出中定义):
当一个比特币地址被创建时,其对应的
ScriptPubKey会定义在交易输出中,内容通常为:OP_DUP OP_HASH160 <PublicKeyHash> OP_EQUALVERIFY OP_CHECKSIGOP_DUP:复制栈顶元素。OP_HASH160:对栈顶元素(公钥)进行SHA-256哈希后再进行RIPEMD-160哈希。<PublicKeyHash>:用户地址对应的公钥哈希(20字节)。OP_EQUALVERIFY:验证栈顶两个元素是否相等,并验证签名有效性。OP_CHECKSIG:验证签名是否使用提供的公钥对交易数据生成。
- 执行过程:
ScriptSig(签名+公钥)被压入堆栈。ScriptPubKey被依次执行:OP_DUP复制公钥,OP_HASH160生成公钥哈希,与ScriptPubKey中预设的<PublicKeyHash>比较(OP_EQUALVERIFY),最后OP_CHECKSIG验证签名。- 如果所有步骤都成功,堆栈顶部为
TRUE(1),交易有效;否则为FALSE(0),交易失败。
P2SH (Pay-to-Script-Hash) - 更灵活的脚本类型
P2SH的引入是为了提高隐私性,并支持更复杂的脚本类型,而无需让每个节点都理解和执行这些复杂脚本,用户只需支付一个“脚本的哈希值”,而脚本本身在花费时才被揭示。
- 锁定脚本 (ScriptSig - 在输入中提供):
ScriptSig不再是简单的签名和公钥,而是提供满足ScriptPubKey中哈希所指向的脚本的条件,通常包括:redeemScript:一个完整的脚本,定义了花费该输出的实际条件(一个多重签名的脚本)。- 用于满足
redeemScript的数据(如多个签名等)。
- 解锁脚本 (ScriptPubKey - 在输出中定义):
ScriptPubKey非常简洁,只包含:OP_HASH160 <ScriptHash> OP_EQUAL<ScriptHash>:是redeemScript的SHA-256+RIPEMD-160哈希值。
- 执行过程:
ScriptSig(包含redeemScript及其满足数据)被压入堆栈。ScriptPubKey执行:OP_HASH160对ScriptSig中的redeemScript进行哈希,与ScriptPubKey中的<ScriptHash>比较(OP_EQUAL)。- 如果哈希匹配,则继续执行
redeemScript,用ScriptSig中提供的数据去满足redeemScript的条件。 - 只有
ScriptPubKey的哈希验证和redeemScript的执行都成功,交易才有效。
多重签名脚本 (Multi-signature Scripts)
多重签名脚本要求多个私钥共同签名才能花费比特币,常用于组织资金管理、提高安全性等,它可以与P2PKH或P2SH结合使用。
- 基本结构 (以2-of-3为例,即3个公钥中任意2个即可签名):
OP_2 <PubKey1> <PubKey2> <PubKey3> OP_3 OP_CHECKMULTISIGOP_2:指定需要的签名数量。<PubKey1> <PubKey2> <PubKey3>:参与签名的公钥列表。OP_3:指定总共有多少个公钥。OP_CHECKMULTISIG:验证提供的签名数量是否满足OP_n指定的数量,并且签名与公钥对应。
- 与P2SH结合:
多重签名脚本通常被包裹在P2SH中,以提高隐私性和兼容性。
redeemScript就是上述的多重签名脚本,用户只需支付其哈希值。
P2WPKH (Pay-to-Witness-Public-Key-Hash) 和 P2WSH (Pay-to-Witness-Script-Hash) - 隔离见证脚本类型
为了解决比特币的扩容问题并提升交易效率和隐私性,隔离见证(SegWit)被引入,并带来了新的脚本类型:原生见证脚本(Native SegWit)。
-
P2WPKH (Pay-to-Witness-Public-Key-Hash):
- 锁定脚本 (ScriptPubKey):
OP_0 <PublicKeyHash>OP_0:表示一个以0开头的版本号(当前为0)。<PublicKeyHash>:是公钥的SHA-256哈希(32字节,不同于P2PKH的20字节)。
- 解锁脚本 (ScriptSig - 在输入的见证数据中提供):
见证数据(Witness)是隔离见证的一部分,与
ScriptSig分开存储和验证。witness:<signature> <public_key>
- 特点: 签名和公钥作为见证数据,不占用交易本身的“空间”,从而降低交易费用,并具有某些隐私优势。
- 锁定脚本 (ScriptPubKey):
-
P2WSH (Pay-to-Witness-Script-Hash):
- 锁定脚本 (ScriptPubKey):
OP_0 <ScriptHash><ScriptHash>:是完整见证脚本(witnessScript)的SHA-256哈希(32字节)。
- 解锁脚本 (ScriptSig - 在输入的见证数据中提供):
见证数据包含:
witness:<witnessScript>以及满足该witnessScript的数据。
- 特点: 类似于P2SH,但见证脚本本身被哈希锁定在
ScriptPubKey中,支持更复杂的见证脚本(如复杂的多重签名、时间锁等),且同样享受隔离见证带来的费用和隐私优势。
- 锁定脚本 (ScriptPubKey):
时间锁脚本 (Timelock Scripts)
时间锁脚本允许交易在特定时间点之后才能被花费,这为诸如闪电网络、通道关闭、合约到期等应用提供了基础。
- 类型:
- 绝对时间锁 (CLTV - CheckLockTimeVerify): 基于区块高度或特定时间戳。
- 示例脚本片段:
<locktime> OP_CHECKLOCKTIMEVERIFY OP_DROP <public key> OP_CHECKSIG - 意味着必须等到
<locktime>指定的区块高度或时间之后,才能使用该公钥和签名花费。
- 示例脚本片段:
- 相对时间锁 (CSV - CheckSequenceVerify): 基于相对时间(从当前区块算起多少个区块后)。
- 示例脚本片段:
<sequence> OP_CHECKSEQUENCEVERIFY OP_DROP <public key> OP_CHECKSIG - 意味着必须等待
<sequence>指定的相对区块数之后,才能花费。
- 示例脚本片段:
- 绝对时间锁 (CLTV - CheckLockTimeVerify): 基于区块高度或特定时间戳。
- 应用: 时间锁常与其他脚本类型(如P2SH、P2WSH)结合使用,实现条件性支付。
比特币的交易脚本系统是其灵活性和安全性的基石,从最基础的
