Transactions
關於腳本 P2SH 的說明,如何執行到比特幣核心?
這個問題是我昨天文章的延續。
今天我有一個關於P2SH執行的問題,腳本的一個例子應該是這個
OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> <Public key C> OP_3 OP_CHECKMULTISIG OP_HASH160 <ScriptSig Hash> OP_EQUAL
或者如果使用 P2SH 密鑰應該是這個(我認為在這個腳本的左邊是轉換 P2SH 密鑰內的 hash160 的東西,對吧?)
OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> <Public key C> OP_3 OP_CHECKMULTISIG OP_HASH160 <P2SH key> OP_EQUAL
現在如果我理解得很好,執行的模擬分為兩個階段
- 雜湊
scriptSig
等於內部的雜湊scriptPubKey
模擬
- 放在
scriptSig
棧上,所以現在的棧是<A sig> <B sig> <A pubkey> <B pubkey> <C pubkey>
- 用堆棧內的數據計算
hash160
,所以現在堆棧狀態是<scriptSig hash>
- 放入
scriptSig
期望的雜湊,現在堆棧狀態是<hash scriptsig> <hash scriptsigexpected>
- 返回運算符的結果
OP_EQUAL
(真或假)
- 將
scriptSig
執行如腳本多重簽名模擬
- 入棧
scriptSig
,棧狀態為<A Signature> <B Signature>
- 推送公鑰,堆棧狀態為
<A Signature> <B Signature> <Public key A> <Public key B> <Public key C>
- 應用
OP_CHECKMULTISIG
運算符並得到結果我的問題是:
- 用P2SH鍵,執行是一樣的嗎?如果不是,帶有 P2SH 密鑰的 P2SH 的形式是什麼?
另外,我讀了這篇文章,但我認為不包含這個答案。
如果我的範例腳本是錯誤的,我很抱歉給我一個更正
讓我們一步一步來。假設您想將一些比特幣鎖定在 2-of-3 的多重簽名中。
鎖定步驟
- 創建一個多重簽名腳本:
OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG
.- 散列
HASH160
給你的多重簽名腳本multi-sig_scripthash
。- Base58Check
multi-sig_scripthash
使用版本 0x05 為您提供以 . 開頭的地址3...
。- 將
scriptPubKey
是OP_HASH160 <multi-sig_scripthash> OP_EQUAL
。解鎖步驟
- 您的堆棧將從
<signatures><redeemScript>
. 簽名是OP_0 <sig_A> <sig_B>
和redeemScript
是OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG
。- 從 v0.3.7 開始,Bitcoin Core 首先執行解鎖腳本並查看生成的堆棧。所以你
<signatures>
和<redeemScript>
首先一起評估。這將導致多重簽名評估。- 在正常情況下,上述步驟應該只返回 1,因為簽名滿足redeemScript。但是對於 P2SH,BIP-16添加了一個警告。每當您有一個
OP_HASH160 <hash> OP_EQUAL
鎖定腳本時,它都會用作 P2SH 標識符。<signatures>
因此,在將with<redeemScript>
的評估redeemScript
從堆棧複製到另一個之前。<signatures><redeemScript>
然後使用堆棧上的內容(在我們的例子中)完成評估。如果成功,將目前堆棧替換為 justredeemScript
。<redeemScript>
因此,堆棧頂部的不是 1 。- 您
OP_HASH160
在redeemScript 上執行。堆棧現在<hash160_of_redeemScript>
- 你推
<expectedredeemScripthash>
。堆棧現在<hash160_of_redeemScript><expectedredeemScripthash>
- 您執行
OP_EQUAL
導致評估並將 1 返回到堆棧頂部。