深入理解零知識證明演算法之Zk-stark:Low Degree Testing

買賣虛擬貨幣
前言本系列的第二篇文章,以超市收據為例,描述了Arithmetization 的具體過程。本文將以另外一個例子為基礎,在回顧Arithmetization 過程的同時,將內容引申到多項式的LDT過程。新的例項

Alice Claim:“我有1000,000個數,他們都在[0,9]範圍內”。為了方便驗證者Bob驗證,Alice首先要對Claim進行Arithmetization轉換。過程如下圖1所示(圖中:黑色箭頭代表主流程,紅色箭頭代表附加說明資訊,黃色圈對應下面詳細說明的索引)

下面具體說明一下對應流程:

1. 首先生成執行軌跡(EXCUTE TRACE),事實上,它是一張表,總共有1000,000行(實際上,為了達到零知識的目的,還需要在執行軌跡後面增加一些隨機值,具體數量是由證明者和驗證者統一協調決定的,作為一個擴充套件,不具體講述);

2. 生成多項式約束(Polynomial Constrains),多項式約束滿足執行軌跡的每一行(個人理解:步驟1,2沒有一定的先後依賴關係,只是習慣上先生成執行軌跡,再生成約束多項式);

3. 對執行軌跡進行插值,得到一個度小於1000,000的多項式P(x)、x取值[1,1000,000],並計算更多點上的值,x取值範圍擴大到[1,1000,000,000](Reed-Solomen系統編碼);假如,證明者有一個值不在[0,9]範圍內(圖中紅線1/2所示),假如就是第1000,000個點,它實際的值是13,大於9,其插值後的曲線G(x)如圖所示,圖中P(x)為有效曲線,G(x)為無效曲線。可以看出,兩條曲線在變數x取值[1,1000,000,000]範圍內,最多有1000,000個交點,即有1000,000,000 - 1000,000個點不同,這很重要。

4. 將插值後的多項式P(x)和多項式約束進行組合變換,最終得到的形式為:

Q(P(x)) = Ψ(x) * T(x),其中T(x) = (x - 1)(x - 2)……(x - 1000,000),x取值[1,1000,000,000]

其中,d(Q(P(x))) = 10,000,000、d(Ψ(x)) = 10,000,000 - 1000,000、d(T(x)) = 1000,000;

1. 至此,問題就轉化成了,Alice宣稱“多項式等式在變數x取值[1,1000,000,000]範圍內成立”的問題。那麼驗證者Bob該如何驗證呢?具體過程如下(圖中紅線3/4所示):

a. 證明者Alice在本地計算多項式P(x)、Ψ(x)在所有點上的取值,對!從1至1000,000,000,並形成一個默克爾樹;

b. 驗證者Bob隨機的從[1,1000,000,000]內選取一個值 ρ,併傳送給證明者Alice,要求其返回對應的資訊(事實上為了達到零知識的目的,只允許從[1000,000,1000,000,000]上隨機選擇一點);

c. 證明者Alice返回 P(ρ)、Ψ(ρ)、root、AuthorizedPath(P(ρ)、Ψ(ρ))給驗證者Bob;

d. 驗證者Bob首先根據默克爾樹驗證路徑驗證值P(ρ)、Ψ(ρ)的有效性,然後等式Q(P(ρ)) = Ψ(ρ) * T(ρ),如果成立,則驗證透過;

完整性分析:如果驗證者Alice是誠實的,那麼等式Q(P(x))一定會被目標多項式T(x)整除,因此必定存在一個d(Ψ(x)) = d(Q(P(x))) - d(T(x))的多項式Ψ(x),滿足Q(P(x)) = Ψ(x) * T(x),因此對於任意的x,取值在[1,1000,000,000]之間,等式都會成立;

可靠性分析:如果驗證者Alice是不誠實的,即類似於步驟3裡的假設,在x = 1000,000上,P(x)的取值為13,那麼Q(P(1000,000)) != 0,但是等式右邊,T(1000,000) = 0,因此Q(P(x)) != Ψ(x) * T(x),即等式兩邊是不相等的多項式,其交點最多有10,000,000個,因此透過一次隨機選取,其驗證透過的概率僅為10,000,000/1000,000,000 = 1/100 = 0.01,經過k次驗證,其驗證透過的概率僅是1- 10(^-2k);

1. 上述的驗證過程為互動式的,如果是非互動式的,可以利用Fiat-Shamir heuristic進行變換,以默克爾樹的根作為隨機源,生成要查詢的隨機點;

LDT

我們忽略了一種攻擊方式,即針對每一個數x,證明者都隨機生成p,然後根據Ψ(x) = Q(p) / T(x),這些點不在任何一個度小於1000,000的多項式上,但是可以透過驗證者驗證。如下圖2所示:

圖中:紫色的點為隨機生成的點p,這些點大概率不在一個度小於1000,000的多項式上(事實上,可以不考慮前1000,000個點,因為驗證者只會從[1000,000,1000,000,000]範圍內取值)。因為即使選擇1000,000個點插值出一個度小於1000,000的多項式,也不能保證其他的點在這個多項式上,因為其他的點是隨機生成的。因此,需要有一種方式,保證證明者P(x)的度是小於1000,000, Ψ(x)的度小於10,000,000 - 1000,000。這就是LDT的目標,那LDT具體的過程是怎麼樣的呢?請繼續往下看。

舉個栗子,如果Alice想證明多項式f(x)的度是小於3的,即有可能是2次的或者是1次的。一般流程如下:

驗證者Bob隨機選取三個值a,b,c,傳送給證明者Alice;
證明者Alice返回f(a),f(b),f(c);
驗證者Bob插值出度小於3的多項式g(x),然後再隨機選取一個點d,傳送給證明者;
證明者Alice返回f(d);
驗證者Bob比對f(d)和g(d)的值,如果相等,則證明成立。

迴歸到一般情況,其過程可以用下圖3表示:

可以看出,如果D很大,Alice和Bob互動的次數則為D+k次,複雜度很高;有沒有一種辦法,使得兩者之間互動的次數小於D的情況下,使得驗證者相信多項式的度是小於D的,直接返回小於D個點肯定是不行的,因為那不能唯一確定一個度小於D的多項式,因此需要證明者需要額外傳送一些輔助資訊。

下面我們以P(x)為例,詳細闡述這個過程(事實上,應該是證明P(x)和Ψ(x)的線性組合小於10,000,000 - 1000,000,本文重點是LDT,因此只以P(x)為例,這並不影響對LDT的理解)。

1. 假如P(x) = x + x^999 + x^1001 + x^999999 = x + x^999 + x * x^1000 + x^999*(x^1000)^999;

2. 此時,我們找到一個二維多項式G(x, y),取值範圍分別是[0, 999999999]、[01000, 9999999991000],滿足:

a. G(x, y) = x + x^999 +x * y + x^999*y^999 可以發現,當y = x^1000時,滿足:
b. G(x, y) = G(x, x^1000) = x + x^999 + x * x^1000 + x999*(x^1000)^999 = P(x)

3. 如果我們能證明G(x, y)相對的x,y的最高度都是小於1000,因為P(x) = G(x, x^1000)上,因此可以相信P(x)的度小於1000,000;

如圖4所示:

驗證者把所有的點都計算好(沒錯,總共10^18個點,嚇死BB了),形成一顆默克爾樹。驗證者隨機選擇一行和一列,如圖中紅線1/2所示,對於每一列,它是由關於y的度小於1000的多項式生成,對於每一行,它是由關於x的度小於1000的多項式生成。驗證者從行/列中隨機選擇1010個點,用來驗證對應行/列上的點是否在度小於1000的多項式上,需要注意的是,因為P(x)的點都在上圖的對角線上,因此我們要確保每一行/列對應的對角線上的點也在對應的度小於1000的多項式上,即1010個裡面一定要包含對角線的點。

可靠性分析:如果原始多項式的度實際上是小於10^6 +10999,即 P(x) = x + x^999 + x^1001 + x^1010999 ,那麼對應的G(x, y)為G(x, y) = x + x^999 +x * y + x^999*y^1010 ,即,對於每一個x,G(x, y)是關於y的一元多項式函式,且度d < 1010,因此下圖中的每一列所有點都是在度d < 1010的多項式上,而不在d < 1000的多項式式上。所以如果證明者任然宣稱多項式P(x)的度d < 1000,000 ,則會驗證失敗,其他場景是同樣的道理

那有沒有可能惡意證明者仍以G(x, y) = x + x^999 +x * y + x^999*y^999 的形式去生成證據呢?這樣會驗證透過嗎?

我們知道,我們在驗證時著重強調了對角線上的那一點一定要在多項式上,我們知道,此時對角線對應的多項式形式是

P(x) = x + x^999 + x1001 + x^999999 ,而實際的P(x),我們在這裡標記為P`(x) ,其形式是:
P`(x) = x + x^999 + x^1001 + x^1010999

因此,如果驗證者恰好選擇的點是兩個多項式的交點,則會驗證透過,事實上,兩個多項式最多有1000,000 左右個交點,但是由於隨機選取的點不是證明者自己選取,是由默克爾樹的根為種子隨機生成,因此證明者沒有機會作惡,去可以選取那些能透過驗證的點。

由於總共由10^9個點,因此隨機選取一個點,能驗證成功的概率為10^6 / 10^9 = 10^(-3),如果選擇k行,則成功的概率僅為10^(-3k)。

以上可以看出,驗證者和證明者只需要互動1010 * 2 * k個點,就可以完成驗證,假如k = 10,則1010 * 2 * 10 = 20100 << 10^6。

1. 雖然上述實現了在互動次數小於D的情況下,完整LDT驗證,但是證明者的複雜度過於龐大,至少10^18的複雜度遠遠大於原始的計算,因此需要一些最佳化方案,降低複雜度。話不多說,直接引入有限域,畢竟在實際專案中,我們可不希望數值本身過於龐大。直接引用費馬小定理的結論:在有限域p內,如果滿足(p - 1) 能被k整除,則對映x => x^k的像只有(p -1) / k + 1個。下圖5以p = 17,對映x=> x^2為例:

圖中,紅色為x^2在有限域p內的象,總共由(p - 1) /2 + 1 = 9個。同時我們可以發現,9^2和8^2的像一致,10^2和7^2的像一致,以此類推,16^2和1^2的像一致,記住這個現象,對下一張圖的理解有幫助。

因此,在本例中,我們選擇一個素數p = 1000,005,001,其滿足:

為素數
p - 1 能被1000整除
p要大於10^9

因此,在有限域p內,x => x^1000的像在p內有(p -1) / 1000 = 1000,005個,因此圖4可以變成圖6的形式:

可以看出,列座標變成了10^6個元素,對角線變成了平行的線條,總共有1000個。還記得上面費馬小定理結論的特殊現象嗎?這就是對角線這種分佈的原因,讀者試著去理解(可能讀者會覺得,對角線應該是鋸齒形,不是這種平行的形式,也許你是對的,但是這並不影響驗證流程)。此時證明者的複雜度已經從10^18 減少到了10^15次方,證明和驗證過程和步驟3描述的仍然一致。

1. 還能不能繼續最佳化呢?答案是肯定的。回想起前面所述的驗證過程,對於每一行/列,驗證者都要獲取1000個點進行插值得出一個度小於1000的多項式,仔細觀察圖6,對於每一行,原始資料裡不就是有1000個數麼?那我們乾脆選這些點插值出一個度小於1000的多項式,然後只需要隨機讓證明者再計算任何一列,並且證明沿著列上的點都在度小於1000的多項式上,並且列上的點也在對應的利用原始資料插值出的行多項式上。此時,證明者複雜度從10^15減少到了10^9次方。

2. 總結:個人理解,從步驟1到步驟5,其實是PCP到IOP的選擇過程。

a. PCP要求證明者生成全部的證據,然後驗證者多次隨機選取其中的某一部分進行驗證,但是這樣,證明者的複雜度仍然很高;
b. IOP要求證明者不用生成全部的證據,根據多次的互動,每次生成只需生成部分證據,使得證明的複雜度和D呈近似線性關係;

證明者複雜度已經降低到了與D呈擬線性關係,驗證者的複雜度雖然是亞線性,互動次數已經低於D,但是能不能最佳化到更低呢?基於證明覆雜度的最優設定,我們繼續探索驗證複雜度的最佳化之路,回顧P(x) = x + x^999 + x^1001 + x^999999 = x + x*(x^2)^499 + x*(x^2)^500 + x*(x^2)*499999,令G(x, y) = x + x*y^499 + x*y^500 + x*y^499999,則當y = x^2時,有G(x, y) = G(x, x^2) = x + x*(x^2)^499 + x*(x^2)^500 + x*(x^2)*499999 = P(x)。

最終的圖應如下圖7所示:

從圖中可知:

· 證明則複雜度仍為10^9次方;

· 每一行上的點都在度d < 2的多項式上,因為當y取固定值時,G(x, y)就是關於x的一次多項式;

· 每一列上的點都在度d < D/2的多項式上,證明者需要證明這個多項式是小於D/2的,假定這個多項式為P1(x),這個時候,並非驗證者選取大於D/2個點去驗證,因為驗證複雜度仍然不夠低,而是對這一列再一次用到類似於P(x)的處理過程,如圖7中下面的圖所示,以此迴圈,直到可以直接判斷列上的多項式的度為止,類似於行。

總結

至此,本篇文章就結束了,總結下來,本文主要闡述了以下幾個內容:

如何轉換問題形式 -- Arithmetization
為何需要LDT -- 為了驗證簡潔
LDT的大概過程 -- 二分法驗證,類似於FFT
降低LDT的複雜度 -- 有限域+IOP

至於LDT的詳細過程,將留給本系列的最後一篇,敬請關注。

免責聲明:

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

推荐阅读

;