双栈模型
比特币脚本执行涉及一种基于堆栈的编程语言,用于验证比特币网络上的交易。以下是比特币脚本执行堆栈的概述:
脚本构成
- ScriptPubKey:这是锁定脚本,附加在输出上,指定花费该输出所需满足的条件。
- ScriptSig:这是解锁脚本,包含在输入中,提供满足 ScriptPubKey 中条件的数据。
执行堆栈
执行堆栈用于处理和评估比特币脚本。其工作原理如下:
-
推操作:将数据和命令(操作码)推入堆栈。
- 例子:
OP_DUP
复制堆栈顶部的项。 - 例子:
OP_HASH160
在 SHA-256 之后执行 RIPEMD-160 哈希。
- 例子:
-
脚本执行:
- ScriptSig 和 ScriptPubKey 连接起来顺序执行。
- 首先执行 ScriptSig,将其数据推入堆栈。
- 然后执行 ScriptPubKey,使用 ScriptSig 留在堆栈上的数据。
-
堆栈操作:
- 各种操作修改堆栈。例如 :
OP_ADD
弹出堆栈中的两项,进行相加,并将结果推回堆栈。OP_EQUALVERIFY
检查顶部的两项是否相等,如果相等则移除它们。
- 各种操作修改堆栈。例如 :
-
条件和控制结构:
- 像
OP_IF
、OP_ELSE
和OP_ENDIF
这样的条件操作允许更复杂的脚本,通过启用条件执行路径。
- 像
-
验证:
- 执行所有命令后,堆栈应具有特定形式,以使交易有效。
- 通常,堆栈的最终状态应有一个单一的
TRUE
值,表示脚本执行成功。
示例交易执行
-
ScriptSig:
<签名> <公钥>
- 将签名和公钥推入堆栈。
-
ScriptPubKey:
OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
OP_DUP
:复制公钥。OP_HASH160
:对复制的公钥进行哈希。<PubKeyHash>
:推入预期的公钥哈希。OP_EQUALVERIFY
:验证公钥的哈希是否与预期哈希匹配。OP_CHECKSIG
:使用公钥验证签名。
堆栈执行流程
-
初始堆栈(执行 ScriptSig 之后):
- 堆栈:
[签名, 公钥]
- 堆栈:
-
执行 ScriptPubKey:
OP_DUP
:[签名, 公钥, 公钥]
OP_HASH160
:[签名, 公钥, 公钥哈希]
<PubKeyHash>
:[签名, 公钥, 公钥哈希, 预期公钥哈希]
OP_EQUALVERIFY
:验证并移除公钥哈希和预期公钥哈希如果它们匹配。OP_CHECKSIG
:使用公钥验证签名。
-
最终堆栈:
- 如果有效:
[TRUE]
- 如果无效:
[FALSE]
或脚本失败,交易被拒绝。
- 如果有效:
理解比特币脚本执行堆栈对开发比特币交易的开发人员来说至关重要,因为它确保了交易条件的正确和安全验证。