CHECKMULTISIG 一個成功的例子
我想知道是否有人可以指出或給我一個關於 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
以下是其工作原理的高級描述:
從堆棧中彈出 n(公鑰的數量)
從堆棧中彈出 n 個公鑰。
從堆棧中彈出 m(所需簽名的數量)
從堆棧中彈出 m 個簽名。
從堆棧中再彈出一個元素,然後忽略它。(這是一個錯誤,但無法修復,因為這是共識關鍵程式碼。)
循環遍歷所有公鑰,從堆棧頂部的密鑰開始。
對於每個公鑰,檢查一個簽名。
對於第一個檢查的公鑰,從最靠近堆棧頂部的簽名開始。
如果驗證失敗,請轉到下一個公鑰並檢查相同的簽名。
如果成功,則使用下一個簽名轉到下一個公鑰。
請注意,簽名需要與他們要簽名的密鑰的順序相同。 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
…等等。