原文標題:如何設計出一種精妙絕倫的證明遞歸方案

撰文:Fox Tech CTO 林彥熹,Fox Tech 首席科學家孟鉉濟

前言:在zkRollup以及zkEVM賽道所遇到的幾乎所有難題,其本質都是算法問題。 ZKP硬件加速之所以屢屢被提及,主要原因是當下算法普遍較慢。為了避免落入“算法不夠,硬件來湊”的尷尬境地,我們應該從本質算法上解決問題。設計出一種精妙絕倫的遞證明方案是解決這個問題的關鍵。

隨著智能合約的不斷發展,越來越多的web3應用逐步問世,以太坊等傳統Layer1交易量迅速攀升並隨時可能發生擁堵。如何在保證能獲取Layer1提供的安全性的同時獲得更高的效率成為了亟需解決的問題。

對於以太坊而言,zkRollup使用零知識證明算法作為底層構件,將原本需要在Layer1上執行的高昂的計算搬到鏈下,並向鏈上提供執行正確性的證明。該賽道主要有StarkWare、zkSync、Scroll以及Fox Tech等項目。

事實上,在zkRollup的設計中,對於效率有很著高的要求:希望提交的證明值足夠的小,這樣可以減輕Layer1的計算量。而為了獲取足夠小的證明長度,各個zkRollup項目都在改進算法以及架構設計,例如Fox就結合了最新的零知識證明算法開發了自己的證明算法FOAKS,來獲得最優的證明時間和證明長度。

此外,在驗證證明的階段,最平凡的手段是線性的生成證明並依次驗證。為了提高效率,大家首先想到的是多個證明打包成一個證明,這也就是通常提到的證明聚合(Proof Aggregation)。

直觀來講,對於zkEVM生成的證明進行驗證是一個線性的過程,驗證者(Verifier)需要依次驗證每一個生成的證明值。但是這種驗證方式的效率比較低,通訊開銷也比較大,對於zkRollup的場景,更高的驗證者端的開銷就意味著更多的Layer1層的計算,也就會導致更高的Gas fee。

我們先看一個例子:Alice想要向全世界證明自己在本月的1號至7號都去了Fox公園。為此,她可以分別在1號至7號的每一天都拿著當天的報紙在公園拍一張照片,這7張照片打包就成為一個證明。

回歸算法本質,如何設計一種更好的證明遞歸方案?

圖1:一般意義的證明聚合方案

上面例子裡把7張照片直接放入一個信封就是直觀意義上的證明聚合,這在實際情況中對應的是將不同證明連接在一起並依次線性驗證,即先驗證第一個證明,再驗證第二個證明以及隨後的證明。問題是這種做法既不會改變證明的大小,也不會改變證明的時間,與一個一個去證明並驗證的效果一樣。如果要實現對數級別的空間壓縮,那就要使用下面提到的遞歸證明(Proof Recursion)。

Halo2以及STARK所用證明遞歸方案

為了更好的說明什麼是遞歸證明,我們回到上面的例子。

Alice的7張照片實際上是7個證明。現在考慮將它們合併起來,於是Alice可以在1號拍好照片,在2號拿著這張照片和2號的報紙拍照片,在3號再拿著2號拍的照片和3號的報紙拍照片。以此類推,Alice在7號拿著6號的照片和7號的報紙拍下最後一張照片,而其他小伙伴在看到7號的這最後一張照片,就可以驗證在1~7號Alice都去了公園。可以看到,之前的七張證明照片,被壓縮成了一張。而在這個過程中的一個關鍵技巧,即是“包含照片的照片”,相當於將之前的照片以遞歸的形式嵌套進了之後的照片當中。這跟把很多照片放一起再拍個照片是不同的。

zkRollup的遞歸證明技巧可以大幅壓縮證明大小。具體來講,每一筆交易都會生成一個證明,我們設原始的交易計算電路為C0,P0為C0的正確性證明,V0為驗證P0的計算過程,證明者(Prover)將V0也轉化為對應的電路,記作C0'。此時,對於另一筆交易的證明計算過程C1,就可以將C0'和C1的電路合併,這樣一來,一旦驗證了合併後的電路的正確性證明P1,就相當於同時驗證了以上兩筆交易的正確性,也就是實現了壓縮。

而回顧上述過程可以發現,其實壓縮的原理在於將驗證證明的過程又轉化為了電路,然後生成“對於證明的證明”,所以從這個角度來說,是一種可以不斷向下遞歸的操作,因此也被成為遞歸證明。

回歸算法本質,如何設計一種更好的證明遞歸方案?

圖2:Halo2與Stark所使用的遞歸證明方案

Halo2與STARK所採用的Proof Recursion方案能夠並行生成證明,並將多個證明進行合併,使得驗證一個證明值的同時可以驗證多個交易執行的正確性,那就能夠壓縮計算的開銷,從而極大的提高系統的效率。

然而,這樣的優化仍然停留在具體的零知識證明算法之上的層次,為了進一步提高效率,我們需要更底層的優化和創新,Fox設計的FOAKS算法通過將遞歸的思想應用在一個證明的內部做到了這點。

FOAKS所使用的證明遞歸方案

在Fox Tech是一個zkEVM-based的zkRollup項目。在它的證明系統中,同樣使用遞歸證明的技巧,但是內涵與上述遞歸方式有不同之處,主要的區別是Fox是在一個證明的內部使用了遞歸(Recursion)的思想。為了表達出Fox所使用的遞歸證明的那種不斷將要證明的問題約化,直到約化後的問題足夠簡單的核心思想,我們需要再舉一個例子。

在上面的例子,Alice通過拍照證明自己在某天去了Fox公園,於是Bob提出了不同的建議,他認為證明Alice去過公園的問題可以被約化為證明Alice的手機去過了這個公園,而證明這件事又可以被約化為證明Alice手機的定位在公園的範圍裡。因此,為了證明Alice去過這個公園,她只要在公園的時候用她的手機發送一個定位就行了。如此一來證明的大小就從原本的一張相片(一個很高維的數據)變為一個3維的數據(經緯度和時間),有效的節約了成本。這個例子並不完全恰當,因為也許有人會質疑Alice的手機到過Fox公園不代表Alice本人到過,但是在實際的情況中,這個約化過程是數學形式上嚴格的。

具體而言,Fox的遞歸證明的用法是在電路層面的遞歸。在進行零知識證明的時候,我們會將要證明的問題編寫成電路,接著通過電路計算出一些需要滿足的等式。而與其展示這些等式是滿足的,我們再次將這些等式編寫成電路,如此往復,直到最後要證明滿足的等式變得足夠簡單,我們便能輕鬆的直接證明了。

從這個過程當中我們可以看出,這麼做更貼近“遞歸”的含義。值得一提的是不是所有算法都可以使用這個遞歸技術,假設每一次遞歸會將復雜度為O(n)的證明變為一個O(f(n))的證明,而這個遞歸過程本身的計算複雜度是O(g(n)),則遞歸一次後總計算複雜度就變為O1(n)=O(f(n))+O(g(n)),兩次後就是O2(n )=O(f(f(n)))+O(g(n))+O(g(f(n))),三次後就是O3(n)=O(f(f(f(n) )))+O(g(n))+O(g(f(n)))+O(g(f(f(n)))),...,以此類推。因此,只有在f和g兩個對應算法特性的函數滿足對某個k有Ok(n)<O(n)時,這樣的遞歸技術才能有效發揮作用。在Fox當中便有效的使用了這個遞歸技術壓縮證明復雜度。

回歸算法本質,如何設計一種更好的證明遞歸方案?

圖3:ZK-FOAKS所使用的遞歸證明方案

結語

證明的複雜度一向是零知識證明應用中最重要的關鍵之一,證明復雜度這個性質隨待證明的事情越來越複雜會變得越來越重要,特別是在像zkEVM這樣的巨型ZK應用場景中,證明的複雜度會對產品的性能與用戶的體驗造成決定性的影響。而在眾多降低最終證明的複雜度的方法中,對核心算法的優化最為重要,Fox在最前沿算法的基礎上設計出了精妙絕倫的遞證明方案,並利用這項技術打造出最適合於zkEVM的ZK-FOAKS算法,有望成為zkRollup界的性能擔當。

參考文獻

  1. https://blog.csdn.net/weixin_44383880/article/details/126338813

  2. https://blog.csdn.net/freedomhero/article/details/126727033