验证过程需要计算签名脚本和公钥脚本,对于一个P2PKH的交易,支出地址的公钥脚本是如下格式

    交易的花费者的签名脚本会被验证,并作为脚本开头的前缀。 一个P2PKH 交易的签名脚本包括一个secp256k1加密算法的签名和完整的公钥,拼接成以下格式:

    脚本语言是一种类 Forth 栈语言。被设计拥有成无状态和非图灵完备的性质。无状态性保证了一旦一个交易被区块打包,这个交易就是可用的。图灵非完备性(具体来说,缺少循环和goto 语句)使得比特币的脚本语言更加不灵活和更可预测,从而大大简化了安全模型。为了检测交易是不是有效的,从Bob的签名脚本一直到Alice 的公钥脚本依次执行。下面的图示展示了计算一个标准P2PKH 的公钥脚本。

    签名(来自Bob 的签名脚本)被压入空栈,以为签名只是数据,不需要做任何计算,只是把签名入栈。之后公钥(同样来着签名脚本)被压入堆栈。

    • 接下来执行的运算是 OP_ HASH160, 把堆栈头的数据进行HASH 运算,在这个例子中,对Bob 提供的公钥进行了HASH运算。

    • 有趣的部分:Alice 的公钥脚本执行 OP_EQUALVERIFY. OP_EQUALVERIFY 等价于执行OP_VERIFY(未展示) 后执行 OP_EQUAL.

    OP_EQUAL (未展示)计算堆栈头部的前两个值,在这个例子中,检测了 从Bob 提供的全 公钥生成的公钥Hash 是否和Alice提供的在第一次交易中生成的公钥hash一致。OP_EQUAL 出栈头部的两个值,压入计算结果:0 (否)和 1(真)。

    OP_VERIFY(未展示) 检查了堆栈头的值,如果堆栈头为FALSE, 立刻终止全部计算,交易验证失败。否则,以TRUE 值出栈。