1. 程式人生 > >比特幣交易的腳本是如何執行的

比特幣交易的腳本是如何執行的

相等 散列 format width 形式 index 進行 tar code

在學習UTXO中,一筆UTXO包含了一個解鎖腳本(pkScript),花費這一筆UTXO時,需要通過該腳本驗證,才能夠花費這筆UTXO。

如何擁有一個UTXO的使用權

比特幣的交易創建的輸出並非一個簡單的公鑰地址,而是一個腳本。如果B給A轉賬0.5個btc的交易中,其實輸出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)完成腳本驗證,最後廣播到網絡完成轉賬。

收入來源In:

  • Previous tx 為收入來源交易單的散列值,連接到上一個交易單。
  • index 指明是收入來源交易單中具體哪個索引的out,從0開始。
  • scriptSig 包含了簽名和公鑰,用於驗證Previous tx和index所指向的UTXO的鎖定腳本。

接收對象Out:

  • value 發送的幣值,單位為Satoshi,1BTC = 1億Satoshi
  • scriptPubKey 接收方的鎖定腳本,後續使用這筆UTXO需要提供公鑰和簽名通過該腳本的驗證。

交易腳本是如何執行的

現在有簽名、公鑰,需要執行上一個交易輸出的腳本獲得該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,實際就是計算公鑰hash:


技術分享圖片

然後下一條是直接把數據46af3fb4…6829入棧:

技術分享圖片

然後執行OP_EQUALVERIFY,比較棧頂兩個元素是否相等,如果不相等,整個腳本就執行失敗,如果成功:


技術分享圖片

最後執行OP_CHECKSIG棧頂兩個元素進行簽名校驗,如果相等,出棧返回成功。



作者:暴走的K哥哥
鏈接:https://www.jianshu.com/p/a57795ec562c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

比特幣交易的腳本是如何執行的