天天看點

交易校驗與交易腳本校驗與腳本交易腳本簽名哈希類型

交易校驗與交易腳本校驗與腳本交易腳本簽名哈希類型

校驗與腳本

交易校驗是基于對腳本語言的執行結果的判斷。

交易校驗引擎依賴于兩種類型的腳本:

* 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類型在交易簽名前就已經被添加到交易中了,是以它不能被更改。