原文作者:Fox Tech CEO 康水躍,Fox Tech 首席科學家孟鉉濟
前言:如果密碼學家沒有發現張量積(Tensor Product)和多項式取值之間的聯繫,那就很難出現多項式承諾協議Brakedown,也就不可能誕生基於Brakedown 的Orion、以及FOAKS 這類全新的快速算法。
在許多依賴多項式承諾的零知識證明系統當中,使用了不同的承諾協議。根據a16z 的Justin Thaler 在2022 年8 月文章“Measuring SNARK performance: Frontends, backends, and the future”的評估,Brakedown 雖然有較大的Proof Size,但是無疑是當下最快的多項式承諾協議。
FRI、KZG、Bulletproof 是更為常見的多項式承諾協議,但速度是它們的瓶頸。 zkSync 採用的Plonky、Polygon zkEVM 採用的Plonky 2、Scroll 採用的Ultra-Plonk 等算法都是基於KZG 的多項式承諾。 Prover 涉及到大量的FFT 計算和MSM 運算生成多項式和承諾,這兩者都會帶來大量的計算負擔。雖然MSM 有運行多線程加速的潛力,但需要大量內存,即使在高並行下也很慢,而大型FFT 則嚴重依賴算法運行時數據的頻繁洗牌,難以通過分佈式加速跨計算集群加載。
正是由於有了更為快速的多項式承諾協議Brakedown,才使這類運算的複雜度大幅降低。
FOAKS 即Fast Objective Argument of Knowledges,是由Fox Tech 提出的一種基於Brakedown 的零知識證明系統框架。 FOAKS 在Orion 的基礎上進一步減少FFT 運算,目標是最終消除FFT。此外,FOAKS 還設計出一種全新的非常精妙的證明遞歸方式來減少證明大小。 FOAKS 框架的優勢在於在實現線性證明時間的基礎上有著較小的證明大小,非常適合應用於zkRollup 場景當中。
下文我們將詳細介紹FOAKS 所使用的多項式承諾協議Brakedown。
在密碼學當中,承諾(Commitment)協議由證明者(Prover)對某一個秘密值進行承諾,生成一個公開的承諾值,這個承諾值具有綁定性(Binding)和隱藏性(Hiding),之後提交者需要打開此承諾並將消息發送到驗證者,以驗證承諾與消息之間的對應關係。這一點,使得承諾協議和哈希函數的作用有許多共通之處,但是承諾協議往往依賴於公鑰密碼學領域的數學結構。而多項式承諾(Polynomial Commitment)是一類對於多項式的承諾方案,也就是說被承諾值是多項式。而同時多項式承諾協議當中還包含了在給定的點取值並給出證明的算法,這就使得多項式承諾協議本身成為一類重要的密碼學協議,是許多零知識證明系統的核心部分。
而在最新的密碼學領域的研究當中,由於發現了張量積(Tensor Product)和多項式取值之間的聯繫,所以誕生了一系列與此相關的多項式承諾協議,Brakedown 是其中的代表性協議。
在詳細介紹Brakedown 的協議細節之前,需要先了解一些基礎知識。我們需要先了解線性碼(Linear Code)、抗碰撞哈希函數(Hash Function)、默克爾樹(Merkle Tree)、張量積(Tensor Product)的運算以及多項式取值的張量積表示。
首先是線性碼(Linear Code)。一個消息長度為k,碼字長度為n 的線性碼是一個線性子空間
C∈Fn,使得存在一個從消息到碼字的單射,稱為編碼,記作EC:Fk→C。任意的對於碼字的線性組合仍然是一個碼字。兩個碼字u,v 的距離即他們的漢明距離,記作△(u, v)。
最短距離為d=minu, v△(u, v)。這樣的碼記作[n, k, d]線性碼,用d /n 表示碼的相對距離。
其次是抗碰撞哈希函數(Hash Function)與默克爾樹(Merkle Tree)。
使用H:{ 0, 1 }2 λ→{ 0, 1 }λ表示一個哈希函數。默克爾樹是一種特殊的數據結構,可以實現對於2 d個消息的承諾,生成一個哈希值h,在打開任何消息時候需要d+ 1 個哈希值。
圖片描述
圖片描述
- h←Merkle.Commit(m1 ,..., ml) 
- (mi,πi)←Merkle.Open(m, i) 
- { 0, 1 }←Merkle.Verify(πi, mi, h) 

圖片描述
圖片描述

圖2 :向量和矩陣的張量積運算
緊接著,我們需要知道多項式取值的張量積表示。
[GLS+]當中提到,多項式的取值可以被表示成張量積的形式。在這裡我們考慮多線性多項式的承諾。
具體來講,給定一個多項式,他在向量x0 , x1 ,..., xlogN-1 的取值可以寫成:

根據多線性的定義,每一個變量的次數是0 或1 ,因此,這裡有N 個單項式和係數,以及logN 個變量。令

,其中i0 i1 ...ilogN-1 是i 的二進製表示。令w 表示多項式係數,

令

令

。於是有X=r0 ⊗r1 。
從而,多項式取值可以被表示成張量積的形式:ϕ(x0 , x1 ,..., xlogN-1 )=
最後,我們來看FOAKS、Orion[XZS 22 ]當中使用的Brakedown 的過程。
首先,PC.Commit 將多項式係數w 劃分成k×k 的矩陣形式,並將其編碼(參考“預備知識”中的線性碼),記作C2 。之後對於C2 的每一列C2 [:, i]進行承諾建立一個默克爾樹,然後再對於每一個列形成的默克爾樹樹根建立另一個默克爾樹,作為最終的承諾。
在取值證明的計算中,需要證明兩點,一是近似性(Proximity),二是一致性(Consistency)。近似性保證了承諾的矩陣確實和編碼後的一個碼字足夠接近。一致性保證y=
近似性檢驗:近似性檢驗由兩步組成。首先,驗證者發送一個隨機向量0 給證明者,證明者計算Y0 與C1 的內積,也就是以Y0 的分量為係數對C1 的行計算線性組合。由於線性碼的性質,Cy 0 是Yy 0 的碼字。之後,證明者證明Cy 0 確實是從被承諾的碼字計算出的。為了證明這一點,驗證者隨機選取t 列,證明者打開對應的列並提供默克爾樹證明。驗證者檢查這些列和Y0 的內積和Cy 0 當中對應位置相等。 [BCG 20 ]當中證明如果使用的線性碼有常數的相對距離,那麼被承諾的矩陣就以壓倒性的概率與一個碼字接近(壓倒性的概率是指,命題的否命題成立的概率是可忽略的)。
一致性檢驗:一致性檢驗和近似性檢驗的流程完全類似。不同之處在於,不使用隨機向量Y0 而是直接使用r0 來完成線性組合的部分。類似的,c1 也是消息y1 的一個線性碼,並且有
ϕ(x)=
參考文獻
Public input:The evaluation point X,parsed as a tensor product X=r0 ⊗r1 ;
Private input:The polynomial ϕ ,the coefficient of is denoted by w.
Let C be the [n, k, d]-limear code,EC:FkFn be the encoding function,N=k×k. If N is not a perfect square,we can pad it to the next perfect square. We use a python style notationmat[:, i] to select the i-th column of a matrix mat。
- function PC. Commit(ϕ): 
- Parse w as a k×k matrix. The prover locally computes the tensor code encoding C1 ,C2 ,C1 is a k×n matrix,C2 is a n×n matrix. 
- for i∈ [n] do 
- Compute the Merkle tree root Roott=Merkle.Commit(C2 [:, i]) 
- Compute a Merkle tree root R=Merkle.Commit([Root0 ,......Rootn-1 ]), and output R as the commitment. 
- function PC. Prover(ϕ, X, R) 
- The prover receives a random vector Y0 ∈Fk from the verifier 
- Proximity  
- Consistency  
- Prover sends C1 , y1 , C0 , y0 to the verifier. 
- Verifier randomly samples t[n] as an array Î and send it to prover 
- for idx∈Î do 
- Prover sends C1 [:, idx] and the Merkle tree proof of Rootidx for C2 [:, idx] under R to verifier 
- function PC. VERIFY_EVAL(πX, X, y=ϕ(X), R) 
- Proximity: ∀idx∈Î, CY 0 [idx]== - and EC(Yy 0 )==CY 0 
- Consistency:∀idx∈Î, C1 [idx]== - and EC(Y1 )==C1 
- y== 
- ∀idx∈Î, EC(C1 [:, idx]) is consistent with ROOTidx, and ROOTidx’s Merkle tree proof is valid. 
- Output accept if all conditions above holds. Otherwise output reject. 
參考文獻
參考文獻
- [GLS+]:Alexander Golovnev, Jonathan Lee, Srinath Setty, Justin Thaler, and Riad S. Wahby. Brakedown: Linear-time and post-quantum snarks for r 1 cs. Cryptology ePrint Archive. https://ia.cr/2021/1043. 
- [XZS 22 ]:Xie T, Zhang Y, Song D. Orion: Zero knowledge proof with linear prover time[C]//Advances in Cryptology–CRYPTO 2022: 42 nd Annual International Cryptology Conference, CRYPTO 2022, Santa Barbara, CA, USA, August 15 – 18, 2022, Proceedings, Part IV. Cham: Springer Nature Switzerland, 2022: 299-328.https://eprint.iacr.org/2022/1010 
- [BCG 20 ]:Bootle, Jonathan, Alessandro Chiesa, and Jens Groth. "Linear-time arguments with sublinear verification from tensor codes." Theory of Cryptography: 18 th International Conference, TCC 2020, Durham, NC, USA, November 16 – 19, 2020, Proceedings, Part II 18. Springer International Publishing, 2020. 
- Justin Thaler from A16z crypto, Measuring SNARK performance: Frontends, backends, and the future https://a16z crypto.com/measuring-snark-performance-frontends-backends-and-the-future/ 
- 張量積的介紹:https://blog.csdn.net/chenxy_bwave/article/details/127288938 


