比特幣規定客戶端可運行五種標准交易腳本,分別為 P2PKH、P2PK、P2SH、MS 和 OP_Return,不同的腳本對應着不同的特性和用途。
<比特幣交易腳本基於堆棧的執行語言>
1. P2PKH(Pay to Public Key Hash)
該腳本為比特幣網絡大多數交易所采用的交易腳本。該腳本包含一個鎖定腳本,對交易輸出進行鎖定,即公鑰和對應的公鑰哈希(PKH)。該腳本鎖定的輸出通過鍵入公鑰和經相應私鑰創設的數字簽名解鎖。
鎖定腳本
假如 Bob 給 Alice 轉賬 0.1 BTC,Bob 會在交易中創建一個輸出腳本:
OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG
腳本對輸出交易解鎖條件需要提供簽名和公鑰,因為簽名是用戶私鑰生成,所以僅 Alice 能夠創建解鎖該腳本的驗證簽名。
解鎖腳本
Alice 花費該交易 0.1 BTC 時,提供相應的解鎖腳本:
< Alice Signature > < Alice Public Key >
合並腳本
腳本合並,解鎖腳本在前,鎖定腳本在后:
< Alice Signature > < Alice Public Key > OP_DUP OP_HASH160 < Alice Public Key Hash > OP_EQUAL OP_CHECKSIG
此腳本根據逆波蘭表達式進行計算
腳本執行步驟
- Alice Signature, Alice Public Key 壓入棧;
- OP_DUP 復制棧頂元素並壓入棧頂;
- OP_HASH160 計算棧頂元素的哈希值,並將結果壓入棧頂;
- Alice Public Key Hash 操作數直接壓入棧頂;
- OP_EQUAL 對兩個操作數判斷,相等則通過;
- OP_CHECKSIG 對公鑰和簽名進行檢查,確認簽名是由公鑰對應的私鑰生成的,執行完畢結果壓入棧中。
僅當解鎖腳本與鎖定腳本相匹配時,組合腳本執行結果才會為 True ,即解鎖腳本提供了 Alice 的有效簽名。
2. P2PK(Pay to Public Key)
該模式是比較簡單的交易腳本模式。相對於 P2PKH ,未對公鑰進行哈希,所以可能會泄露用戶公鑰。Coinbase 的交易常使用該模式。
鎖定腳本
鎖定腳本形式如下:
< Public Key > OP_CHECKSIG
解鎖腳本
解鎖腳本僅包含一個操作數,即使用者簽名
< Signature of A >
組合腳本
組合腳本形式如下:
< Signature of A > < Public Key > OP_CHECKSIG
調用 OP_CHECKSIG 操作符,對經過用戶 A 的私鑰的簽名和 A 私鑰對應的公鑰進行驗證,結果為真即通過校驗。
3. P2SH(Pay to Script Hash)
該腳本僅記錄20字節的腳本哈希,從而對具體的腳本細節進行了保護。需要使用通過該類腳本鎖定的 UTXO 時,出示對應哈希值的原始腳本,並保證腳本運行結果為真。
鎖定腳本
鎖定腳本形式如下:
HASH160 PUSHDATA (目標腳本哈希) EQUAL
解鎖時提供對應的目標腳本。
4. 多重簽名(Multi-Signature)
多重簽名提供的解鎖場景:在相關的 N 個公鑰中,需要提供 M 個公鑰對應的簽名,才可以對相應的 UTXO 進行解鎖。此腳本在涉及多方協商交易的場景下較為有效。其中 N 為公鑰總數,M 為至少提供的簽名數量。
鎖定腳本
多重簽名鎖定腳本形式如下:
M < Public Key 1 > < Public Key 2 > ... < Public Key N > N OP_CHECKMULTISIG
解鎖腳本
解鎖腳本形式如下:
OP_0 < Signature k > < Signature j > ...
鎖定腳本和解鎖腳本結合,即可對提供的簽名進行驗證,達到多重簽名鎖定的目的。
5. 數據記錄輸出(OP_Return)
數據記錄輸出腳本主要用於對比特幣功能的拓展。開發者可通過該腳本添加80字節的非交易數據信息。
在P2PKH(pay to pubKey hash)交易中,可以將output里的驗證腳本換成其它數據。這么做會導致這筆交易里的比特幣不能再被花費,因為很難再找到滿足條件的調用腳本(需要反求哈希)。缺點是,未被花費的交易(UTXO)都會被存儲在內存中,因此這種交易就會占用許多內存空間,影響比特幣網絡的效率。
所以,我們可以使用比特幣的 OP_RETURN 指令。包含這一指令的交易也是不可花費的,但節點可以將其安全地移出UTXO集合,這筆交易可以在 OP_RETURN 中存儲一定數量的字節。
參考資料:
《區塊鏈技術及應用》——華為區塊鏈技術開發團隊