Signature

Schnorr 簽名的含義是什麼?

  • February 20, 2019

Adam Back (adam3us) 在 2014 年 3 月進行了解釋,但這全是數學。不過,還有另一篇具有優勢的短文

這個關於crypto.SE的答案聲稱比特幣考慮使用基於Schnorr簽名的Ed25519,但決定反對。即使它不會被使用,我仍然想知道它的含義。

一個拉取請求將它們添加到 libsecp256k1。[編輯 2019:該拉取請求使用了有缺陷的方法]

加文在他的比特幣願望清單中提到了它們。

警告:我從未真正使用過 Schnorr 簽名方案。以下是我基於閱讀維基百科文章ed25519 頁面以及 #bitcoin-dev中開發人員之間的一些討論的分析。

可能的變化

  1. **更改了操作碼行為:**我們將需要一個操作碼來檢查 Schnorr 簽名。通過硬分叉,我們可以重新定義 op_checksigop_checksigverify檢查 Schnorr 簽名。通過軟分叉,我們可以重新定義一個保留的空操作碼來檢查 Schnorr 簽名。
  2. **增加 P2SH 的使用(可能):**我認為引入新的地址格式來為支付 Schnorr 公鑰的 pubkey 腳本執行與 P2PKH 為 ECDSA 公鑰所做的相同的事情是極不可能 。這意味著即使只有一個密鑰(非多重簽名)也希望地址使用 Schnorr 的人將不得不使用 P2SH。當然,對於不需要地址的應用程序(例如用於挖礦或使用 BIP70 支付協議時),他們可以直接在其pubkey 腳本op_checksigverify_schnorr中使用(或其他)。
  3. 較小的多重簽名交易: Schnorr 方案最廣泛吹捧的優點之一是它可以允許多個簽名者將他們的簽名組合成一個簽名,該簽名可以根據所有授權方創建的單個公鑰進行身份驗證。這完成了與目前比特幣多重簽名相同的事情,但使用的字節更少。如果需要數十或數百個簽名,例如在眾籌情況下,這可能特別有用。注意:如果我理解正確,這也可以使用 ECDSA,但方式不太靈活。(2018 注意:現在有一篇論文詳細說明瞭如何在 ECDSA 上執行無腳本腳本,包括 2-of-2 多重簽名)
  4. **所有交易都略小:**假設比特幣使用 ed25519曲線,其密鑰強度與比特幣目前使用的secp256k1 ECDSA 曲線相似,與目前壓縮相比,壓縮的 Schnorr 公鑰和簽名將(分別)32 字節和最多 64 字節比特幣 secp256k1 公鑰和(非壓縮)簽名,長度為 33 字節,最多 75 字節。
  5. **多重簽名的合理否認:**使用 Schnorr門檻值簽名可能更容易防止多個簽名者或第三方知道還有誰簽名或未簽名。那是因為個人簽名被合併成一個統一的簽名,不會直接揭示誰簽署了它。這可以用於簽名者害怕因以特定方式花費資金而遭到報復的情況。
  6. 被授權方的合理否認使用第三方組織者(不需要信任私鑰),可以防止簽名者知道他們的私鑰是否是簽名密鑰集的一部分。雖然與比特幣交易沒有直接關係,但我似乎記得[1] Greg Maxwell 說他希望看到這個屬性用於分佈式論壇審核:選擇一群高級論壇成員,從他們每個人那裡獲取一個公鑰,創建從一些個人公鑰中提取一個門檻值公鑰,然後讓個人在他們認為應該刪除文章時送出簽名。第三方組織者(可能是一個自動化程序)將組合簽名而不洩露其簽名實際上有助於達到門檻值。如果沒有人知道誰的簽名真正重要,並且可能的版主數量很大,那麼對版主的有效報復就會變得非常昂貴。[1]:#bitcoin IRC 大約 4 個月前;不幸的是,該聊天室未公開登錄。
  7. 理論上更好的安全特性:專家們一致認為,一般 Schnorr 簽名 比等效的 ECDSA 簽名具有更好的理論安全特性。這些改進中最值得注意的是,Schnorr 中使用的散列函式不需要像 ECDSA 中使用的散列函式那樣具有抗衝突性。(比特幣可能會為 Schnorr 使用與 ECDSA 相同的雜湊函式:SHA256。)此外,上面連結的 ed25519 頁面描述了它抵抗側通道攻擊的幾種方法,這可以讓硬體錢包在不太安全的情況下安全執行環境。
  8. **更快的簽名驗證:**與 secp256k1 ECDSA 簽名相比,驗證 ed25519 Schnorr 簽名可能需要更少的 CPU 週期。這可能只是比特幣的一個微小改進:比特幣核心在將交易添加到其記憶體池之前驗證簽名。當接收到包含本地 mempol 中已有交易的區塊時,Bitcoin Core 不會重新驗證這些交易,因此只要本地節點和挖礦節點具有相同的 mempool,就不需要執行簽名驗證。(回想一下,coinbase 交易沒有簽名。)然而,簽名驗證目前是初始區塊鏈下載期間節點的一個邊界因素(假設高速連接和比特幣核心 0.10.0),所以“越快越好。 "
  9. **多重加密多重簽名:**有兩種(略有)不同的加密系統可供選擇,高安全性使用者可以創建需要 ECDSA 和 Schnorr 簽名的 2-of-2 多重簽名公鑰腳本,因此如果只有一個加密系統,他們的比特幣就不會被盜被打破。除非我們在 Schnorr 中進行硬分叉(參見第 1 點),否則他們將無法使用標準的 op_checkmultisig——但他們可以執行類似的操作<ecdsa pubkey> OP_CHECKSIGVERIFY <schnorr pubkey> OP_CHECKSIGVERIFY_SCHNORR

不確定性(對我而言)

  1. **可能更改了 TXID:**我對 Schnorr 簽名不夠熟悉,不知道它們如何具有延展性(可由第三方更改而不會使它們失效),但加密專家Adam Back 似乎認為它們具有相當的延展性。他的解決方案是將TXID的計算方式從更改hash(<whole transaction>)hash(<almost everything except the signature>)。這將解決目前一些基於延展性的問題,例如緩慢的小額支付渠道創建,但它也是有效影響所有比特幣軟體的主要硬分叉。這種規模的最後一個分叉——軟分叉P2SH 實現—經過三年的討論、兩年的實施和相當廣泛的使用,仍然沒有得到所有比特幣程序的支持。
  • **從簽名中恢復公鑰:**我不知道是否可以從 Schnorr 簽名中恢復 Schnorr 公鑰,就像可以從 ECDSA 簽名中恢復 ECDSA 公鑰一樣。這可能很重要:比特幣核心verifymessageRPC使用密鑰恢復來驗證使用signmessageRPC或其他客戶端的簽名消息實現簽名的消息。(注意:此點未編號,因為它是在原始發布之後添加的。)

沒有變化

為了清楚起見,這裡有一些不會改變的東西。

  1. 確定性簽名: 比特幣軟體中存在 確定性 ECDSA 簽名的趨勢。例如,Bitcoin Core 將在即將發布的 0.10.0 版本中開始使用它們。Schnorr 簽名也可以確定性地生成。使用確定性簽名,您不需要高質量的熵源(隨機性)來創建安全簽名。但是,您仍然需要高質量的熵來生成私鑰或根種子(見下文)。
  2. **HD 錢包:**在我看來,分層確定性 (HD) 密鑰生成協議 將適用於 Schnorr 密鑰對,只需進行一些小的修改。您甚至可以為 ECDSA 和 Schnorr 層次結構使用相同的根種子。
  3. **密鑰(地址)重用:**與正確實施的 ECDSA 一樣,可以為不同的交易安全地創建多個 Schnorr 簽名,這意味著將多個輸出接收到同一地址或公鑰是安全的。這與 某些僅允許您安全地使用每個公鑰一個簽名的簽名方案形成對比。但是,密鑰重用仍然不如為每筆交易使用唯一密鑰安全,而且對於您和您的貿易夥伴來說,密鑰重用的私密性總是要低得多。

優先

正如我的觀點:Schnorr 似乎為高級使用者提供了優於 ECDSA 的一些不錯的優勢,但似乎沒有人乞求這些功能——因此添加 Schnorr 簽名可能是低優先級。我猜想 Schnorr 簽名支持可能是首批改進之一,將在側鏈(PDF 連結)中進行全面測試,然後再移植回比特幣。

PS對不起,很長的文章,但感謝您提出這麼有趣的問題!

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