區(qū)塊鏈知識(shí):Schnorr 簽名如何提升比特幣
在閱讀 Blockstream 撰寫(xiě)的 MuSig 論文時(shí),我一直在想象,這對(duì)于我一個(gè)比特幣用戶來(lái)說(shuō),到底意味著什么。我發(fā)現(xiàn) Schnorr 簽名的一些特性實(shí)在是非常棒而且便利,但某一些特性則非常煩人。在這篇文章里,我希望能跟各位分享我的想法。不過(guò),我們先快速回顧一下。
橢圓曲線簽名算法
當(dāng)前比特幣的所有權(quán)體系用的是 ECDSA(橢圓曲線簽名算法)。在簽名一條消息 $m$ 時(shí),我們先哈希這條消息,得出一個(gè)哈希值,即 $z = hash(m)$ 。我們也需要一個(gè)隨機(jī)數(shù)(或者至少看似隨機(jī)的數(shù))$k$ 。在這里,我們不希望信任隨機(jī)數(shù)生成器(有太多的錯(cuò)誤和漏洞都與不合格的隨機(jī)數(shù)生成器有關(guān)),所以我們通常使用 RFC6979,基于我們所知的一個(gè)秘密值和我們要簽名的消息,計(jì)算出一個(gè)確定性的 k。
使用私鑰 $pk$ ,我們可以為消息 $m$ 生成一個(gè)簽名,簽名由兩個(gè)數(shù)組成:$r$(隨機(jī)點(diǎn) $R = k * G$ 的 x 坐標(biāo))和 $s = (z + r*pk)/k$。
然后,使用我們的公鑰 $P = pk * G$ ,任何人都可以驗(yàn)證我們的簽名,也就是檢查 $(z/s)×G+(r/s)×P$ 的 x 坐標(biāo)確為 $r$。
- ECDSA 算法圖解。為便于說(shuō)明,橢圓曲線作在實(shí)數(shù)域上 -
這種算法是很常見(jiàn)的,也非常好用。但還有提升空間。首先,簽名的驗(yàn)證包含除法($1/s$)和兩次點(diǎn)乘法,而這些操作的計(jì)算量都非常大。在比特幣網(wǎng)絡(luò)中,每個(gè)節(jié)點(diǎn)都要驗(yàn)證每一筆交易,所以當(dāng)你在網(wǎng)絡(luò)中發(fā)出一筆交易時(shí),全網(wǎng)幾千個(gè)節(jié)點(diǎn)都要驗(yàn)證你的簽名。因此,即使簽名的過(guò)程開(kāi)銷變得更大,讓驗(yàn)證簽名變得更簡(jiǎn)單也還是非常有好處的。
其次,節(jié)點(diǎn)在驗(yàn)證簽名時(shí),每個(gè)簽名都要單獨(dú)驗(yàn)證。在一個(gè) m-n 的多簽交易中,節(jié)點(diǎn)必須多次驗(yàn)證同一個(gè)簽名。比如一筆 7-11 的多簽名交易,里面包含了 7 個(gè)簽名,網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)都要分別驗(yàn)證 7 個(gè)簽名。另外,這種交易的體積也非常大,用戶必須為此付出多得多的手續(xù)費(fèi)。
Schnorr 簽名
Schnorr 簽名的生成方式有些許不同。它不是兩個(gè)標(biāo)量 $(r, s)$,而是一個(gè)點(diǎn) $R$ 和一個(gè)標(biāo)量 $s$ 。類似于 ECDSA 簽名,R 是一個(gè)橢圓曲線上的隨機(jī)點(diǎn) $R = k * G$。而簽名的第二部分 s 的計(jì)算過(guò)程也有一些不同: $s = k + hash(P,R,m) ⋅ pk$ 。這里 pk 就是你的私鑰,而 $P = pk * G$ 是你的公鑰,m 就是那條消息。驗(yàn)證過(guò)程是檢查 $s * G = R + hash(P,R,m) * P$。
- 圖解 Schnorr 簽名和驗(yàn)證 -
這個(gè)等式是線性的,所以多個(gè)等式可以相加相減而等號(hào)仍然成立。這給我們帶來(lái)了 Schnorr 簽名的多種良好特性。
1. 批量驗(yàn)證
在驗(yàn)證區(qū)塊鏈上的一個(gè)區(qū)塊時(shí),我們需要驗(yàn)證區(qū)塊中所有交易的簽名都是有效的。如果其中一個(gè)是無(wú)效的,無(wú)論是哪一個(gè) —— 我們都必須拒絕掉整個(gè)區(qū)塊。
ECDSA 的每一個(gè)簽名都必須專門驗(yàn)證,意味著如果一個(gè)區(qū)塊中包含 1000 條簽名,那我們就需要計(jì)算 1000 次除法和 2000 次點(diǎn)乘法,總計(jì)約 3000 次繁重的運(yùn)算。
但有了 Schnorr 簽名,我們可以把所有的簽名驗(yàn)證等式加起來(lái)并節(jié)省一些計(jì)算量。在一個(gè)包含 1000 筆交易的區(qū)塊中,我們可以驗(yàn)證:
$(s1+s2+…+s1000) × G=(R1+…+R1000)+(hash(P1,R1,m1)×P1+ hash(P2,R2,m2)×P2+…+hash(P1000,R1000,m1000)×P1000)$
這里就是一連串的點(diǎn)加法(從計(jì)算機(jī)運(yùn)算的角度看,簡(jiǎn)直是免費(fèi)的)和 1001 次點(diǎn)乘法。已經(jīng)是幾乎 3 倍的性能提升了 —— 驗(yàn)證時(shí)只需為每個(gè)簽名付出一次重運(yùn)算。
- 兩個(gè)簽名的批量驗(yàn)證。因?yàn)轵?yàn)證等式是線性可加的,所以只要所有的簽名都是有效的,這幾個(gè)等式的和等式也必成立。我們節(jié)約了一些運(yùn)算量,因?yàn)闃?biāo)量和點(diǎn)加法比點(diǎn)乘法容易計(jì)算得多。 -
2. 密鑰生成
我們想要安全地保管自己的比特幣,所以我們可能會(huì)希望使用至少兩把不同的私鑰來(lái)控制比特幣。一個(gè)在筆記本電腦或者手機(jī)(在線錢包,熱錢包)上使用,而另一個(gè)放在 硬件錢包/冷錢包 里面。即使其中一個(gè)泄露了,我們還是掌控著自己的比特幣。
當(dāng)前,實(shí)現(xiàn)這種錢包的所發(fā)是通過(guò) 2-2 的多簽名腳本。也就是一筆交易需要包含兩個(gè)獨(dú)立的簽名。
有了 Schnorr 簽名,我們可以使用一對(duì)密鑰 (pk1,pk2),并使用一個(gè)共享公鑰 $P = P1 + P2 = pk1 * G + pk2 * G $ 生成一個(gè)共同簽名。在生成簽名時(shí),我們需要在兩個(gè)設(shè)備上分別生成一個(gè)隨機(jī)數(shù) (k1, k2),并以此生成兩個(gè)隨機(jī)點(diǎn) $Ri = ki * G$,再分別加上 $hash(P, R1 + R2, m)$,就可以獲得 s1 和 s2 了(因?yàn)?$si = ki + hash(P, R, m)* pki $ )。最后,把它們都加起來(lái)即可獲得簽名 $ (R, s) = (R1+R2, s1+s2) $,這就是我們的共享簽名,可用共享公鑰來(lái)驗(yàn)證。其他人根本無(wú)法看出這是不是一個(gè)聚合簽名,它跟一個(gè)普通的 Schnorr 簽名看起來(lái)沒(méi)有兩樣。
不過(guò),這種做法有三個(gè)問(wèn)題。
第一個(gè)問(wèn)題是 UI 上的。要發(fā)起一筆交易,我們需要在兩個(gè)設(shè)備上發(fā)起多輪交互 —— 為了計(jì)算共同的 R,為了簽名。在兩把私鑰的情況下,只需訪問(wèn)一次冷錢包:我們可以在熱錢包里準(zhǔn)備好待簽名的交易,選好 k1 并生成 $R1 = k1 * G$,然后把待簽名的交易和這些數(shù)據(jù)一同傳入冷錢包并簽名。因?yàn)橐呀?jīng)有了 R1,簽名交易在冷錢包中只需一輪就可以完成。從冷錢包中我們得到 R2 和 s2,傳回給熱錢包。熱錢包使用前述的 (k1,R1) 簽名交易,把兩個(gè)簽名加總起來(lái)即可向外廣播交易了。
這在體驗(yàn)上跟我們現(xiàn)在能做到的沒(méi)有什么區(qū)別,而且每當(dāng)你加多一把私鑰,問(wèn)題就會(huì)變得更加復(fù)雜。假設(shè)你有一筆財(cái)富是用 10 把私鑰共同控制的,而 10 把私鑰分別存放在世界各地,這時(shí)候你要發(fā)送交易,該有多麻煩!在當(dāng)前的 ECDSA 算法中,每個(gè)設(shè)備你都只需要訪問(wèn)一次,但如果你用上 Schnorr 的密鑰聚合,則需要兩次,以獲得所有的 Ri 并簽名。在這種情況下,可能不使用聚合,而使用各私鑰單獨(dú)簽名的方式會(huì)好一些 —— 這樣就只需要一輪交互。
文章完成后,我得到了 Manu Drijvers 的反饋:在一個(gè)可證明安全性的多簽名方案中,你需要 3 輪交互:
選擇一個(gè)隨機(jī)數(shù) ki 以及相應(yīng)的隨機(jī)點(diǎn) Ri = ki * G,然后告訴每一個(gè)設(shè)備 Ri 的哈希值 ti=hash(Ri),然后每個(gè)設(shè)備都能確保你沒(méi)有在知道其他人的隨機(jī)數(shù)之后改變主意收集所有的數(shù)字 Ri 并計(jì)算公共的 R簽名
第二個(gè)問(wèn)題是已知的 Rogue 密鑰攻擊。這篇論文講解得非常好,所以我就不贅述了。大概意思是如果你的其中一個(gè)設(shè)備被黑(比如你的熱錢包被劫持),并假裝自己的公鑰是 $(P1 - P2)$,那就可以僅憑私鑰 pk1 便控制兩個(gè)私鑰共享的資金。一個(gè)簡(jiǎn)單的解決方案是,在設(shè)置設(shè)備時(shí),要求使用私鑰給相應(yīng)的公鑰簽名。
還有第三個(gè)重大問(wèn)題。你沒(méi)法使用確定性的 k 來(lái)簽名。如果你使用了確定性的 k,則只需一種簡(jiǎn)單的攻擊,黑客即可獲得你的私鑰。攻擊如下:某個(gè)黑客黑入你的筆記本電腦,完全控制了其中一把私鑰(比如 pk1)。我們感覺(jué)資金仍是安全的,因?yàn)槭褂梦覀兊谋忍貛判枰?pk1 和 pk2 的聚合簽名。所以我們像往常一樣發(fā)起交易,準(zhǔn)備好一筆待簽名的交易和 R1,發(fā)送給我們的硬件錢包,硬件錢包簽名后將 (R2, s2)發(fā)回給熱錢包 …… 然后,熱錢包出錯(cuò)了,沒(méi)法完成簽名和廣播。于是我們?cè)僭囈淮?,但這一次被黑的電腦用了另一個(gè)隨機(jī)數(shù) —— R1' 。我們?cè)谟布X包里簽名了同一筆交易,又將 (R2, s2')發(fā)回給了被黑的電腦。這一次,沒(méi)有下文了 —— 我們所有的比特幣都不翼而飛了。
在這次攻擊中,黑客獲得了同一筆交易的兩個(gè)有效的簽名:(R1, s1, R2, s2) 和 (R1', s1',R2,s2')。這個(gè) R2 是一樣的,但是 $ R = R1 + R2 $ 和 $ R' = R1' + R2 $ 是不同的。這就意味著黑客可以計(jì)算出我們的第二個(gè)私鑰:$s2-s2'=(hash(P,R1+R2,m)-hash(P,R1'+R2,m))⋅pk2$ 或者說(shuō) $pk2=(s2-s2')/(hash(P,R1+R2,m)-hash(P,R1'+R2,m))$。我發(fā)現(xiàn)這就是密鑰聚合最不方便的地方 —— 我們每次都要使用一個(gè)好的隨機(jī)數(shù)生成器,這樣才能安全地聚合。
3. Musig
MuSig 解決了其中一個(gè)問(wèn)題 —— rogue key 攻擊將不能再奏效。這里的目標(biāo)是把 多方/多個(gè)設(shè)置的簽名和公鑰聚合在一起,但又無(wú)需你證明自己具有與這些公鑰相對(duì)應(yīng)的私鑰。
聚合簽名對(duì)應(yīng)著聚合公鑰。但在 MuSig 中,我們不是把所有聯(lián)合簽名者的公鑰直接相加,而是都乘以一些參數(shù),使得聚合公鑰 $ P = hash(L,P1)×P1 + … + hash(L,Pn)×Pn$ 。在這里,$ L = hash(P1,…,Pn) $ —— 這個(gè)公共數(shù)基于所有的公鑰。L 的非線性特性阻止了攻擊者構(gòu)造特殊的公鑰來(lái)發(fā)動(dòng)攻擊。即使攻擊者知道他的 $ hash(L,Patk)×Patk $ 應(yīng)該是什么,他也無(wú)法從中推導(dǎo)出 Patk 來(lái) —— 這就跟你想從公鑰中推導(dǎo)出私鑰是一樣的。
簽名構(gòu)造的其它過(guò)程跟上面介紹的很像。在生成簽名時(shí),每個(gè)聯(lián)合簽名者都選擇一個(gè)隨機(jī)數(shù) ki 并與他人分享 $Ri = ki * G$。然后他們把所有的隨機(jī)點(diǎn)加起來(lái)獲得 $ R=R1+…+Rn$ ,然后生成簽名 $si = ki + hash(P,R,m) ⋅ hash(L,Pi) ⋅ pki$ 。因此,聚合簽名是 $(R, s)=(R1+…+Rn, s1+…+sn)$ ,而驗(yàn)證簽名的方法與以前一樣:$ s×G = R + hash(P,R,m)×P$ 。
4. 默克爾樹(shù)多簽名
你可能也注意到了,MuSig 和密鑰聚合需要 所有簽名者簽名一個(gè)交易。但如果你想做的是 2-3 的多簽名腳本呢?這時(shí)候我們能夠使用簽名聚合嗎,還是不得不使用通常的 OP_CHECKMULTISIG 和分別簽名?(譯者注:OP_CHECKMULTISIG 是比特幣驗(yàn)證橢圓曲線多簽名腳本的操作碼)
先說(shuō)答案,是可以的,但是協(xié)議上將有些許的不同。我們可以開(kāi)發(fā)一個(gè)類似于 OP_CHECKMULTISIG 的操作碼,只不過(guò)是檢查聚合簽名是否對(duì)應(yīng)于公鑰默克爾樹(shù)上的一個(gè)元素。
舉個(gè)例子,如果我們想用公鑰 P1、P2 和 P3 組成一個(gè) 2-3 的多簽名腳本,我們需要用這幾把公鑰的所有兩兩組合 (P1, P2)、(P2, P3)、(P1, P3) 來(lái)構(gòu)建一棵默克爾樹(shù),并把默克爾樹(shù)根公布在鎖定腳本中。
在花費(fèi)比特幣時(shí),我們需要提交一個(gè)簽名和一個(gè)證據(jù),證明這個(gè)簽名所對(duì)應(yīng)的公鑰位于由這個(gè)樹(shù)根標(biāo)記的默克爾樹(shù)上。對(duì)于 2-3 多簽名合約來(lái)說(shuō),樹(shù)上只有 3 個(gè)元素,證據(jù)只需 2 條哈希值 —— 那個(gè)我們想用的公鑰組合的哈希值,還有一個(gè)鄰居的。對(duì)于 7-11 多簽名腳本來(lái)說(shuō),公鑰組合有 11!/7!/4!=330 種,證據(jù)需要 8 條哈希值。通常來(lái)說(shuō),證據(jù)所包含的元素?cái)?shù)量與多簽名的密鑰數(shù)量大體成正比 ,為 $log2(n!/m!/(n-m))$ 。
但有了默克爾公鑰樹(shù),我們就不必局限于 m-n 多簽名腳本了。我們可以做一棵使用任意公鑰組合的樹(shù)。舉個(gè)例子,如果我們有一個(gè)筆記本電腦,一個(gè)手機(jī),一個(gè)硬件錢包和一個(gè)助記詞,我們可以構(gòu)建一棵默克爾樹(shù),允許我們使用 筆記本電腦 + 硬件錢包、手機(jī) + 硬件錢包 或者單獨(dú)的助記詞來(lái)使用比特幣。這是當(dāng)前的 OP_CHECKMULTISIG 做不到的 —— 除非你使用 “IF - Else” 式的流程控制來(lái)構(gòu)造更復(fù)雜的腳本。
- 聚合公鑰的默克爾樹(shù)。不僅僅是多簽名 -
結(jié)論
Schnorr 簽名很棒,它解決了區(qū)塊驗(yàn)證中的一些計(jì)算開(kāi)銷問(wèn)題,也給了我們密鑰聚合的能力。后者在使用時(shí)有些不便利,但我們不是在強(qiáng)迫大家使用它 —— 無(wú)論如何,我們都可以仍舊使用普通的多簽名方案,使用單獨(dú)的、不聚合的簽名。
我迫不及待想使用 Schnorr 簽名,希望比特幣協(xié)議能盡快納入這種簽名方案。
另外,我也真心喜歡 MuSig,它是個(gè)優(yōu)雅的方案,論文也淺顯易懂。我強(qiáng)烈建議各位有閑之時(shí)通讀全文。
以上就是區(qū)塊鏈知識(shí):Schnorr 簽名如何提升比特幣的詳細(xì)內(nèi)容,更多關(guān)于Schnorr 簽名如何提升比特幣的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
數(shù)字貨幣及比特幣永續(xù)合約可以隨時(shí)平倉(cāng)嗎
這篇文章主要介紹了數(shù)字貨幣及比特幣永續(xù)合約可以隨時(shí)平倉(cāng)嗎的相關(guān)資料,需要的朋友可以參考下,因此投資者已經(jīng)不再局限于現(xiàn)貨交易,開(kāi)始逐步走入數(shù)字貨幣衍生品交易,而其…
2021-12-13 -
比特幣怎么交易提現(xiàn)?比特幣交易提現(xiàn)教程
這篇文章主要介紹了比特幣怎么交易提現(xiàn)?比特幣交易提現(xiàn)教程的相關(guān)資料,需要的朋友可以參考下,這恰恰就證明比特幣投資確實(shí)是一塊值得啃食的肥肉,因而小編W有理由相信有不…
2021-12-10 -
火幣網(wǎng)賣幣后怎么提現(xiàn)人民幣 圖文教程
這篇文章主要介紹了火幣網(wǎng)賣幣后怎么提現(xiàn)人民幣?的相關(guān)資料,需要的朋友可以參考下,這些數(shù)據(jù)正是投資者在購(gòu)買數(shù)字貨幣之前需要了解的,目前大多數(shù)的投資者喜歡使用火幣網(wǎng)…
2021-12-10 -
比特幣如何提現(xiàn)人民幣?比特幣提現(xiàn)教程
這篇文章主要介紹了比特幣如何提現(xiàn)人民幣?比特幣提現(xiàn)教程的相關(guān)資料,需要的朋友可以參考下,那么,比特幣如何提現(xiàn)人民幣呢?針對(duì)這個(gè)問(wèn)題,小編W給大家整理比特幣提現(xiàn)教程…
2021-12-10 -
BTC(Bitcoin)比特幣錢包基本概念介紹
這篇文章主要介紹了BTC(Bitcoin)比特幣錢包基本概念介紹的相關(guān)資料,希望小編的這篇關(guān)于BTC(Bitcoin)比特幣錢包基本概念介紹的文章,能夠幫助各位投資者對(duì)比特幣錢包有一個(gè)…
2021-12-09 -
比特幣做空是什么意思?比特幣合約怎么交易?
這篇文章主要介紹了比特幣做空是什么意思?比特幣合約怎么交易?的相關(guān)資料,需要的朋友可以參考下,對(duì)于一般散戶投資者而言,要想交易比特幣,一般都是通過(guò)數(shù)字貨幣交易平…
2021-12-09 -
比特幣合約平臺(tái)有哪些?最好的比特幣合約平臺(tái)是哪個(gè)
這篇文章主要介紹了比特幣合約平臺(tái)有哪些?最好的比特幣合約平臺(tái)是哪個(gè)的相關(guān)資料,需要的朋友可以參考下,嘗試過(guò)幾個(gè)期貨合約平臺(tái)后,做一個(gè)簡(jiǎn)單的測(cè)評(píng)BitMEX\OKEX\BITMS,…
2021-12-09 -
比特幣合約交易教程具體步驟是什么
這篇文章主要介紹了比特幣合約交易教程具體步驟是什么的相關(guān)資料,需要的朋友可以參考下,無(wú)論到了交易時(shí)間,數(shù)字貨幣是漲高了、還是跌價(jià)了,結(jié)果是獲利還是虧損,都必須按…
2021-12-09 -
比特幣合約玩法是什么?比特幣合約玩法規(guī)則
這篇文章主要介紹了比特幣合約玩法是什么?比特幣合約玩法規(guī)則的相關(guān)資料,需要的朋友可以參考下,比特幣合約是指無(wú)需實(shí)際擁有比特幣也可進(jìn)行交易的合約,比特幣合約投資的…
2021-12-08 -
比特幣當(dāng)周合約是什么意思?一文解讀比特幣當(dāng)周合約
這篇文章主要介紹了比特幣當(dāng)周合約是什么意思?一文解讀比特幣當(dāng)周合約的相關(guān)資料,需要的朋友可以參考下,期貨市場(chǎng)能夠這么火爆的原因也是因?yàn)楝F(xiàn)在整個(gè)數(shù)字貨幣市場(chǎng)的發(fā)展…
2021-12-08