比特币源码阅读(0.16)(二十)

CScript

比特币的交易验证引擎依赖于两类脚本来验证比特币交易:锁定脚本和解锁脚本。

锁定脚本是一个放置在输出上面的花费条件:它指定了今后花费这笔输出必须要满足的条件。 由于锁定脚本往往含有一个公钥或比特币地址(公钥哈希值),在历史上它曾被称为脚本公钥(scriptPubKey)。

解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,它将允许输出被消费。解锁脚本是每一笔比特币交易输入的一部分,而且往往含有一个由用户的比特币钱包(通过用户的私钥)生成的数字签名。由于解锁脚本常常包含一个数字签名,因此它曾被称作ScriptSig。

P2PKH脚本

比特币网络处理的大多数交易花费的都是由“付款至公钥哈希”(或P2PKH)脚本锁定的输出。
锁定脚本 scriptPubKey

1
OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG

解锁脚本 ScriptSig

1
<Signature> <Public Key>

将解锁脚本和锁定脚本组成组合脚本:

1
<Signature> <Public Key> OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG

解锁步骤:

1
2
3
4
5
6
7
将<Signature>入栈
将<Public Key> 入栈
复制<Public Key>
对<Public Key>执行HASH160计算,使用计算结果<Public Key Hash Result>替换<Public Key>
将<Public Key Hash>入栈
比较<Public Key Hash Result>和<Public Key Hash>是否相同,相同继续下一步,不相同则失败
用<Public Key>对<Signature>进行验证,通过则允许付款

类图