Multi-Signature

在不知道其中一個密鑰的情況下進行多重簽名

  • February 8, 2018

我想建構一個 1-of-2 多重簽名腳本,但我不知道其中一個鍵,我只知道它的地址。問題是,這可能嗎?

所以我在想是否有可能建構一個有 2 個分支的腳本,第一個分支將允許我現在花錢的第一個公鑰。第二個分支需要一個支出腳本來提供公鑰,然後將公鑰複製到堆棧上,然後進行雜湊處理以從中獲取地址,這個地址將與我知道的地址進行比較,如果匹配,它將允許花費硬幣。

實際上,如果您有一個公鑰,然後是另一個公鑰的雜湊,您可以建構一個行為類似於 1-of-2 多重簽名的腳本。像這樣的東西可以解決問題:

OP_DUP OP_TOALTSTACK <pubKey1> OP_CHECKSIG
OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY 
OP_CHECKSIGVERIFY OP_ENDIF
<0x01>

pubKey1如果提供了驗證過的簽名或提供了匹配的有效簽名和公鑰,則輸出腳本將被解鎖pubKeyHash2

在第一種情況下,使用者使用pubKey1有效簽名進行消費:

ScriptSig: <signature1>

評估:

  1. <signature1> OP_DUP OP_TOALTSTACK <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  2. <signature1> <signature1> OP_TOALTSTACK <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  3. <signature1> <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  4. 0x01 OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  5. <0x01>

請注意,由於第一個OP_CHECKSIG返回True,條件內的操作碼沒有執行,腳本成功終止(留0x01在堆棧中)。

在第二種情況下,使用者使用pubKeyHash2有效簽名並顯示與雜湊匹配的公鑰:

ScriptSig: <signature2> <pubKey2>

評估:

  1. <signature2> <pubKey2> OP_DUP OP_TOALTSTACK <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  2. <signature2> <pubKey2> <pubKey2> OP_TOALTSTACK <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  3. <signature2> <pubKey2> <pubKey1> OP_CHECKSIG OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  4. <signature2> 0x00 OP_NOTIF OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  5. <signature2> OP_FROMALTSTACK OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  6. <signature2> <pubKey2> OP_DUP OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  7. <signature2> <pubKey2> <pubKey2> OP_HASH <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  8. <signature2> <pubKey2> <pubKeyHash2> <pubKeyHash2> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  9. <signature2> <pubKey2> OP_CHECKSIGVERIFY OP_ENDIF <0x01>
  10. <0x01>

在這種情況下,第一個OP_CHECKSIG失敗,所以條件裡面的程式碼被執行。此程式碼使用 驗證簽名和公鑰pubKeyHash2,並在任何驗證失敗時使腳本失敗。如果兩個驗證都通過,則腳本推0x01送到堆棧,成功終止。

PD:請不要在沒有先檢查它是否按預期工作的情況下在主網中使用此腳本;)

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