主讲人:Tom ni
回顾比特币的交易结构,有一块拼图我们还没有填上:
transaction_0x1c2e:{
input: {
…
}
…
output_17:{//这就是John试图引用的UTXO
amount = 9;
scriptPubKey = John的公钥;
}
}
transaction_0x1a28:{
input: {
txid = 0x1c2e;
vout = 17;
scriptSignature = John的数字签名
}
output_0:{//接收方Bob的信息
amount = 5;
scriptPubKey = Bob的公钥;
}
我们提到过,在UTXO的模型里,scriptPubKey与scriptSignature:
<aside>
💡 所谓脚本,可以将其与电影剧本进行类比:
1)电影剧本中约定了演员的台词、顺序等等,演员则根据这些约定的指令有序地进行表演。(爱加戏的暂不考虑)
2)计算机中的脚本,则约定了一系列的指令与操作数,计算机在此基础上有序地进行运算与操作。
例如:
1 2 ADD //告诉计算机将1、2两个数加起来,结果为3
1 2 ADD 3 EQUAL//告诉计算机,将1、2两个数加起来,将结果与3比较,结果为TRUE
1 2 ADD 4 EQUAL//告诉计算机,将1、2两个数加起来,将结果与4比较,结果为FALSE
*为什么脚本顺序有些“奇怪”,例如为什么不是1 ADD 2在后文会解释
</aside>
下面我们正式来看比特币的加密与解密脚本。
比特币中脚本的执行是基于一种名为“栈”的数据结构。
我们想象一个底部封口的网球桶,先放进去的球将被最后拿出,最后放进去的球将被最先拿出。我们基于“栈”的脚本运行方式也是同样的模式:
1)如果是操作数,则直接压入栈中;
2)遇到操作码后,弹出栈顶的操作数(最后被压入的)进行计算,将结果压入栈;
3)不断往复下去,直至运行结束。
我们以 1 2 ADD 3 EQUAL//告诉计算机,将1、2两个数加起来,将结果与3比较,结果为TRUE为例:
