Script

CHECKMULTISIG 一個成功的例子

  • December 7, 2020

我想知道是否有人可以指出或給我一個關於 OP_CHECKMULTISIG 如何在幕後工作的範例?

我希望 CHECKMULTISIG 將呼叫 CHECKSIG 函式並操縱堆棧以在循環中執行 CHECKSIG 直到它終止並且是否具有其 M-out-of-N 有效信號?

但它究竟是如何工作的呢?例如 2-of-3 多重簽名。如果我們在 scriptSig 中有 OP_0 (sig1) (sig2),那麼堆棧將如下所示:

  • (信號2)
  • (信號 1)
  • 0

現在從scriptPubKey中CHECKMULTISIG的一般寫法來看:2 (pubKey1) (pubKey2) (pubKey3) 3 OP_CHECKMULTISIG,當將所有數據壓入堆棧時,scriptPubKey的堆棧將如下所示:

  • 3
  • (pubKey3)
  • (pubKey2)
  • (pubKey1)
  • 2

CHECKMULTISIG 的第一步究竟是什麼?

它會從堆棧中彈出“3”,然後檢查堆棧上是否有三個 pubKey?

或者它只是彈出“3”然後立即在 (sig2) 和 (pubKey3) 上執行 CHECKSIG,這將是無效的,因此 CHECKSIG 將在堆棧上壓入一個“0”?

然後 CHECKMULTISIG 會刪除 CHECKSIG 在堆棧中引入的“0”並使用 (sig2) 和 (pubKey2) 重試嗎?由於這是有效的,CHECKSIG 將在堆棧上壓入一個“1”,但是 CHECKMULTISIG 將這個“1”儲存在哪裡?

最後CHECKMULTISIG會計算多少個“1”的CHECKSIG,這個數字必須對應於堆棧上的最後一個值,在這種情況下是“2”,但通常是“M”?

我真的很想找到 CHECKMULTISIG 的低級描述,類似於我可以為 CHECKSIG 找到的描述: https ://en.bitcoin.it/wiki/OP_CHECKSIG

任何幫助將不勝感激!

我希望 CHECKMULTISIG 將呼叫 CHECKSIG 函式並操縱堆棧以在循環中執行 CHECKSIG 直到它終止並且是否具有其 M-out-of-N 有效信號?

這並不是它在內部實現的真正方式,所以如果你想像它是這樣執行的,就會有幾個陷阱。

OP_CHECKMULTISIG

以下是其工作原理的高級描述:

  1. 從堆棧中彈出 n(公鑰的數量)

  2. 從堆棧中彈出 n 個公鑰。

  3. 從堆棧中彈出 m(所需簽名的數量)

  4. 從堆棧中彈出 m 個簽名。

  5. 從堆棧中再彈出一個元素,然後忽略它。(這是一個錯誤,但無法修復,因為這是共識關鍵程式碼。)

  6. 循環遍歷所有公鑰,從堆棧頂部的密鑰開始。

  7. 對於每個公鑰,檢查一個簽名。

  8. 對於第一個檢查的公鑰,從最靠近堆棧頂部的簽名開始。

  9. 如果驗證失敗,請轉到下一個公鑰並檢查相同的簽名。

  10. 如果成功,則使用下一個簽名轉到下一個公鑰。

請注意,簽名需要與他們要簽名的密鑰的順序相同。 7. 如果所有簽名都使用其中一個密鑰成功,則 CHECKMULTISIG 返回 1,否則返回 0。

你的例子

你有這個 scriptSig:

   (sig2)
   (sig1)
   0

這個腳本公鑰:

   3
   (pubKey3)
   (pubKey2)
   (pubKey1)
   2

執行時,堆棧在 OP_CHECKMULTISIG 執行之前如下所示:

   3
   (pubKey3)
   (pubKey2)
   (pubKey1)
   2
   (sig2)
   (sig1)
   0

這是初始化後的樣子:

n->    3
ikey-> (pubKey3)
      (pubKey2)
      (pubKey1)
m->    2
isig-> (sig2)
      (sig1)
      0

它嘗試根據 sig2 驗證 pubKey3,但失敗了。推進 ikey,但不推進 isig:

n->    3
      (pubKey3)
ikey-> (pubKey2)
      (pubKey1)
m->    2
isig-> (sig2)
      (sig1)
      0

針對 sig2 驗證 pubKey2 成功,因此您推進 ikey 和 isig:

n->    3
      (pubKey3)
      (pubKey2)
ikey-> (pubKey1)
m->    2
      (sig2)
isig-> (sig1)
      0

…等等。

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