隱私加密系列|詳解Bulletproofs與Mimblewimble兩者的關係

買賣虛擬貨幣

介紹BulletproofsBulletProofts是不同的零知識證明系統家族的一部分,例如零知識簡潔的非互動知識論證(zk-SNARK);簡潔透明的知識論證(STARK)以及布林電路的零知識證明和驗證(ZKBoo)。零知識證明的設計使得證明者能夠間接地驗證語句的真實性,而無需提供超出語句驗證範圍的任何資訊。

例如證明發現了一個數字,可以解決密碼難題,並且適合雜湊值,而不必揭示Nonce。Bulletproofs技術是通用算術Circuitsdef的非互動式零知識(NIZK)證明協議,具有非常短的證明(知識論點),並且不需要可信的設定。它們依靠離散對數(DL)假設,並且使用Fiat-Shamir Heuristicdef使其不互動。

Bulletproofs還實現了多方計算(MPC)協議,藉此,在計算Fiat-Shamir挑戰並將其傳送給驗證者之前,將具有秘密承諾值的多個證明者的分散式證明彙總到單個證明中,從而最大程度地減少了交流次數。秘密的承諾價值將保持不公開。Bulletproofs的本質是其內積演算法,最初由Groth提出,然後由Bootle等人進一步完善。

後者的發展為滿足給定內積關係的兩個獨立的(不相關)bindingdef向量Pedersen Commitmentsdef提供了證明(知識的論據)。Bulletproofs建立在這些技術之上,這些技術產生了高效的通訊,零知識證明,但是提供了一個進一步的替代品來代替內部產品論證,後者將總體通訊減少了三倍。

MimblewimbleMimblewimble是專為隱私交易設計的區塊鏈協議。本質上是,可以將Pedersen承諾0視為橢圓曲線數字簽名演算法(ECDSA)公鑰,並且對於有效的隱私交易,輸出,輸入和交易費用之間的差額必須為0。

因此隱私交易可以使用輸出和輸入的差作為公用金鑰來簽署交易。這可以大大簡化區塊鏈,在其中可以去掉所有花費的交易,並且新節點可以有效地驗證整個區塊鏈,而無需下載任何舊的和花費的交易。

區塊鏈僅由塊頭、剩餘的未使用事務輸出(UTXO)及其範圍證明和每個事務的不可執行事務核心組成。Mimblewimble還允許在提交到區塊鏈之前聚合事務。

Bulletproofs如何工作?隱私交易的基礎是用Pedersen Commitmentsdef代替輸入和輸出的金額。然後可以公開驗證交易餘額(提交的輸入之和大於提交的輸出之和並且所有輸出均為正),同時隱藏特定的提交金額。這使得它成為一個零知識交易。

交易金額必須編碼為integersmodq,它可能會溢位,但是要透過使用範圍證明來防止這樣做。這就是Bulletproofs的用武之地。Bulletproofs的本質是它能夠從內部產品計算包括範圍證明在內的證明的能力。證明者必須使證明者確信承諾C(x,r)= xH + rG包含一個使得x∈[0,2n-1]的數字。如果a =(a1,...,an)∈0,1n是包含x位的向量,則基本思想是將金額的所有位隱藏在單個向量Pedersen Commitment中。然後必須證明每個位元滿足ω(ω-1)= 0,即每個ω為0或1,並且它們的和為x。

作為隨後協議的一部分,驗證者將約束和質詢∈ℤ𝕡的隨機線性組合傳送給證明者。然後證明者能夠構造一個向量化的內積關係,其中包含a的元素,約束和挑戰∈ℤ𝕡以及適當的盲向量∈ℤnp。這些內積向量的大小為n,這將需要許多昂貴的冪運算。如圖1所示的Pedersen Commitment方案允許將向量切成兩半,並將兩個半部分壓縮在一起,每次計算一組新的Pedersen Commitment生成器。

重複應用相同的技巧(log2n次)會生成一個值。這適用於內積向量;證明者和驗證者將它們與對數輪數互動地減少為大小為2n + 2log2(n)+1的單個多冪。這樣與n個獨立的乘冪運算相比,可以更快地計算出該單乘冪運算。使用Fiat-Shamir Heuristic使所有這些成為非互動式的。

Bulletproofs只依賴於離散對數假設。實際上,這意味著Bulletproof可以與任何安全的橢圓曲線相容,從而使其用途極為廣泛。證明演算法很小,範圍證明只需要[2log2(n)+9]個元素,算術電路證明只需要[log2(n)+13]個元素,n表示乘法複雜度。此外對數證明大小使證明者可以將多個範圍證明彙總為一個簡短證明,也可以將來自不同方的多個範圍證明彙總為一個證明(請參見圖2)。

如果所有比特幣交易都是隱私的,那麼在使用當前/線性證明系統並假設使用52位位元表示從1聰到2100萬比特幣的任何值時,大約2200萬筆交易中的大約5000萬個UTXO將產生大約160GB的範圍證明資料。彙總的Bulletproof可以將資料儲存需求減少到17GB以下。

在Mimblewimble中,區塊鏈隨著UTXO集的大小而增長。使用Bulletproofs作為隱私交易中範圍證明的替代品,區塊鏈的大小隻會隨著具有未使用輸出的交易數量而增加。這比UTXO集的大小小得多。Monero於2018年10月18日實施了BulletProofts,在2018年8月30日至2018年11月28日期間,每次支付的區塊鏈平均資料大小減少了約73%,基於美元的平均費用減少了約94.5%(見圖3)。

Bulletproofs實際應用Bulletproofs設計用於範圍證明。但是它們也可以推廣到任意算術電路。實際上,這意味著Bulletproofs具有廣泛的用途,並且可以有效地用於多種型別的證明。本節列出了Bulletproofs的用例,但由於Bulletproofs用例的不斷髮展,此列表可能並不詳盡。

1.範圍證明(Range proofs)範圍證明是已加密或已提交的秘密值處於一定間隔內的證明。它可以防止任何接近大素數(例如2256)的數字,當加一個小數時,可能會引起環繞。證明x∈[0,252-1]。

2.默克爾證明(Merkle proofs)Merkle樹中的Hash preimages可用於使用bulletcools建立零知識Merkle證明,以建立包含在大量資料集中的有效證明。

3.償付能力證明(Proof of solvency)償付能力證明是Merkle證明的一種特殊應用;可以將代幣新增到巨型Merkle樹中。然後可以證明,某些輸出在Merkle樹中,並且這些輸出加起來等於加密貨幣交易所聲稱在不洩露任何私人資訊的情況下控制的金額。使用Provisions協議,以200萬名客戶進行的比特幣交易需要大約18GB才能以保密方式證明償付能力。使用Bulletproofs及其變體協議,此大小可以減小到大約62MB。

4.確定性隨機數的多重簽名(Multi-signatures with deterministic nonces)使用Bulletproofs,每個簽名者都可以證明其隨機數是確定性產生的。可以以確定性方式使用SHA256算術電路,以表明確定性生成了非隨機隨機數。如果一個簽名者要離開對話然後稍後重新加入,並且不與先前與之互動的其他方進行互動,則此方法仍然有效。

5.無指令碼指令碼(Scriptless scripts)無指令碼指令碼是利用Schnorr簽名的線性特性,使用一種稱為Sigma協議的舊形式的零知識證明來執行智慧合約的一種方法。這全部可以透過Bulletproofs來完成,Bulletproofs可以擴充套件為允許具有其他資產功能的資產,即加密衍生工具。

6.智慧合約和加密衍生品(Smart contracts and crypto derivatives)傳統上,在驗證保護隱私的智慧合約時,每個智慧合約都需要一個新的可信設定,但使用BulletProof,則不需要可信設定。然而驗證時間是線性的,它可能過於複雜,無法證明智慧合約中的每一步。仲裁委託模型被認為是一種有效的協議,透過使用與智慧合約相關聯的特定驗證電路,在離線階段驗證具有公共可驗證性的智慧合約。質詢者將證明輸入到驗證電路,並獲得關於證明有效性的二進位制響應。然後質詢者可以向智慧合約投訴,聲稱證明無效,然後將證明以及來自驗證電路中選定門的輸出傳送到智慧合約。使用互動式二進位制搜尋來識別證明無效的門。因此智慧合約必須僅在驗證過程中檢查單個門才能確定挑戰者或證明者是否正確。費用是回合數和通訊量的對數,而智慧合約僅進行一次計算。可以將Bulletproof計算為智慧合約中任意計算的簡短證明,從而建立保護隱私的智慧合約(請參見圖4)。

7.可驗證洗牌(Verifiable shuffles)Alice進行了一些計算,並想向Bob證明她做得正確,並且對此計算有一些隱私輸入。可以建立一個複雜的函式,如果所有秘密輸入都正確,則該函式求值為1,否則為0。在算術電路中對此類函式進行編碼,並可以使用Bulletproofs實施以證明交易有效。

當需要證明一個值列表[x1,...,xn]是第二個值列表[y1,...,yn]的排列時,稱為可驗證洗牌。它有許多應用,例如投票、無法追蹤的付款的盲簽名和償付能力證明。當前,最有效的洗牌大小為On‾√。BulletProof可以非常有效地用於證明大小為Olog(n)的可驗證洗牌,如圖5所示。另一個可能的用例是驗證兩個節點是否執行了相同的獨立指令列表[x1,x4,x3,x2]和[x1,x2,x3,x4](可能順序不同),才能到達下一個相同的位置。節點不需要與驗證者共享實際的指令,但是驗證者可以顯示它們在不瞭解指令的情況下執行了相同的集合。

8.批次驗證(Batch verifications)可以使用Bulletproofs派生協議之一完成批次驗證。這在驗證者需要一次驗證多個(單獨)範圍證明的應用中,例如接收交易塊的區塊鏈完整節點需要驗證所有交易以及範圍證明。然後將此批驗證實現為一個大的乘冪運算。

它用於減少昂貴的冪運算。與其他零知識證明系統的比較表1顯示了Sigma協議(即互動式公共代幣協議)與本報告中提到的不同的零知識證明系統之間的高層比較。每次測量的最理想結果以粗斜體顯示。)目標是建立一個非互動式的證明系統,證明規模短,具有線性證明者執行時可伸縮性,具有有效的(亞線性)驗證器執行時可伸縮性、沒有可信設定、實用且至少具有DL安全性。Bulletproofs的獨特之處在於它們不是互動式的,具有較短的證明大小,不需要受信任的設定,執行時間非常快並且易於實施。這些屬性使Bulletproofs非常適合用作加密貨幣的範圍證明。

有趣的Bulletproofs實施用例Bulletproofs發展目前仍在發展中,這一點可以從跟蹤不同的社羣發展專案中看出。不同的Bulletproofs實現也提供了不同級別的效率、安全性和功能性。本節介紹其中的一些方面。當前和過去的努力最初的Bulletproofs原型實現是由BenediktBünz用Java完成的,該Java位於GitHub:bbuenz/BulletProofLib為Mimblewimble實現提供加密支援的初始工作主要由位於GitHub上的C語言中的Pieter Wuille,Gregory Maxwell和Andrew Poelstra完成,位於GitHub:ElementsProject/secp256k1-zkp。這項工作以GitHub:apoelstra/secp256k1-mw分叉,主要貢獻者是Andrew Poelstra,Pieter Wuille和Gregory Maxwell,其中Mimblewimble原語和對許多Bulletproof協議的支援(例如零知識證明,範圍證明和算術電路)) 新增。

當前的努力還涉及MuSig支援。Grin專案(Rust中的一個開源Mimblewimble實現)隨後將GitHub:Fores分支到GitHub:ElementsProject/secp256k1-zkp,成為GitHub:mimblewimble/secp256k1-zkp,併為其新增了Rust包裝器作為mimblewimble/rust-secp256k1-zkp 用於其區塊鏈。

Beam專案(C ++中的另一個開源Mimblewimble實現)直接作為其加密子模組連結到GitHub:ElementsProject/secp256k1-zkp。有關Grin和Beam的Mimblewimble實現的更多資訊,請參閱Mimblewimble-Grin區塊鏈協議概述和Grin與BEAM的比較。

由Java的Sarang Noether作為前身,而C ++的moneromooo-monero作為最終實現,為Monero專案(C ++中的開源CryptoNote實現)完成了Bulletproofs範圍證明的獨立實現。它的實現支援單範圍和彙總範圍證明。Adjoint,Inc.也已經在GitHub的Haskell上完成了Bulletproofs的獨立開源實現:adjoint-io/bulletproofs。

它具有針對金融行業的多方工作流程的私有許可區塊鏈的開源實現。Chain/Interstellar已在GitHub上從頭開始在Rust中完成了Bulletproofs的另一個獨立的開源實現:dalek-cryptography/bulletproofs。它已使用英特爾®高階向量擴充套件2(AVX2)實現了並行的Edwards公式,以加速曲線運算。初始測試表明,與原始的基於libsecp256k1的Bulletproofs實施相比,速度提高了大約50%(速度的兩倍)。

安全考慮橢圓曲線密碼術(ECC)在現實世界中的實現很大程度上基於管理曲線選擇的官方標準,以嘗試使橢圓曲線離散對數問題(ECDLP)難以解決,即找到ECC使用者的 給定使用者的公共金鑰的秘密金鑰。由於ECC安全性問題,許多攻擊都破壞了真實的ECC而沒有解決ECDLP,在這種情況下,實現可能產生錯誤的結果,並且還會洩露機密資料。

一些實現方面的考慮因素也傾向於效率而非安全性。Grin,Beam和Adjoint將ECC曲線secp256k1用於其Bulletproofs實施,這使四個ECDLP安全性標準中的一項失敗,並且使四個ECC安全性標準中的三項失敗。

Monero和Chain/Interstellar在其Bulletproofs實施中使用ECC曲線Curve25519 ,該曲線透過了所有ECDLP和ECC安全性標準。Chain/Interstellar透過使用Ristretto進一步向前邁進了一步,Ristretto是一種使用不可惡意編碼構建素數階橢圓曲線組的技術,它允許現有的Curve25519庫僅使用一個薄抽象層來實現素數階組。這使得使用Ed25519簽名的系統可以透過零知識協議安全地擴充套件,而無需額外的密碼假設和最少的程式碼更改。

Monero專案還對其Bulletproofs的實施進行了安全稽覈,這導致了許多嚴重和關鍵的錯誤修復以及其他一些程式碼改進。錢包重建和交換承諾-GrinGrin實施了交換承諾作為交易輸出的一部分,以準備好迎接量子對手的時代併成為防禦機制。

它的原始實現由於複雜而被丟棄(完全刪除),在區塊鏈中佔用了大量空間並允許包含任意資料。Grin還採用了一種複雜的方案將交易金額嵌入Bulletproofs範圍證明中以進行錢包重建,這與原始的切換承諾雜湊實現相關聯。最新的實現在所有這些方面都進行了改進,並使用了一種更為簡單的方法來從防彈範圍證明中重新獲得交易金額。

初步實施最初的Grin實現在Bulletproof範圍證明中隱藏了兩件事:用於錢包重建的交易金額和可選的切換承諾雜湊值,以便稍後使交易完美地結合在一起,而不是目前完全隱藏的定義。從這個意義上說,完美意味著量子對手(具有無限計算能力的攻擊者)無法判斷承諾的數量,也無法產生虛假承諾。計算意味著,在實際的時間內執行的有效演算法無法揭示承諾量或產生偽造的承諾,除非可能性很小。

Bulletproofs範圍證明儲存在交易核心中,因此將在區塊鏈中保持永續性。在這個實現中,Grin事務輸出包含原始的(橢圓曲線)Pedersen Commitmentdef以及可選的交換提交雜湊。交換承諾雜湊以產生的致盲因子b、第三迴圈群隨機生成器J和錢包種子派生的隨機值r作為輸入。

事務輸出的格式如下:(vG+bH,HB2(bJ,r))其中HB2是BLAKE2雜湊函式,而HB2(bJ,r)是切換承諾雜湊。為了花費這樣的金額,所有者需要顯示b,r,以便驗證者可以透過確認HB2(bJ,r)與交易的轉換承諾雜湊部分中儲存的值匹配來檢查HB2(bJ,r)。Grin實現了BLAKE2雜湊函式,該函式在雜湊速度方面優於所有主流雜湊函式實現,其安全性與最新的安全雜湊演算法3(SHA-3)標準相似。

在發生量子對手的情況下,輸出的所有者可以選擇保持匿名而不宣告所有權或透露bJ和r,隨後可以將金額移至當時希望叉起的抗量子區塊鏈。在Bulletproof範圍證明協議中,使用安全隨機數生成器生成了兩個32位元組標量隨機數τ1,α(不知道它們是什麼)。

如果已知用於隨機數生成器的種子,則可以在需要時重新計算標量值τ1,α。透過使用邏輯XOR門將訊息嵌入到那些變數中,可以將六十四(64)位元組的訊息空間(超過674位元組的範圍證明)可用。該訊息空間用於錢包重建的交易金額。為了確保僅透過開啟(橢圓曲線)Pedersen Commitment vG + bH不能花費輸出的交易金額,將交換承諾雜湊值和嵌入式訊息編織到Bulletproof範圍證明計算中。初始部分是透過使用種子函式S的輸出為用於計算τ1,α的隨機數生成器播種來完成的,種子函式S的輸入使用隨機數η(可能等於原始盲目因子b)(橢圓曲線)作為輸入。Pedersen Commitmentdef P和交換承諾雜湊。

其中HS256是SHA256雜湊函式。然後使用原始的τ1,α和兩個匹配的對α̃,τ1〜計算Bulletproof範圍證明。組成64位元組嵌入式訊息的32位元組字mw1和mw2如下:

要檢索嵌入的訊息,只需將過程反轉即可。請注意,輸出的所有者需要記錄盲因子b,隨機數η(如果不等於盲因子b)以及錢包種子派生的隨機值r的記錄,以便能夠要求此類輸出。實施改進的方法後者的Grin實現使用Bulletproof範圍證明倒帶,以便錢包可以識別自己的交易輸出。這就不需要記住要記住種子函式S的錢包種子派生隨機值r,隨機數η以及在Bulletproof範圍證明計算中使用適應對α̃,τ1〜的要求。在此實現中,不必記住交換承諾的雜湊值作為事務輸出集的一部分,並且不必在事務期間傳遞。交換承諾看起來與原始的(橢圓曲線)Pedersen承諾vG + bH完全一樣,但是在這種情況下,將盲因子b調整為

b′為使用者產生的致盲因子。(橢圓曲線)Pedersen承諾變成

量子對手時代的交換承諾啟用後,使用者可以顯示(vG+b′H,b′J),驗證者可以檢查其計算是否正確,並將其當作elgamalcommissiondef(vG+bH,bJ)使用。GitHub摘錄以下討論摘錄描述了從Bulletproofs進行錢包重建的交易承諾和交易金額的初始和改進實施。Bulletproofs#273{yeastplume}“我認為我們無法使用此實現的唯一之處是能夠在範圍證明記憶體儲一定數量的量(用於錢包重建)。從之前與@apoelstra的對話中,我相信有可能儲存64個位元組的“訊息”(不遠於當前範圍證明)。”{apoelstra}“好吧,我可以輕鬆地為您獲得64個位元組(如果您知道用於產生隨機性的原始種子,則可以很容易地從tau_x和mu中提取它們到* tau_1和alpha中)。我認為有可能 在t中再加上32個位元組,但是由於t是一個很大的內積*,所以要花更多的精力。”Bulletproofs資訊隱藏#721“從#273突破,我們需要像在'Rangeproof Classic'中一樣將訊息傳遞到Bulletproofs中。這是絕對的要求,因為我們需要嵌入輸出的SwitchCommitHash(否則將不執行此操作) 並嵌入一個用於錢包重建的輸出量。我們應該能夠毫不費力地嵌入多達64個位元組的訊息,而另外32個則更加困難(請參閱原始問題)。64個暫時應該足夠了。”

結論,意見和建議

Bulletproofs並不是萬能的,透過比較當前所有不同的Bulletproof實現的功能,安全性和效能以及Bulletproofs不斷髮展的性質,可以明顯看出這一點。

Monero專案發起的關於Bulletproofs實施的安全審計以及由此產生的發現和糾正措施證明,Bulletproofs的每個實施都具有潛在的風險。這種風險是由於隱私交易的性質引起的;交易價值和代幣所有者不是公開的。

越來越多的開源Bulletproof實施方案應加強新的隱私區塊鏈協議(如Tari)的開發。

在Bulletproof範圍證明的純粹實現中,離散日誌攻擊者(例如,使用量子計算機的不良演員)將能夠利用Bulletproofs來使使用它們的貨幣悄無聲息地膨脹。Bulletproof是完全隱藏的(即隱私的),但僅在計算上具有約束力(即不具有量子抗性)。由於採用了資料壓縮,無條件的可靠性將丟失。

Bulletproofs不僅涉及範圍證明。所有不同的Bulletproof用例都有可能在新的隱私區塊鏈協議(例如Tari)中實現。在基礎層以及可能的第二層中。獎

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;