比特币拥有一个称作script的脚本语言。通过script,可以对TXO加锁,同时支持TXI解锁TXO。Script非常简单,就是一些代码和操作符的序列,例如:
5 2 OP_ADD 7 OP_EQUAL
5, 2, 7是数据,OP_ADD和OP_EQUAL是操作符。script从左至右执行代码:遇到数据放入堆栈(先进后出);遇到操作符就从堆栈顶部取出所需的数据,并将结果放入堆栈。
上面的代码执行过程如下:
OP_ADD从堆栈中获取两个数据然后求和,将结果放入堆栈中。OP_EQUAL从堆栈获取两个数据进行比较:如果相等将true放入堆栈;否则将false放入堆栈。栈顶数据就是代码的执行结果。
比特币中用于执行交付的脚本:
<signature> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
该脚本是比特币种最常用的脚本,称为P2PKH(Pay to Public Key Hash)。此脚本用于向一个公钥hash值进行支付,例如使用一个公钥对货币进行加锁。比特币支付的核心就在于此:无账户,无基金转移;仅有一个脚本用于检查所提供的签名和公钥是否正确。
此脚本数据分为两部分:
- 第一部分,<signature> <pubKey>,被存放在TXI的ScriptSig 中
- 第二部分,OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG,被存放在TXO的ScriptPubKey中
TXO定义解锁逻辑,TXI提供数据解锁TXO,脚本执行如下:
- Stack: empty Script: <signature> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> Script: <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> <pubKey> Script: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> <pubKey> <pubKey> Script: OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> <pubKey> <pubKeyHash> Script: <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> <pubKey> <pubKeyHash> <pubKeyHash> Script: OP_EQUALVERIFY OP_CHECKSIG
- Stack: <signature> <pubKey> Script: OP_CHECKSIG
- Stack: true or false. Script: empty.
OP_DUP复制复制栈顶数据,OP_HASH160获取栈顶数据、使用RIPEMD160生成hash值并放入堆栈。OP_EQUALVERIFY比较两个栈顶数据,不相等则结束脚本。OP_CHECKSIG对交易进行哈希处理并使用<signature>、<pubKey>验证签名。
正因为有了script脚本语言,比特币可以成为智能合约平台,如该脚本可以支持多种支付模式,不仅仅是单个数字了。