Schnorr 簽名,對比特幣協議的一個擴展,掛在比特幣開發者的 wishlist 已經很長時間。在隔離見證實現後,Schnorr 簽名將會緊隨其後到來,改善比特幣的可擴展性、效率和隱私。

聽起來很玄妙,但首先可以明確這與隔離見證 SegWit 一樣,是由 Bitcoin Core 勢力在推動。所以我們看到,在今年 1 月份,斯坦福舉辦的 2018 年區塊鏈協議分析與安全工程學會議,簡稱 BPASE\’18 上,來自 Blockstream 的 Pieter Wuille 做了關於 Schnorr 簽名及其在比特幣中應用開發進展的報告。

其實早在 2012 年,Schnorr 簽名的相關技術已投入開發,Pieter Wuille 在 2016 年已經在爲引入 Schnorr 簽名進行慷慨激昂的遊說演講,Bitcoin Core 開發團隊也在比特幣發展路線圖上加入更改簽名的計劃。開發能力及社區支持等問題,先擺在一旁。對於努力學習和深度認知比特幣的同好們,還是有必要了解一下相關技術。

Pieter Wuille 在 BPASE\’18 演講介紹 Schnorr 簽名及開發進展

這裏,鏈聞 ChainNews 小聰幫你做好了資料整理,重點看看 Schnorr 簽名究竟是怎麼一回事兒,所能實現的改善,具體有哪些…

什麼是簽名

比特幣基於「公鑰密碼學」,使用公鑰、私鑰的密碼系統。一個公鑰對應一個私鑰,以數學方式相連,且單向。從私鑰很容易推導出對應的公鑰,但從公鑰不能推導出與之相對的私鑰。

爲了能交易某個地址中的比特幣,必須證明這個地址對應私鑰的所有權屬於你。不曝露私鑰的情況下,證明這個私鑰的所有權,就需要使用密碼簽名。

使用這個交易數據和這個私鑰進行一種計算,便產生了簽名。

目前的數字簽名方式,重點看下方的數字簽名,數據增加了交易規模,從而增加了礦工的交易費用

公鑰具備一項功能:知道公鑰,任何人都可以驗證創建這個簽名的私鑰是否正確,且無需知道這個私鑰本身即可完成驗證。正因如此,私鑰的擁有者可以簽名一個交易,去花掉比特幣,且不必擔心其他人知道這個私鑰並偷走比特幣。

簽名只對這一筆交易有效。私鑰也永遠不會泄露。

Schnorr 簽名由來

Schnorr 源於 Claus-Peter Schnorr 的發明,是一種簽名策略:一系列連接私鑰、公鑰和簽名的數學規則。很多密碼學家認爲 Schnorr
簽名在相關應用中是最好的,具備相當高水平的正確性,沒有延展性問題,驗證速度快,最重要是支持多重簽名,即把多個簽名聚合成爲一個新的簽名。

比特幣協議使用的是另一種類型的簽名策略 ECDSA 橢圓曲線數字簽名算法。Schnorr 簽名基於與 ECDSA 相同的安全假設,並與比特幣已使用的橢圓曲線 secp256k1 兼容。這意味着 Schnorr 簽名可以使用相同的私鑰創建,並與當前使用的密鑰派生方案兼容。但截至目前,Schnorr 簽名尚不能在比特幣中使用,除非硬分叉。

大家都知道的 SegWit 隔離見證,會把所有的簽名數據轉移到某個交易上的獨立空間:見證數據 witness 將不被嵌入從前比特幣協議中。有了腳本版本控制,所有見證中的規則通過軟分叉改變,包括 Schnorr 簽名策略。

爲交易騰出更多容量

Schnorr 對比特幣最大的好處是多重簽名聚合。很多比特幣交易包含多個輸入,這些輸入記錄着這些比特幣的地址來源,這些輸入需要有各自的簽名。這意味着即使一筆交易,也必須包含所有簽名,網絡必須傳輸所有這些簽名,同時一個區塊也必須包含所有這些簽名。這就好像你把零錢湊在一起,去買個百元的大件商品。

假如使用 Schnorr 簽名,所有輸入只需要一個合併簽名即可完成。這可以爲交易騰出更多空間。

__比較目前的狀況,重點看下方的數字簽名,_Schnorr 簽名聚合_預示着效率提升

從目前來看,ECDSA 簽名的大小各不相同,大多數字符長度爲 71-73 個字節,最大爲 75 個字節,理論上最小爲 8 個字節。Schnorr 簽名比
ECDSA 簽名更高效、更緊湊。每個簽名的最大長度是 64 個字節。

再比如 Bitcoin Core 給出的隔離見證方案,讓所有的見證數據大小減少 75%,1MB 見證數據可以壓縮至 0.25MB,在原來的區塊多騰出了 0.75MB 空間。然後,聚合的 Schnorr 簽名又可以減少見證數據量,按照 1MB 可以減少 0.5MB 計算,通過這兩次,見證數據可以壓縮到 0.125MB,相當於區塊容量提升約 17%,能騰出多少空間取決於區塊中所包含的交易類型。

比特幣核心開發者 Eric Lombrozo 估算,Schnorr 簽名最終會把總容量提高至少 40%,且是在隔離見證增加 60% 至 100% 容量之後。

多重簽名問題

上述的容量提升只針對一般交易,也就是包含多個輸入的交易。在多重簽名交易中,Schnorr 的威力更加強大。多重簽名交易中,一個輸入需要多個簽名,通常這些簽名又來自不同的人。像正常的交易一樣,多重簽名交易只需要單個簽名替代多個簽名,無論原本需要多少簽名,也不管這個交易涉及的人有多少。

爲更爲複雜的智能合約架構敞開了大門,且只需要一點點的數據需求量。不管是多重簽名交易類型是 2/3、3/15,或者 100/100,所有類型需要的簽名數據量相同,與單簽名交易類型所需量一致。

CoinJoin 隱私強化

Schnorr 簽名同時滿足隱私保護。如上文所述,一個交易可以包括多個輸入,通常情況下,與這些輸入相連的地址都屬於同一個人。

比特幣核心開發者 Gregory Maxwell 提出一種隱私強化方法 CoinJoin,讓不同的用戶把他們的交易組合進一個交易。這個交易包含來自不同交易的多個輸入,然後把錢發送的多個輸出中,傳送給不同的收款人。這好比一羣人,把各自的錢、硬幣放在一起,去不同的商店購物。每一個體不必各自去購買,但也會得到各自付出相應價格的商品。如進展順利,CoinJoin 將成爲在比特幣協議中加強隱私的一種方式,但這是後話。

Schnorr 簽名可以爲 CoinJoin 帶去優勢,讓所有 CoinJoin 交易的參與者不僅可以組合他們的交易,而且可以組合他們的簽名。交易體積比所有個體交易組合要小得多,這也意味着礦工打包的費用也會小得多。

難以預料的攻擊

據 Blockstream 聯合創始人 Pieter Wuille 這次在斯坦福的演講所述,Schnorr 簽名在過去的幾年中經歷了幾次「不容易被發現的挑戰」。

2017 年,在 Schnorr 簽名實施時,發現了「流氓密鑰攻擊」,即參加交易的一方使用一把特別製作的密鑰來盜竊資金。這個問題對於簡單的多重簽名是很好解決的,只需進行一個註冊程序,讓密鑰自己進行簽名,但是要支持一筆轉賬中的多個交易輸入就必須要使用公鑰,這個辦法也就行不通了。他們遞交了可能要進行的修訂,但被學會駁回,此後 ANSSI 密碼學專家 Seurin 加入了比特幣核心開發組,與 Pieter Wuille、比特幣核心開發者 Gregory Maxwell 及 Blockstream 數學家 Andrew Pwolstra 共同完成了更安全的構造改進。但隨後又發現了另一問題。

Blockstream 工程師 Russell O’Connor 發現了另一種攻擊,有多個參與者的交易中,其中一名參與者可以宣稱擁有其他人的密鑰,從而使用他人的交易輸出。Wuille 稱之爲「Russell 攻擊」,並表示在有多個參與者的交易中,攻擊模型非常微妙。

現在有幾個比特幣改進建議 BIPs 正在起着作用,一個代碼的實施,在發展過程中需要很長時間,如果上述情況持續下去的話,Schnorr 代碼的完成不會花很長的時間。

比特幣核心開發者 Nicolas Dorier 表示,Schnorr 簽名添加到比特幣協議上可能要花去很多年的時間。Wuille 也承認有必要用相當長的時間去充分推敲。

鏈聞小福利

對該話題感興趣或希望更深入瞭解比特幣 Schnorr 多重簽名算法,請關注鏈聞 ChainNews 微信公衆號 ChainNewsCom,發送信息「Schnorr」獲得:由 Gregory Maxwell、Andrew Poelstra、Yannick Seurin 及 Pieter Wuille 合著的論文《簡單 Schnorr 多重簽名算法及其在比特幣上的應用》(英文版)