主页 > imtoken知乎 > 比特币交易脚本是如何执行的

比特币交易脚本是如何执行的

imtoken知乎 2023-01-16 23:00:12

在学习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 栈顶的两个元素来验证签名。 如果相等则出栈成功返回。