Transactions

關於腳本 P2SH 的說明,如何執行到比特幣核心?

  • September 18, 2019

這個問題是昨天文章的延續。

今天我有一個關於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

現在如果我理解得很好,執行的模擬分為兩個階段

  1. 雜湊scriptSig等於內部的雜湊scriptPubKey

模擬

  • 放在scriptSig棧上,所以現在的棧是<A sig> <B sig> <A pubkey> <B pubkey> <C pubkey>
  • 用堆棧內的數據計算hash160,所以現在堆棧狀態是<scriptSig hash>
  • 放入scriptSig期望的雜湊,現在堆棧狀態是<hash scriptsig> <hash scriptsigexpected>
  • 返回運算符的結果OP_EQUAL(真或假)

  1. 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 的多重簽名中。

鎖定步驟

  1. 創建一個多重簽名腳本:OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG.
  2. 散列HASH160給你的多重簽名腳本multi-sig_scripthash
  3. Base58Checkmulti-sig_scripthash使用版本 0x05 為您提供以 . 開頭的地址3...
  4. scriptPubKeyOP_HASH160 <multi-sig_scripthash> OP_EQUAL

解鎖步驟

  1. 您的堆棧將從<signatures><redeemScript>. 簽名是OP_0 <sig_A> <sig_B>redeemScriptOP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG
  2. 從 v0.3.7 開始,Bitcoin Core 首先執行解鎖腳本並查看生成的堆棧。所以你<signatures><redeemScript>首先一起評估。這將導致多重簽名評估。
  3. 在正常情況下,上述步驟應該只返回 1,因為簽名滿足redeemScript。但是對於 P2SH,BIP-16添加了一個警告。每當您有一個OP_HASH160 <hash> OP_EQUAL鎖定腳本時,它都會用作 P2SH 標識符。<signatures>因此,在將with<redeemScript>的評估redeemScript從堆棧複製到另一個之前。<signatures><redeemScript>然後使用堆棧上的內容(在我們的例子中)完成評估。如果成功,將目前堆棧替換為 just redeemScript<redeemScript>因此,堆棧頂部的不是 1 。
  4. OP_HASH160在redeemScript 上執行。堆棧現在<hash160_of_redeemScript>
  5. 你推<expectedredeemScripthash>。堆棧現在<hash160_of_redeemScript><expectedredeemScripthash>
  6. 您執行OP_EQUAL導致評估並將 1 返回到堆棧頂部。

引用自:https://bitcoin.stackexchange.com/questions/90456