號稱(chēng)以太坊的VPN,Aztec Network 一直在努力使通用的零知識交易盡可能容易的進(jìn)行,而零知識密碼學(xué)的快速發(fā)展有助于這一過(guò)程的實(shí)現。在這篇文章中描述一種幫助我們達到這一目的的基本密碼學(xué)技術(shù)。
證明系統設計中需要權衡考慮的因素
在一個(gè)零知識證明系統中,當兩方相互接觸時(shí),一方需要能夠說(shuō)服另一方相信某些陳述是真的。這其中的一方,我們稱(chēng)之為證明者,而證明者希望說(shuō)服的另一方,就叫做驗證者,證明者和驗證者之間擁有某種特定的信息,同時(shí)他們要盡可能少的去分享這些信息。這一過(guò)程通??梢院?jiǎn)單的分解為兩個(gè)階段:證明生成和證明驗證。
在理想的情況下,這兩個(gè)階段應該都是高速和高計算效率的,但現實(shí)是人們往往不得不對這兩個(gè)階段進(jìn)行權衡。(在絕對的計算意義上,證明構建通常比驗證過(guò)程要更加昂貴,因此當我們談?wù)摾纭缚焖佟沟倪M(jìn)行構建時(shí),我們通常指的是相對于一些有意義的基準線(xiàn)更加快速,而不是相對于驗證過(guò)程更加快速)
在A(yíng)ztec 的零知識rollup 的設置中,實(shí)際上有三個(gè)不同的方面參與到了SNARK 證明的創(chuàng )建和驗證過(guò)程中,并且每個(gè)方面都有不同的計算能力和限制條件:
用戶(hù):用戶(hù)擁有隱私信息,如他們的余額和他們的交易歷史,他們希望在參與交易和與DeFi 協(xié)議的交互的過(guò)程中對這些信息進(jìn)行保密。他們會(huì )在網(wǎng)路瀏覽器中生成證明,這個(gè)過(guò)程通常是在手機等低功率設備上。rollup 提供者: rollup 提供者將用戶(hù)交易進(jìn)行分批壓縮,這個(gè)過(guò)程涉及證明生成以及證明驗證,至少在某種意義上是這樣的(見(jiàn)下文關(guān)于遞歸的更多內容)。他們一般可以使用商業(yè)級別的硬體設施。區塊鏈:以太坊虛擬機(EVM)是一個(gè)高度受限的計算環(huán)境,基于此的每個(gè)操作都有不同的成本,但通常很昂貴,并且必須由用戶(hù)來(lái)支付交易費用。以太坊虛擬機負責驗證一個(gè)證明(它封裝了許多其他證明)。
為了給Aztec 的用戶(hù)帶來(lái)能負擔得起的、真正的零知識交易,我們將不同的證明系統(特別是PlonK 的不同、美味的風(fēng)味)跨越遞歸(recursion)的邊界融合在一起。對于用戶(hù)來(lái)說(shuō),這意味著(zhù)他們在客戶(hù)端證明生成過(guò)程中減少了計算成本,以及通過(guò)將以太坊虛擬機的計算最小化來(lái)降低貨幣成本。
遞歸
遞歸基于的是以下強有力的觀(guān)察:零知識證明的驗證本身就是一個(gè)可以由零知識證明來(lái)證明的計算。換句話(huà)說(shuō),沒(méi)有什么可以阻止我們用一個(gè)證明p*來(lái)代替驗證一個(gè)SNARK 證明p的行為,即p已經(jīng)被正確驗證了。當然,通過(guò)這樣做,我們引入了p*,它本身必須被驗證。但這從一開(kāi)始就暗示了一個(gè)概念,即兩個(gè)不同的證明系統是如何被結合或「編寫(xiě)(compose)」的。
讓我們把一個(gè)證明系統看作是一對算法(P,V),它代表一個(gè)證明者(P)和一個(gè)驗證者(V)。假設我們有一個(gè)證明系統(P,V),它有廉價(jià)的證明構造,但其證明驗證過(guò)程卻非常昂貴,還有一個(gè)證明系統(P*, V*),它有構造非常昂貴,但是驗證過(guò)程是廉價(jià)的。那有沒(méi)有一種方法可以將它們組合起來(lái)并獲得兩者的好處呢?請大家考慮以下過(guò)程:
在證明系統P下構建一個(gè)證明。在證明系統P*下構建證明*,其中p*是證明在V下被正確驗證的證明。驗證*。
最終,這樣驗證的好處來(lái)自于這三個(gè)步驟中的每一步都可以由具有不同計算能力的各方來(lái)執行。通過(guò)這個(gè)想法延伸出的一個(gè)版本,正是使Aztec Connect 能夠向其用戶(hù)提供廉價(jià)隱私交易的原因。
而這里所說(shuō)的兩個(gè)證明系統就是PlonK 和TurboPlonK,前者有廉價(jià)的驗證,后者有高效的證明構造。我們在rollup 中使用這種組合技術(shù)的簡(jiǎn)化過(guò)程如下:
客戶(hù)端使用TurboPlonK 來(lái)構建一個(gè)證明-Client,這是一個(gè)帶有自定義門(mén)的PlonK 變式(下面會(huì )有更多介紹),它允許在受限的設備上更高效的生成證明。它們將-Client發(fā)送到rollup 提供者那里。
rollup 提供者隨后接收-Client,并構建一個(gè)標準(即非Turbo)PlonK 證明-Rollup,其中證明-Client已經(jīng)被正確驗證。從這個(gè)意義上來(lái)講,rollup 提供者一直受制于TurboPlonK 驗證和標準PlonK 證明構造的高成本。但是,rollup 提供者是強大的,它可以同時(shí)處理兩種證明系統,同時(shí)還可以賺錢(qián)并為用戶(hù)節省大量的資金。證明-Rollup最終被發(fā)送到以太坊上。
以太坊虛擬機通過(guò)部署到以太坊的智能合約StandardVerifier.sol ?來(lái)驗證-Rollup。注意:為了進(jìn)一步優(yōu)化壓縮過(guò)程,一個(gè)Aztec 的rollup 提供者實(shí)際上參與了三個(gè)遞歸步驟,兩個(gè)Turbo-to-Turbo(使用rollup ? 和根rollup ? 線(xiàn)路,以這里?解釋的方式進(jìn)行組裝)和一個(gè)Turbo-to-Standard(根驗證器?線(xiàn)路)。
自定義門(mén)(Custom Gates)
我們想通過(guò)一個(gè)假想的案例來(lái)說(shuō)明Turbo 和Standard PlonK 之間的權衡問(wèn)題。我們的目標是盡可能的將密碼學(xué)概念黑箱化,但我們要提醒讀者的是,下面的內容可能多少會(huì )有一點(diǎn)技術(shù)含量。
情景:你在一家名為JazzTec 的公司擔任協(xié)議設計師。你設計并實(shí)現了一個(gè)名為PlunK 的零知識證明系統,該系統允許用戶(hù)證明包括乘法和加法組合的語(yǔ)句,如a+b=c,(a+b)-c=d,abc=d,等等。你的小型證明系統只包含一種門(mén),它通過(guò)符號可以表述為:
這里的w代表「wire」,l = 左,r = 右,o = 輸出,q是一個(gè)「選擇器(collector)」,用于在乘法和加法之間進(jìn)行切換。JazzTec 的線(xiàn)路編寫(xiě)員做了一個(gè)應用程式,用戶(hù)(或驗證者)必須證明他們已經(jīng)找到了數位a、b、c和d,以便:
線(xiàn)路編寫(xiě)者為用戶(hù)提供了一個(gè)模板:
從原理上講,該線(xiàn)路看起來(lái)像是這樣的:
通過(guò)在模板中填入a、b、z、c和d這些數值:
用戶(hù)可以證明滿(mǎn)足要求數值的知識。(嗯,整個(gè)過(guò)程幾乎就是這樣的。我們忽略了一個(gè)事實(shí),即z的兩個(gè)實(shí)例之間是必須是有連接的。這與復制限制條件的概念有關(guān),這一點(diǎn)通常是非常重要的,但對于我們現在的觀(guān)點(diǎn)來(lái)可有可無(wú))。
在使用PlunK 一段時(shí)間后,JazzTec 決定增加一個(gè)新的功能,該功能要求用戶(hù)證明x?=y這樣的語(yǔ)句。(例如,最近開(kāi)發(fā)的專(zhuān)門(mén)為零知識證明系統設計的Poseidon Hash ?,它需要進(jìn)行五次冪的計算)。那么我們該如何使用PlunK 實(shí)現這種類(lèi)型的操作呢?我們的表達式可以分解為一系列的乘法和一個(gè)加法,即:
因此,為了處理這種操作而設計的線(xiàn)路部分可能看起來(lái)像是這樣的:
將這個(gè)新的組件添加到線(xiàn)路模板中后,其執行軌跡可以是這樣的:
現在我們來(lái)考慮另一種方法。如果我們不使用PlunK 的更簡(jiǎn)單的設置,而是將證明系統擴展為一個(gè)對x?=y 形式的語(yǔ)句提供本地支援的系統,那么情況會(huì )如何呢?這里的關(guān)鍵思想是,線(xiàn)路編寫(xiě)者向驗證者指示要證明的語(yǔ)句的形式,并且可以添加一個(gè)新的選擇器,為執行軌跡中的每一行引入額外的解釋。
我們將把這種新的、擴展的證明系統稱(chēng)為T(mén)angoPlunK。它包含一個(gè)新的自定義選擇器,其通用門(mén)(generic gate)的形式為:
我們看到,新的q-custom選擇器可以開(kāi)啟或關(guān)閉自定義功能;當q-custom為1 時(shí),我們就有了五次冪方程,而當q-custom為0 時(shí),我們就有了舊的標準PlunK 方程?,F在,x?=y所涉及的操作可以被封裝到一個(gè)單一的門(mén)中,它看起來(lái)像是這樣:
通過(guò)使用TangoPlunK,我們程式的執行軌跡就會(huì )變成了這樣:
總而言之,以前完成整個(gè)驗證過(guò)程需要6 個(gè)門(mén),而現在就只需要3 個(gè),所以我們通過(guò)改用TangoPlunK,將原有線(xiàn)路的復雜度減少了50%!
對TurboNerds 的一些補充
有經(jīng)驗的讀者可能已經(jīng)注意到了,為了處理五次冪類(lèi)型的操作而引入的自定義門(mén)也增加了要證明的恒等式的程度。一般來(lái)說(shuō),這意味著(zhù)驗證者的計算量將會(huì )增加,從而可能會(huì )抵消一些從減少線(xiàn)路大小中獲得的好處。在我們上面的例子中,這相當于將恒等式的數量增加了一倍(從PlunK 的3 到TangoPlunK 的6),但是整個(gè)線(xiàn)路的大小卻減少了一半(巧合的是,它從6 減少到了3)。如果在我們的程式中可由定制門(mén)表示的計算比例較小,那么我們就必須重新考慮其效用。在實(shí)踐中,這種權衡必須被考慮在內。
同樣重要的是,我們可以設想出一些有用的自定義門(mén),它們不會(huì )增加恒等式的數量,或者至少不會(huì )讓驗證者感受到這種影響。例如,在最初的TurboPlonK ?證明系統中就是如此,其中關(guān)鍵的創(chuàng )新是引入了自定義門(mén),它在計算Pedersen Hash 的情況下促進(jìn)了橢圓曲線(xiàn)標量乘法的有效進(jìn)行。
證明者和驗證者的成本
我們以PlunK 和TangoPlunK 為例,旨在強調在設計證明系統時(shí)如何對于計算過(guò)程進(jìn)行權衡,其依據是:(1)驗證器的復雜度從根本上與線(xiàn)路中的門(mén)數有關(guān);(2)驗證器的復雜度與線(xiàn)路的大小相對獨立,但它會(huì )隨著(zhù)被證明的要求或恒等式的復雜度而增加。
對于我們的樣本程式來(lái)說(shuō),TangoPlunK 的證明構造相對便宜,因為引入我們的定制門(mén)可以大大減少線(xiàn)路的大小。而在TangoPlunk 中,驗證則是相對昂貴的,因為驗證者不僅看不到線(xiàn)路大小減少的好處,他們還必需面對一個(gè)相對于PlunK 來(lái)說(shuō)更加復雜的恒等式驗證。
更具體地說(shuō),在像PlonK 這樣的證明系統中,驗證者和核查者的很大一部分計算成本是由于需要計算昂貴的橢圓曲線(xiàn)標量乘法而產(chǎn)生的。對于驗證者來(lái)說(shuō),這些操作來(lái)自于在構建證明時(shí)需要計算的多項式承諾(commitment)。需要進(jìn)行的標量乘法(scalar multiplication)的數量與被承諾的多項式的復雜性成正比,而這又與線(xiàn)路中門(mén)的數量成正比。(對于那些不熟悉多項式在SNARKs 中所扮演的重要作用的人來(lái)說(shuō),我們建議你們閱讀Vitalik Buterin 的這篇文章?)
另一方面,對于驗證者來(lái)說(shuō),在使用中從證明方收到的承諾重構原始聲明或恒等式時(shí),主要需要的是標量乘法。特別是在驗證過(guò)程中,恒等式中的額外選擇器會(huì )直接導致額外的標量乘法。例如,大家可以看一下標準PlonK 驗證算法的第9 步:
這個(gè)表達式中的q 是標準PlonK 的選擇器,而運算符「·」代表橢圓曲線(xiàn)標量乘法。
上面給大家提供的例子說(shuō)明了這種權衡:與標準PlunK 相比,TangoPlunK 允許門(mén)的數量減少50%,從而進(jìn)一步降低了驗證器的成本(至少在承諾方面是這樣),同時(shí)也增加了驗證器的復雜性(通過(guò)增加選擇器q-custom)。
當然,我們在這個(gè)例子中暗指的現實(shí)用例是標準PlonK 證明系統和TurboPlonK 之間的類(lèi)似權衡。這就是為什么在我們Aztec 的應用中,比如Aztec Connect,我們安排證明者使用TurboPlonK,而驗證者使用的是Standard PlonK。
進(jìn)一步的探索
在過(guò)去幾年的事件里,零知識密碼學(xué)已經(jīng)出現了爆炸性的發(fā)展。在A(yíng)ztec,我們正在從TurboPlonK 升級到我們所說(shuō)的UltraPlonK,它相當于是TurboPlonK + Plookup ?,這是我們設計的一個(gè)協(xié)議,用于使用查找表來(lái)進(jìn)一步加快證明的構建,但驗證者則需要付出額外的成本。在另一個(gè)極端情況下,我們設計了一個(gè)叫做Fflonk ? 的協(xié)議,它允許在驗證者支付額外的成本的前提下進(jìn)行極其有效的驗證。Fflonk 利用了這篇文章?的承諾方案(我們稱(chēng)之為SHPLONK),它有可能將我們的以太坊虛擬機執行成本降低35%。
結論
零知識證明是一個(gè)非??岬?、具有巨大技術(shù)潛力的前端概念。我們在這里所描述的技術(shù)是利用這種潛力來(lái)創(chuàng )造一個(gè)更好的網(wǎng)際網(wǎng)路的一小步。謝謝大家能加入我們的行列,并與我們一同前行。