為什麼 Schnorr 簽名被譽為比特幣 Segwit 後的最大技術更新|技術
導讀:Schnorr 簽名主要的目標是取代目前比特幣現行的 ECDSA 簽名。相比於比特幣區塊鏈目前採用的 ECDSA,Schnorr 具有一些優勢
本文字數:7920,閱讀時長大約:13分鐘
本報告由火幣區塊鏈研究院出品?
報告發布時間 2020 年 10 月 30 日
作者:袁煜明、馬天元、趙文琦、陳樂
10 月 15 日,比特幣核心開發者 Pieter Wuille 主導的 3 個提案(BIP340-342)的代碼正式合入比特幣代碼的主分支。三個提案分別包含了 Schnorr、Taproot 和 Tapscript 的內容。社區評價這次變更為隔離見證之後比特幣上最大的技術更新。
Schnorr 簽名主要的目標是取代目前比特幣現行的 ECDSA 簽名。相比於比特幣區塊鏈目前採用的 ECDSA,Schnorr 具有一些優勢:
1. 簽名安全性高,其安全性可被數學證明,並具有不可延展性;
2. 簽名可為多重簽名的參與方提供隱私保護;
3. 簽名的線性特徵,可作為 Taproot 等技術的基礎,進一步加強交易的隱私性;
4. 簽名長度更短,且可聚合多簽,能節省存儲空間,實現變相比特幣擴容;
5. 簽名可批量驗證,從而提高驗證效率;
不過,它也有一些不足之處,在於:
1. 用戶在使用前需要多輪交互;
2. 簽名會消耗一些額外帶寬和計算資源;
3. 簽名對隨機數的隨機性要求非常高。
作為一項可能會替代橢圓加密演算法 ECDSA 簽名機制的技術更新,Schnorr 簽名是比特幣底層技術開發的重要里程碑之一。此次代碼加入後,意味著這項技術已經基本成型,接下來需要等待社區確定軟分叉的正式激活時間,不過此時間點目前尚未有定論。
1 背景介紹
Schnorr 簽名機制最初由德國密碼學家、數學家 Claus-Peter Schnorr 發明(見圖1),Schnorr 數字簽名也因他的名字而命名。Schnorr 的安全性基於特定的離散對數問題,長期以安全性和簡單性而聞名。但是 Schnorr 為他的簽名註冊了專利,因此,這項技術雖好,但是很長一段時間內,一些應用無法直接使用它。
直到 2008 年時,Schnorr 簽名的專利才過期。同時,業界也沒有廣泛接受的具體實現方案,所以在同年發布比特幣白皮書的中本聰,在當時並沒有選擇 Schnorr 簽名方案,而是選擇了當時更為成熟的 ECDSA 簽名方案。隨著 Schnorr 技術專利的過期,這項技術逐漸落地,在比特幣社區 Pieter Wuille 等核心開發者的推動下,社區內開始認真考慮應用 Schnorr 簽名替代現行的 ECDSA 簽名,並以軟分叉的方式進行升級。
在 2018 年 7 月,比特幣核心開發者 Pieter Wuille 就提議了升級 Schnorr 的 BIP,隨後 Blockstream 和開源社區亦參與了相關開發工作。在比特幣正式採用之前,比特幣的分叉幣 BCH 中已通過硬分叉提前部署了 Schnorr。即在 2019 年 5 月,BCH 就已經將簽名方案升級為了 Schnorr 簽名。之所以它會被更早激活,主要是因為它是通過硬分叉完成的升級,而比特幣不能採用硬分叉的方案,需要更為精巧設計的軟分叉方案。
後來,Pieter Wuille 又進一步提出了 Taproot/Schnorr 軟分叉升級提案,並於今年 1 月被正式發布,即本文提到的 BIP 340-342。而此次,Schnorr 的升級提案已正式被合併入代碼庫。一起被合併進 Bitcoin 主幹的三個提案分別是 BIP 340:Schnorr Signatures for secp256k1、BIP 341:Taproot:SegWitversion 1 spending rules、BIP 342: Validation of Taproot Scripts。
其中,第一個提案就是 Schnorr 簽名的主提案。Taproot 是默克爾樹式的抽象語法樹升級,它與 Schnorr 簽名一起,將允許比特幣以隱私方式執行更多的智能合約腳本;而最後一個提案是在比特幣上對前兩個提案的補充,主要對原本的比特幣腳本進行了升級,以支持 Schnorr 簽名、批量驗證以及簽名哈希等。不過值得注意的是,Schnorr 演算法目前仍然沒有被業界標準化,此次 BIP 340 的提案採用的 Schnorr 仍然是基於比特幣量身定做開發的。
2 Schnorr簽名 與 BIP提案
2.1 Schnorr 簽名到底是什麼?
Schnorr 本質是一種密碼學簽名技術,我們可以簡單理解為,在比特幣系統中,Schnorr 將是 ECDSA 的替代升級方案。
ECDSA 的全稱是橢圓曲線數字簽名演算法(EllipticCurve Digital Signature Algorithm)。它在比特幣中的作用我們的並不陌生,我們在比特幣網路中的每一次簽名都用到了 ECDSA 技術。比如說,Alice 想發送一筆交易,必須要讓礦工確認只有 Alice 擁有私鑰,擁有這筆資產的處置權。因此 Alice 需要用 ECDSA 前去生成一個獨一無二且無法被修改的簽名,以證明 Alice 擁有私鑰,同時確認交易部分的具體金額。而等到 Schnorr 正式激活後,這項工作將由 Schnorr 接替。本過程見圖 2。
2.2 為什麼我們需要更換籤名方案?
在過去的 10 年時間內,ECDSA 運作情況良好,看起來能夠勝任這份生成簽名的關鍵性工作。但是有一個問題一直縈繞著 ECDSA,即目前業界暫時沒有能夠給出一個嚴謹的數學和密碼學證明,來證明 ECDSA 是數學安全的。與之形成對比的是,Schnorr 可以。在滿足一定條件的狀態下,Schnorr 簽名技術被證明在數學上是安全的。對於比特幣這樣高度依賴安全性的加密貨幣來說,能夠證明安全性的技術肯定要比實踐中暫未出現問題的技術更讓人放心。
??DavidPointcheval,Security Arguments for Digital Signatures and Blind Signature
??YannickSeurin,On the Exact Security of Schnorr-Type Signatures in the Random OracleModel
同時,對於比特幣來說,更重要的是 Schnorr 簽名具備「線性」的特徵,該特徵允許將多個用戶的公鑰通過線性計算聚合成一個公鑰,並能生成與之對應的聚合簽名。
為什麼說「線性」的特性對於當前的比特幣來說十分重要呢?ECDSA 本身是不支持多重簽名的,比特幣現在是通過 P2SH 腳本來處理,但是 P2SH 類的腳本會向網路暴露多簽交易的存在並揭示所有的簽名者。使用 Schnorr 簽名可以將多簽聚合為一個簽名,增強交易的隱私性,並節省解鎖腳本內因多簽帶來的空間佔用,節約寶貴的鏈上空間,實現變相擴容。整體而言,如果得到廣泛普及,有可能能夠帶來比特幣性能 5%~20% 左右提升。
此外,由於簽名被聚合成一個,在驗簽的時候也只需要進行一次驗證,這會降低計算的成本。這部分的技術細節我們將在下一章詳細講述。
Schnorr 簽名對於比特幣來說意義重大,還在於它能成為 Taproot 這類的技術基石。Taproot 也是此次第二個提案 BIP 341 的內容,Taproot 源自於 MAST(Merkelized Abstract Syntax Tree),它可以用基於默克爾樹的形式來表達複雜腳本。我們知道,默克爾樹的重要特性之一,就在於其可以在不揭示無關分支的真實數據的情況下,快速驗證某個節點值的存在性,因此被廣泛用於存儲區塊鏈中的交易、狀態數據等。基於這一特性的 Taproot,可以在不揭示腳本中未被使用到的分支條件情況下,完成腳本的運行。而對比來看,P2SH 則需要揭示出所有的腳本內容。
結合 Schnorr 簽名的技術,Taproot 甚至可以實現讓一個有複雜腳本的交易(包括閃電網路的交易、多簽交易、多判斷分支的交易等)看起來就像一個普通的 P2PKH 的交易。支持複雜腳本,保護腳本隱私,不暴露簽名者,讓一個有複雜判斷條件的交易看起來像普通交易一樣簡單,並且無法從形式上進行區分,這就是 Taproot 與 Schnorr 結合的效果。
2.3 Schnorr 會以什麼樣形式進行?
和此前眾多的 BIP 類似,此次 Schnorr 以軟分叉的方式進行。
BIP 的全稱是比特幣改進提案(Bitcoin Improvement Proposals),通常來說,它包括對比特幣底層區塊鏈技術更新、新特性引入和信息補充等。自 2009 年中本聰發布第一版比特幣區塊鏈客戶端之後,大多數技術更新都以 BIP 形式被添加到比特幣技術中。目前,比特幣社區已採納百餘個 BIP 提案,比如:隔離見證(BIP 144)、P2SH 多簽結構(BIP 49)和助記詞(BIP 39)等。
硬分叉和軟分叉的區別大家可能並不陌生,在硬分叉中,社區由於對某些特性和技術出現強烈分歧時,會導致主鏈分成兩條鏈,且新老兩類客戶端相互不兼容,例如 BTC 和 BCH,BCH 和 BSV 等。而一次軟分叉升級中,如 Segwit 升級等,雖然社區可能會有分歧產生,但它仍能保持一條鏈,新老兩類客戶端能夠在一定程度上兼容。
硬分叉有時會帶來社區強烈的動蕩,因此比特幣社區長期對主動硬分叉升級持保留態度,儘可能地避免通過硬分叉升級。本次比特幣的 Schnorr 升級,將會通過軟分叉完成,這是它很可能得到社區順利激活的重要原因。
替換 ECDSA 簽名看起來是非常大的變動,為什麼 Schnorr 能夠通過軟分叉完成呢?這要從 Schnorr 本身說起。
Schnorr 的安全性基於一個假設:即某個特定離散對數問題非常難以解決,而且此安全性可通過數學手段證明。換句話說,只要此假設成立,則 Schnorr 簽名的難破解性,將等於該離散對數問題的難破解性。
同時,一個橢圓曲線中,也存在和該離散對數非常相似的難題。過去比特幣底層區塊鏈技術中的橢圓曲線數字簽名演算法(ECDSA)的安全性,也基於橢圓曲線離散對數問題(ECDLP)的難解性。
Schnorr 簽名仍然利用原來比特幣採用的橢圓曲線,不過其採用了一種新的計算方法,由此能夠最大程度上和不想升級的版本兼容,實現軟分叉升級。
另一方面,Schnorr 對 Segwit 客戶端改動非常小,而目前 Segwit 客戶端的普及率超過 90%。根據 luke.dashjr 統計,截至 2020 年 10 月,比特幣網路節點中超過 90% 的節點已經把客戶端更新為 0.16 版本以上,即 Segwit 升級後的版本。Segwit 將簽名信息從交易信息中隔離開,並作為單獨的結構附加到結尾。因為簽名信息只起到驗證作用,不影響交易的關鍵參數:如轉賬地址、數量等。Schnorr 簽名主要影響簽名信息,對於升級了 Segwit 特性的客戶端來說,Schnorr 簽名只涉及到以單獨結構附在結尾的簽名驗證信息,因此影響較小。
綜上所述,Schnorr 簽名可以以軟分叉升級的形式被添加到比特幣區塊鏈底層上,無需硬分叉,不會給社區帶來分裂。拒絕 Schnorr 簽名的客戶端仍然可以正常加入網路,完成打包等操作。軟分叉作為一種區塊鏈賬本的升級手段,雖然實現難度更大,往往需要精巧的設計以繞開某些規則,但是它兼容性更好,不會導致共識分裂,是一種循序漸進的、溫和的更新方式。
由於軟分叉的溫和升級特點,再加上 Schnorr 弊端較小,由核心開發人員(Bitcoin Core)推動,因此它具有較高的激活可能性。
3 Schnorr簽名技術細節解析
接下里,讓我們對 Schnorr 簽名的技術細節進行解析:
3.1 安全性高
Schnorr 簽名的安全性從數學上得到了證明,而 ECDSA 暫時還沒有被證明。雖然過去很多年以來,ECDSA 一直沒有出現安全問題,就好比一座從來沒有噴發過的火山,長久沉寂,但是你不知道它會不會有一天突然爆發。而一個得到數學證明的演算法一定是要比可能還有「隱患」的演算法更加令人信任。
在 David Pointcheval、Yannick Seurin 等學者的數學證明下,我們知道,在隨機預言模型中,假設橢圓曲線離散對數問題很困難,想要突破 Schnorr 簽名的唯一方法就是解決離散對數問題。
因此從某種程度上來說,Schnorr 簽名更加安全,更加可信(trustless)。
此外,Schnorr 簽名具有不可延展性,這一特性在與 ECDSA 的對比中能得到充分展現,ECDSA 是一個可延展的簽名演算法。具體來說,基於 ECDSA 生成的簽名,對於一個給定的消息,攻擊者在不知道密鑰的情況下,可生成同樣有效的新簽名。比特幣上還專門提出了 BIP 146 以應對該問題。但 Schnorr 簽名天然具有不可延展性,可以直接規避這一安全問題。
3.2 支持簽名的聚合,節省存儲空間
簽名的聚合,主要指的是對多重簽名的聚合。多重簽名(簡稱多簽)是 Bitcoin 中的一種控制資金使用許可權的技術。例如我們常見的「2 of 3」多簽,要求被授權的 3 方中至少要有 2 方對交易進行了簽名,這筆資金才能被使用。
例如上面的圖 4 就是一筆「2 of 3」多簽的輸入腳本,可以看到紅框中就是 2 個 ECDSA 的簽名,有了這 2 個簽名,這筆資金就可以被合法的使用。但是 ECDSA 的多簽沒有對簽名做任何的聚合,只是簡單的把每個簽名都放在輸入腳本中,並且 2 個簽名者的公鑰也需要分別放在輸入腳本中。假如有一個「9 of 10」多簽,就需要在區塊中存放 9 個簽名和 9 個公鑰,這是很佔用空間的。
但如果使用 Schnorr 簽名,就可以改善這一問題。Schnorr 簽名通過一種叫做密鑰聚合(Key Aggregation)的技術,可以將任何一筆「m of n」多簽中的 m 個簽名聚合為 1 個簽名,同時 m 個簽名者的公鑰也可以聚合為 1 個公鑰。無論 m 多大,在輸入腳本中都只需要填寫 1 個簽名和 1 個公鑰,這樣可以大大減少多簽在區塊中佔據的空間。
上圖為 Pieter Wuille 對 Bitcoin 歷史數據做的一個模擬測算,將 Bitcoin 歷史數據中所有的多簽都替換成 Schnorr 的聚合簽名後,可以顯著降低 Bitcoin 區塊的存儲空間。
上面提到的還只是 Schnorr 聚合簽名中的一種,即「對 UTXO 單個輸入中的多個簽名進行聚合」。事實上,Schnorr 簽名還有更強大的功能,可以「對 UTXO 多個輸入中的多個簽名進行聚合」,從而使整個 UTXO 只有一個 Schnorr 簽名。不過這種聚合的前置條件比較苛刻,實施起來比較複雜。
3.3 簽名長度更短,節省存儲空間
根據 Pieter Wuille 提出的方案,Bitcoin 中使用的 Schnorr 簽名演算法,公鑰的長度為 32 位元組,簽名長度為 64 位元組。而 Bitcoin 目前使用的 ECDSA 簽名演算法,公鑰長度為 33 位元組,簽名最長會達到 72 位元組。Bitcoin 區塊寸土寸金,節省一點空間都是意義重大的。
例如圖 3 中這筆 2 個輸入 2 個輸出的 UTXO,其中紅框選中的部分就是輸入中填入的 ECDSA 簽名,長度為 72 位元組;之後緊跟的就是 33 位元組的公鑰。那麼採用 Schnorr 簽名之後,簽名和公鑰所佔的空間就可以減少為 64 位元組和 32 位元組。
事實上 Schnorr 簽名還有一種變種,可以把簽名縮短到 48 位元組,但由於不支持批量驗證,Pieter Wuille 並不推薦使用。
3.4 更強的隱私保護
Schnorr 可以用於多把密鑰聚合成一把,它能讓比特幣「多重簽名」錢包發出的交易只展示聚合後的一把,這令多重錢包更為簡潔和隱私。過去,用戶基於 ECDSA 簽名使用「多重簽名」錢包時,因為要展示多把公鑰,因此容易被暴露此錢包的多重簽名情況。但是如果基於 Schnorr 簽名,多把密鑰在鏈下進行聚合,可以讓一筆多重簽名的交易看起來和正常交易(即單簽名交易)無異。
還是上面那個「2 of 3」多簽的例子,可以看到提供簽名的 2 方的公鑰都被暴露出來了,也就是說,哪 2 方參與了多簽是公開的。但如果採用 Schnorr 的聚合簽名,公鑰也被聚合為了 1 個,這樣就不會暴露是哪 2 方參與了多簽。聚合後的多簽甚至和一個正常的「單簽」看起來也沒有區別,這就意味著外界看來甚至不知道這是一筆多簽。這大大保護了多簽參與者的隱私。
3.5 簽名可批量驗證,提高驗證效率
Schnorr 簽名,由於具有線性性質,天然的就可以支持批量驗證。其實原理並不複雜,Schnorr簽名的驗證過程,就是判斷一個等式是否成立。而批量驗證,就是當有 n 個這樣的等式需要驗證,我們可以把它們的左邊全部加起來,右邊也全部加起來,這樣只需要驗證一次等式是否成立,就可以判斷 n 個簽名是不是都合法。
並且原本驗證 n 個等式時,計算需要做 n 次乘法,現在可以合併為,只需要做 n-1 次加法和 1 次乘法,大大的提高了驗證效率。
Schnorr 簽名的這種線性性質是天然具備的,因此即使來自於不同的用戶、不同 Tx,甚至不同區塊的簽名,都可以合在一起進行批量驗證。一個新的全節點,在同步區塊數據時,需要做大量的驗證工作,如果 Bitcoin 採用 Schnorr 簽名,通過批量驗證就可顯著提高全節點的同步速度。
3.6 一些不足之處
前面講的都是 Schnorr 簽名的優勢。事實上,帶來這些好處也是有代價的。因為 Schnorr 聚合私鑰簽名的特點,它需要參與方進行多輪交互,這相比過去的 ECDSA 會更麻煩一些。而且它對隨機數的要求比較高,必須確保隨機數不容易被攻擊者猜到,一些傳統的偽隨機數生成方式不一定適合。同時,PC 計算這些簽名和生成隨機數的過程還是比較繁瑣的,因此也會造成發送交易這一步驟的少許延遲,並要求 PC 消耗更多的計算帶寬資源。但是,以目前的技術而言,這些問題都可以在一定程度進行解決和克服。
4 總結
Schnorr 簽名相比 ECDSA 更加安全可信,而且還順便帶來了比特幣鏈上空間的擴容,使得比特幣性能得到小幅提升,同時,Schnorr 簽名還能保護多簽、閃電網路等技術的參與方的隱私,結合 Taproot 還能使得更多智能合約腳本得以增加隱私性。
目前來看,提案由 Core 組成員推動,以軟分叉方式進行溫和升級,未來一段時間順利激活的概率很大,也期待 Schnorr 簽名能為比特幣以及區塊鏈世界,帶來更多新鮮技術活力。