比特幣中的多重簽名技術——數學和程式碼
我對比特幣多重簽名技術背後的數學和程式碼很感興趣。我一直在尋找創建多重簽名地址/公鑰並驗證交易/數字簽名的實際程式碼;可以一口氣執行。我在比特幣核心中沒有找到任何東西,可能是因為我不知道去哪裡找。有誰知道我在哪裡可以找到創建多重簽名地址和驗證的實際程式碼。我還想知道是否有任何m of n 用程式碼編寫的方案以及地址 /pub 密鑰創建和簽名驗證背後的數學解釋。
Multisig 比特幣交易的實現相當簡單,除了用於 P2PKH 交易的正常 ECDSA 之外,不需要任何高級密碼學知識。沒有“mutltisig address”或“multisig pubkey”,但使用正常公鑰和正常簽名。多重簽名交易輸出本質上包含一個公鑰列表及其計數,以及一個與公鑰計數相關的門檻值計數
<=
,最後是OP_CHECKMULTISIG(VERIFY)
操作碼,它根據腳本中的公鑰檢查提供的簽名。在創建多重簽名地址方面,Bitcoin Core 中有兩個 RPC 命令。
createmultisig
和addmultisigaddress
。multisig 腳本創建背後的程式碼在standard.cpp#GetScriptForMultisig中,這很簡單。花費多重簽名輸出並不那麼簡單。您需要使用該命令,然後為滿足門檻值所需的每個簽名
createrawtransaction
呼叫,最後您可以使用 廣播已簽名的交易。signrawtransaction``sendrawtransaction
如上所述,這些交易沒有標準地址類型,但 PSBT(部分簽名比特幣交易),也稱為BIP-174定義了標準序列化和文本編碼(在 Base64 中),可用於在如果私鑰不屬於同一使用者,則上述過程中的每個點與其他方。
有建議以利用密鑰或簽名聚合的其他方式進行多重簽名方案。這些都沒有 BIP 形式的具體提案。我建議閱讀 Maxwell 等人的MuSig論文。作為起點,看看BIP-340,它定義了 Schnorr 簽名方案,該方案很可能在不久的將來成為比特幣的標準。請注意,
OP_CHECKSIGADD
BIP-342 中的提議本身並不允許密鑰或簽名聚合,但它確實允許更有效地批量驗證多個簽名。
普通地址 (p2pkh) 和多重簽名地址 (p2sh) 的區別在於前者是直接從公鑰派生的,而後者是從包含可以簽署交易以花費的公鑰的兌換腳本派生的。資金鎖定在該地址。在此贖回腳本中,您設置解鎖資金所需的簽名數量 (m) 以及可以與公鑰一起簽署交易的簽名總量 (n)。那麼,由於顯而易見的原因,m 必須 <= n。
以 base58 編碼時,多重簽名地址以“3”(主網)或“2”(測試網)開頭來標識。查看此參考:https ://en.bitcoin.it/wiki/List_of_address_prefixes
對於程式碼,您可以查看我的倉庫: https ://github.com/oscarsernarosero/blockchain/tree/master/bitcoin/basics/final
我仍在研究它,但其中大部分實際上是 Jimmy Song 的本書程式碼: https ://github.com/jimmysong/programmingbitcoin
你必須考慮到比特幣經歷了一個完整的軟分叉,以便像現在這樣處理多重簽名交易。這樣做是為了避免多重簽名交易的高額費用。查看<https://github.com/jimmysong/programmingbitcoin/blob/master/ch08.asciidoc>。
多重簽名交易的數學與 ECDSA 的數學沒有什麼不同,因為目前比特幣中的多重簽名過程更多的是關於腳本(比特幣使用的堆棧語言)中的智能合約,而不是數學。這就是為什麼這些地址或交易被稱為 p2sh(Pay To Script Hash),因為地址是需要 m-of-n 簽名的智能合約序列化的雜湊。因此,多重簽名交易是通過智能合約機製而不是通過數學程序來實現的。
您可以在文件 wallet.py 中找到我的 repo 中的地址部分。
我希望這解決了你的問題。