零知識證明技術的革命性進展:深入探討Nova算法

前段時間在翻譯一本零知識證明技術的書。上個月底基本內容已經翻譯完成。翻譯時間比我預想的長得多。目前正在和作者討論書中的一些筆誤,準備最後的定稿。

anyway,終於有點時間看看新鮮東西。先從Nova算法開始~

Nova算法相關資料

三份資料可以幫助理解Nova算法:

  1. Nova論文:https://eprint.iacr.org/2021/370.pdf

  1. Nova潛在攻擊和相應修正:https://eprint.iacr.org/2023/969.pdf

  2. Nova潛在攻擊的理解總結:https://www.zksecurity.xyz/blog/posts/nova-attack/

本文是上述資料的理解和總結。本文中的一些圖來自於上述資料,在本文中不再一一標註。

從IVC開始

Nova算法是一種針對IVC(增量可驗證計算,Incrementally Verifiable Computation)的新型的零知識證明算法。 IVC,即同一個函數把前一個輸出作為下一個輸入迭代計算。 F函數的迭代計算過程如下圖:

z0是最初的輸入,通過F函數計算生成的結果,作為下一個F函數的輸入。

鬆弛R1CS以及鬆弛承諾R1CS

眾所周知,R1CS是零知識證明技術中電路約束表示形式。鬆弛R1CS(Relaxed R1CS)可以看成是R1CS的擴展形式。在R1CS的基礎上,增加一個標量u以及一個錯誤向量E。鬆弛R1CS的實例用(E, u, x)表示。

鬆弛承諾R1CS在鬆弛R1CS的基礎上,將E以及W向量承諾。鬆弛承諾R1CS的實例用(\bar{E}, u, \bar{W}, x)表示,其中x和u是公開變量。

從R1CS擴展到鬆弛R1CS,是為了折疊方案。注意的是,從鬆弛R1CS的角度看,R1CS是其的一種特例。也就是說,R1CS也是一種“特別“的鬆弛R1CS。

折疊方案(Folding Scheme)

直覺上來說,一個關係R的折疊方案就是將兩個符合關係R的實例“折疊成”一個新的複合關係R的實例。鬆弛R1CS/鬆弛承諾R1CS就能進行類似的折疊。兩者的折疊過程類似。鬆弛承諾R1CS的折疊方案如下:

整個折疊方案由4步組成。第一步,證明者P發送一個交叉項T的承諾\bar{T}給驗證者。第二步,驗證者發送隨機挑戰r給證明者。第三步是證明者和驗證者都需要執行的,承諾的折疊。第四步,證明者獨自執行,將兩個實例的E和W向量進行折疊。

增廣函數F’ (Argumented Function)

折疊方案,折疊的是鬆弛R1CS實例。那這些鬆弛R1CS實例證明的計算是什麼?顯然,這些計算要包括折疊的計算。這些計算不僅僅是IVC計算中的F函數了,也就被稱為增廣函數F’。增廣函數F’的計算主要由兩部分組成:

1/ IVC中的F函數

2/ R1CS實例的折疊計算

理想中的樣子

有了上述的這些理解,可以想像出折疊的過程:

其中,circuit就是增廣函數F’對應的電路。 acc{1,2,3,4,5,6}是鬆弛承諾R1CS實例。 circuit有兩個計算:1/鬆弛承諾R1CS實例的折疊,比如acc1+acc2->acc3。2/計算F函數,將狀態state1變為state2,再從state2變為state3等等。

注意的是,增廣函數F’對應的circuit,本身也是一個R1CS實例,其可以表示成鬆弛R1CS實例。也就是圖中的acc4和acc6。 “summarize”是將鬆弛R1CS實例轉換為鬆弛承諾R1CS實例。

仔細觀察第二個電路的輸入,acc3是折疊後的鬆弛承諾R1CS實例,acc4是證明acc3是正確折疊結果的鬆弛承諾R1CS實例。這兩個實例會進入下一次的折疊,生成acc5。你可以試想一下,如果acc3以及acc4是可滿足的鬆弛承諾R1CS實例,意味著,acc3是由兩個可滿足的鬆弛承諾R1CS實例折疊而來,也就是說,acc1以及acc2是可滿足的鬆弛承諾R1CS實例。這樣的可靠性也就可以一步步“向”前推導,從而也證明了每一次circuit中的F函數計算是正確的。總的來說,就是通過某一個circuit對應的兩個鬆弛承諾R1CS實例的可滿足性,可以證明之前所有的IVC計算是正確的。

真實的樣子

熟悉零知識證明的朋友,都知道多項式承諾方案中經常採用橢圓曲線。 scalar域上對應的多項式的承諾是用橢圓曲線的base域表示。 R1CS電路通常是採用scalar域來表示。仔細看,上圖中的“summarize”的前後涉及到域的轉換。也就是,要將circuit對應的鬆弛承諾R1CS實例進行折疊的話,必須在另外一個電路中去“折疊”。這時,需要引入橢圓曲線循環,兩個或者多個橢圓曲線,其中一個曲線的scalar域,和另外一個曲線的base域相同,巧的是,該曲線的scalar域和之前曲線的base域相同。採用這樣的橢圓曲線循環,可以將“理想中的樣子”實現:

整個折疊過程,拆分成兩個電路進行折疊。上部分可以稱為Circuit 1的折疊,下部分可以稱為Circuit 2的折疊。兩個電路的關係的形式化表示在論文“Nova潛在攻擊和相應修正”的第8頁。 U表示的是折疊後的實例,u表示的是一個R1CS實例對應的鬆弛實例。注意的是,Circuit 1折疊的是Circuit 2對應的鬆弛承諾R1CS實例,而Circuit 2折疊的才是Circuit 1對應的鬆弛承諾R1CS實例。 Circuit 2的主要目的就是折疊Circuit1對應的鬆弛承諾R1CS實例,其電路中的函數計算沒有意義。相反,F函數實現在Circuit 1中。結合“理想中的樣子”,大致可以猜到U{i+2}^2, u{i+2}^1, u{i+2}^2, U{i+2}^1可滿足性是證明的重要部分。

因為“電路”切割成兩部分,並且各自的電路在另外的電路中進行折疊。存在幾個實例之間的綁定問題:u和U實例之間的綁定以及u實例在兩個電路之間傳遞的綁定。為了解決這些綁定問題,在電路中引入了x_0/x_1公開變量,其中x_1指定了和u實例綁定的電路輸出U實例和當前的F函數的輸出(為了簡化電路結構,在圖中未體現)。你想,在電路中引入了U實例的H_1結果的話,如果u實例是可滿足的,x_0/x_1既是真實可靠的,即和U進行了“綁定”。 x_0建立的是輸入的u和U的綁定關係,x_1建立的是輸出的u和U的綁定關係。

舉個例子,u{i+1}^1作為下半部分電路的輸入時,經過Circuit 2,其輸出u{i+1}^2.x0 = u{i+1}^1.x1,這樣,再輸入到上半部分電路時,如果u{i+1}^2可滿足的話,則其的x_0應該等於U_{i+1}^2的H1的結果。這在Circuit 1電路中會進行檢查。這樣,就保證了正確的實例,在兩個電路之間傳遞。

IVC的證明

為了證明IVC在某個迭代正確計算,邏輯上需要證明如下信息:

除了證明四個實例可滿足外,還需要證明兩個x1的綁定關係,示意如下圖:

這些信息是否正確,需要額外的證明電路實現。也就是說,IVC計算的證明是該電路的證明。可想而知,如果是很多次迭代的計算,原本需要將這些迭代一個個地在電路中展開,現在只需要對4個電路實例進行可滿足性以及綁定關係的驗證即可。性能提升非常大。

攻擊以及算法修正

看到上面的圖,有個直覺,怎麼感覺上下電路的實例是“割裂“的,沒有什麼綁定性。事實上,攻擊就是這樣構造的。

偽造U_i^1和U{i+1}^2,雖然是偽造的,但是是可滿足的實例。偽造u{i+1}^1,修改x_0和x_1和偽造的U實例對應。顯然,u{i+1}^1實例不滿足。雖然它不滿足,但是Circuit 2的電路還是可以滿足的,只是輸出U{i+1}^1實例不滿足而已。成功構造了u{i+1}^2的話,Circuit 1就可以構造出可滿足的u{i+2}^1以及U_{i+2}^2,並且滿足x1的綁定關係。這樣就先構造出了最終偽造證明的一半內容。通過對稱性,可以構造出下面一半的輸出實例。通過兩次構造的結果的“拼接”,可以偽造出IVC計算的證明。

修正後的檢查邏輯如下:

“Nova潛在攻擊和相應修正”論文的第6章給出了詳細的安全性分析。感興趣的小伙伴,可以自行查看原論文。

Nova的基本思想是通過折疊方案折疊電路實例。邏輯比較繞,需要仔細地思考電路折疊過程以及實現電路中的綁定關係。

一個字形容:絕~

Total
0
Shares
Related Posts