8 - 1 了解 P2SH
上面幾部分我們知道比特幣腳本可以控制 UTXO 的贖回,上面介紹的都是固定的腳本,
之後我們想要自己寫腳本,但可沒那麼簡單,因為比特幣現在只會識別這五個腳本:
- Pay to Public Key (P2PK): 目前已過時
- Pay to Public Key Hash (P2PKH): 標準交易 (
OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY
) - MultiSig: 多簽交易(也是一種 P2SH)
- Null Data: 無法使用的交易
- Pay to Script Hash (P2SH): 轉到履行腳本的交易
如果我們想要寫自己的 script,就要用 P2SH,因為只有這個可以接受自訂的 script。
我們來看一下多簽交易的鎖定腳本
"scriptPubKey": {
"asm": "OP_HASH160 babf9063cee8ab6e9334f95f6d4e9148d0e551c2 OP_EQUAL",
"hex": "a914babf9063cee8ab6e9334f95f6d4e9148d0e551c287",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"2NAGfA4nW6nrZkD5je8tSiAcYB9xL2xYMCz"
]
}
這個腳本的內容是 "OP_HASH160 babf9063cee8ab6e9334f95f6d4e9148d0e551c2 OP_EQUAL"
中間那串 Hash 字串是履行腳本 (redeemScript
),只有在履行時會顯示內容,也就是說
P2SH 的格式是:OP_HASH160 <redeemScript> OP_EQUAL
每個 P2SH 腳本都帶有 20-bytes Hash 的履行腳本,當 P2SH 交易被履行,履行腳本會被帶入
scriptSig,接著往下執行 script。
P2SH 有趣的地方是發送方或區塊鏈本身都不知道履行腳本內容是什麼,發送方只是送交易到 P2SH 的地址,
接收方要怎樣的使用發送方不管。
履行腳本在測試網路是 2 開頭,主網是 3 開頭。
如何創造 P2SH 腳本
創建 P2SH 的交易很簡單,只要創建一個帶有 20-bytes 履行腳本 Hash 的鎖定腳本交易即可。
Hash 方式是比特幣的 OP_HASH160。
所謂的 OP_HASH160 是 SHA-256 + RIPEND-160 hash
步驟:
- 創造鎖定腳本
- 創造一個根據 1. 的鎖定腳本的序列號碼(serialized version)
- 對序列號碼做 SHA-256
- 對 4. 的結果做 RIPEMD-160
以上是比較詳細的步驟,實際上都可用提供的 API 來完成。
如何送出 P2SH 腳本交易
P2SH 腳本交易也很簡單,
- 把上面做出來的 Hash 放到
OP_HASH160 <redeemScriptHash> OP_EQUAL
的履行腳本裡 - 翻譯為 Hexcode
- 用此 hex 當作 scriptPubKey
- 完成剩下的交易步驟
如何解鎖 P2SH
要點是接收方也要有同樣的鎖定腳本序列號碼,之所以叫履行交易是因為接收方要去「履行」這個腳本。
P2SH 的解鎖腳本 scriptSig
形式會是 ... data ... <redeemScript>
, data 只能是 data。
履行時 ... data ... <redeemScript>
OP_HASH160 <redeemScriptHash> OP_EQUAL
,步驟為:
- 履行腳本做
OP_HASH160
- 比對
<redeemScriptHash>
- 正確則使用 data
- 驗證通過則可以使用這筆 UTXO
P2SH 可以用來做智能合約,很有用