1. 程式人生 > >交易校驗與交易指令碼

交易校驗與交易指令碼

這裡寫圖片描述

校驗與指令碼

交易校驗是基於對指令碼語言的執行結果的判斷。
交易校驗引擎依賴於兩種型別的指令碼:
* unlocking script
* locking script
當一個交易被校驗有效時,每個輸入的unlocking script會與對應的locking script一起被執行,以判斷他們是否滿足給定的要求(花費條件)。
script是用來使可程式設計貨幣的校驗生效的。
未花費的交易會永遠記錄在鏈上,因此它是不可變的,校驗失敗的交易不會影響已有的有效的交易。只有有效的校驗會使得輸出的結果被認為是已經“花費“了,且把對應的原UTXO(unspent transaction output)從UTXO set總移除。

交易指令碼

交易指令碼語言包含許多操作符,但沒有迴圈或複雜的流程控制功能(僅有條件判斷)。每一個交易會被鏈上所有的full node校驗。
交易指令碼語言是無狀態的,在指令碼執行前不會有前置狀態,在執行後也不會儲存結果狀態。因此,指令碼執行所需要的資訊全都包含在指令碼自身。同一指令碼對於任何系統執行效果都是可以預知的。

locking script是實際上一個放置在輸出的可花費條件:它指定欲花費通貨需要滿足的條件。也會稱為scriptPubKey,因為它通常包含一個公鑰或地址(公鑰的hash)。
unlocking script是用來滿足locking script種指定的要求的,unlocking script的結果會作為locking script的輸入。

unclocking script是交易輸入的一部分。通常他們會包含一個由私鑰生成的數字簽名,因此,他們也稱為scriptSig。
每一個正在校驗的node都會通過執行locking script和unlocking script來校驗交易。每一個輸入都會包含一個unlocking script和已存在的UTXO的引用。校驗過程會把unlocking script拷貝出來,且通過UTXO引用,獲取對應的locking script,接著執行unlocking script和locking script。unlocking script和locking script的執行結果為TURE的話,對應的輸入就被校驗為有效。交易種所有的輸入都被校驗為有效的話,則交易被校驗為有效。

執行堆疊

區塊鏈指令碼語言也稱為基於堆疊的語言。它會從左到右順序執行指令碼中的項。
當指令碼(unlocking script + locking script)執行結束時,棧頂資料為非0值或堆疊為空,校驗過程視為valid;棧頂資料為0值或執行過程中斷則校驗過程視為invalid。

P2PKH(Pay-To-Public-Key-Hash)

這裡寫圖片描述
比特幣中的交易輸出就是使用P2PKH格式的。
P2PKH輸出通常包含一個位元比地址,可以通過構建包含相應public key和根據相應私鑰生成(ECDSA)的簽名的unlocking script解鎖。

簽名雜湊型別

區塊鏈籤允許多個使用者和多個輸入。
簽名(signature)隱含了簽名者(signer)對交易的承諾(commitment)。
比特幣簽名可以通過設定不同的SIGHASH標誌來指示哪一個部分的資料被包含在數字簽名中。

下面前三個標誌是互斥的,第四個標誌可以與前三個標誌組合:
* ALL(0x01) 對應所有輸入和輸出的簽名
* None(0x02) 應用到所有輸入
* SINGLE(0x03) Signature applies to all inputs but only the one output with the same index number as the signed input
* SIGHASH_ANYONECANPAY(0x08) 可以與前面三個中的一個組合在一起。只對一個輸入進行簽名,其餘輸入不變。
這裡寫圖片描述
SIGHASH型別在交易簽名前就已經被新增到交易中了,所以它不能被更改。