比特币交易脚本是如何执行的
在学习UTXO时,一个UTXO包含一个解锁脚本(pkScript)。 花费此UTXO时,需要通过脚本验证后才能花费此UTXO。
如何拥有一个UTXO的使用权
比特币交易创建的输出不是一个简单的公钥地址,而是一个脚本。 如果B在交易中转0.5个btc给A,输出的pkScript脚本其实是类似的:
OP_DUP OP_HASH160 abcd1234...9876 OP_EQUALVERIFY OP_CHECKSIG
其中abcd1234...9876为A的公钥哈希,其他为指令。 谁可以提供签名和公钥让脚本运行通过,谁就可以花费这笔交易的 0.5 btc。
当A需要花费btc时,需要对脚本进行验证,所以当A提供公钥和签名时简述比特币交易过程,A实际上已经创建了另一笔交易。
每个人都可以验证A创建的新交易是否有效,如果有效,则该交易将被矿工打包到一个新的区块中。
交易的实际数据
In:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd0
4470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446
618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fd
d7d5d6cc8d25c6b241501
Out:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35
549d OP_EQUALVERIFY OP_CHECKSIG
这是一个交易票据数据,包括收入来源和支出。 在进行交易时,需要描述交易的来源(in),输出(out)交易金额,并以脚本的形式写入接收方的公钥(scriptPubKey)。 然后验证你输出的合法性(in):通过输入的pre tx和index找到指向的UTXO脚本,使用你自己的私钥签名(scriptSig)完成脚本验证,最后广播到网络完成转账。
收入来源:
接收对象Out:
交易脚本是如何执行的
现在你有了签名和公钥,接下来需要执行上一笔交易输出的脚本来获取UTXO的使用权:
sig: 30450221...ee0e01
pubkey: 042e930f...cabb
script: OP_DUP OP_HASH160 46af3fb4…6829 OP_EQUALVERIFY OP_CHECKSIG
比特币脚本被设计为在堆栈上运行的虚拟机指令。 首先简述比特币交易过程,将签名(sig)和公钥(pubkey)压入栈中:
然后执行TxOut指向的脚本:
OP_DUP OP_HASH160 46af3fb4...6829 OP_EQUALVERIFY OP_CHECKSIG
首先执行OP_DUP,这条指令是复制栈顶元素:
然后执行OP_HASH160,意思是在栈顶进行SHA256/RipeMD160,其实就是计算公钥哈希:
那么接下来就是直接将数据46af3fb4...6829压入栈:
然后执行OP_EQUALVERIFY比较栈顶的两个元素是否相等。 否则,整个脚本将无法执行。 如果成功:
最后,执行OP_CHECKSIG 栈顶的两个元素来验证签名。 如果相等则出栈成功返回。