前言本系列的第一篇文章(技術指南 | 理解零知識證明算法之Zk-stark),以Zk-snark做對照,分別從概念和算法流程上,做了概括性的介紹。建議在
前言
本系列的第一篇文章(技術指南 | 理解零知識證明算法之Zk-stark),以Zk-snark做對照,分別從概念和算法流程上,做了概括性的介紹。建議在閱讀本篇文章之前,先閱讀下第一篇文章的內容。本篇文章,讓我們由淺入深,一起踏上探索Zk-stark算法奧秘的旅途。
回顧
在第一篇的文章中講到,Zk-stark算法大體可以分為兩個部分:Arithmetization 和 Low Degree Testing。本篇我們先詳細介紹算法的第一階段Arithmetization。
Arithmetization的整體步驟如下圖所示:
那什么是Arithmetization?具體過程又是什么呢?帶著這些疑問,讓我們仔細的品味文章后面的內容。
首先,什么是Arithmetization?
Arithmetization就是把CI statement轉化成正式的Algebraic language的過程,此步驟有兩個目的:第一,把CI statement以簡潔清晰的方式呈現出來;第二,把CI statement嵌入到代數域,為后面多項式的轉換做鋪墊。Arithmetization representation主要由兩部分組成:第一,執行軌跡(圖中橙色部分);第二,多項式約束(圖中灰色部分)。
執行軌跡是一個表,表的每一行代表一個單步的運算;多項式約束的構造是和執行軌跡相輔相成的,即當前僅當執行軌跡是正確的,多項式約束會滿足執行軌跡的每一行計算。最后把執行軌跡和多項式約束結合組成一個確定的多項式,然后對多項式進行LDT驗證。至此,驗證CI statement的問題轉換成了驗證確定性多項式LDT的問題。
Arithmetization
知道了Arithmetization的整體流程,接下來,我們討論下具體的過程。為了便于理解,我們用一個簡單的例子,來貫穿整個Arithmetization的過程。
每個人都去過超市,一般超市的收據的內容如下:
現在,好萊塢人氣演員Bob聲稱:"the total sum we should pay at the supermarket was computed correctly"。那怎么驗證呢?其實很簡單,這時另一個人氣演員Alice只要對著收據,每一項累加求和就可以完成驗證。那么,這只是一個很簡單的例子,事實上,Alice只需要5步,就可以完成驗證過程。
試想這樣一個場景:畢竟Bob很有錢,在超市買了1000000樣東西,同樣,他又聲稱:"the total sum we should pay at the supermarket was computed correctly",這時候,Alice真的生氣了,這怎么驗證,按照之前的辦法,得大約要算1000000步,鬧呢?誰愛干誰干。Bob心里也心疼Alice,畢竟那么多年了。心想,有沒有什么牛掰的辦法能讓Alice用很少的步驟,就能確信我說的是對的呢?于是,Bob開動了最強大腦模式。
下面,讓我們用上面簡單的例子,跟隨Bob去尋找這個牛掰的辦法。
Bob心想,你不就是驗證最終的總和對不對么?那我就把總和的計算過程列出來,我保證每次的累加都對,那么我最終的結果一定也是對的。于是Bob在收據上新增了一列,用來保存計算總和過程中的中間值(圖中橙棕色部分標注),這就是執行軌跡(圖1中的橙色部分)。
新增的一列值需要滿足,初始化的值為0(圖2中黃色部分)、最終的值和要付的總和相等(圖2中黃色部分)、中間的每一個值都要等于上一個值加上上一行物品的單價(圖2中紅線部分),這構成了多項式約束(圖1灰色部分,圖2左下角部分)。
從圖2可以看出:
· 多項式約束總共有3個,兩個是邊界約束(多項式索引1&3),一個是循環約束(多項式索引2);
· 多項式的大小和執行軌跡的答案小沒有關系,即表格的長度即使擴大到1000000,最終的多項式約束仍是這三個,唯一變化的是變量x的取值范圍而已。
在這里,借用V神的話來描述一下Zk-stark:Zk-Stark不是一個確定性的算法,它是一大類密碼和數學結構,對于不同的應用,具有不同的最優設置。可以理解為,對于不同的問題,具有不同的算術化的方案(在本例中,是加一列值,在其他案例中就不一定適用了),因此要做到具體問題具體分析。
但是有一個共同目標就是,無論是什么問題,得到的執行軌跡最好是用一個LOOP就可以表示,這樣得到的多項式約束也就最為簡潔。多項式約束的個數和形式直接影響到了proof的大小和Zk-stark算法的性能,因此,尋找一個最優的設置對于Zk-stark算法顯得尤為重要。
回歸到主題,現在Bob已經得到了多項式約束和執行軌跡,那么如何把它們轉換成一個確定的多項式呢?請看下圖:(藍色箭頭代表主流程,紅色箭頭代表分支)
Bob首先把關注點切到執行軌跡,可以看到執行軌跡有2列,一列是單項價格,一列是價格總和,我們分別對兩列的元素進行拉格朗日插值,得到兩個函數 f(x), w(x),0≤x≤5。分別對兩個函數進行域擴展,得到了在更多的點上的評估,即f(x),w(x) ,0≤x≤10000(從多項式插值,到域擴展,這其實就是Reed-Solomen的編碼過程,它可以實現,原始數據哪怕有一處差異,得到的碼字會大不相同;主要目的用于防止證明者作惡,加入證明者作惡,會使得驗證者很容易發現)。
然后,Bob把f(x),w(x) 和多項式約束等式結合,得到一組確切的多項式約束(圖中紅色圈2所示),以循環約束多項式為例:
1 ≤ x ≤ 5 w(x) - f(x -1) - w(x -1) = 0 (1)
令Q(x) = w(x) - f(x-1) - w(x-1),則有Q(1) = 0、Q(2) = 0、Q(3) = 0、Q(4) = 0、Q(5) = 0。
根據已知事實,度為d的多項式H(x)在x = n處為0,則存在一個度為d-1的多項式H`(x),滿足 d(H`(x)) = d(H(x)) - 1 && H(x) = H`(x) * (x - n)
因此對于Q(x),度為5,存在一個多項式Ψ(x),度為0,即常量,滿足Q(x) = Ψ(x) * (x - 1)(x - 2)(x - 3)(x - 4)(x - 5),令目標多項式T(x) = (x - 1)(x - 2)(x - 3)(x - 4)(x - 5),度為5,則有:
Q(x) = Ψ(x) * T(x) (2)
驗證者Alice從0≤x≤10000隨機選擇一點a,發送給證明者Bob,要求Bob返回相應的值,以公式(2)為例,Bob需要返回w(a)、w(a-1)、f(a-1)、Ψ(a),然后Alice判斷等式是否成立,即:
w(a) - f(a - 1) - w(a - 1) = Ψ(a) * T(a) (3)
如果等式成立,則Alice大概率相信執行軌跡是正確的,那么原始計算成立。假如驗證者Bob作惡,將表格中的4.98改成5.98,那么Q(1) = w(1) - w(0) - f(0) = 5.98 - 0 - 4.98 = 1,不等于0。在這種情況下,觀察公式(2),等式右邊為Q(x),度為5,x = 1不是零點;等式右側Ψ(x) * T(x) ,令G(x) = Ψ(x) * T(x),度為5,因為T(x)在x = 1處是零點,所以G(x)在x=1處也是0點。
因此,等式兩邊實際上是度相等的不同多項式,其交點最多為5個,因此在0≤x≤10000范圍內,只有5個值相等,9995值是不等的,因此隨機的從0≤x≤10000中選擇一個值,驗證不通過的概率是99.95%,如果域擴展的范圍更大,則驗證不通過的概率將會更接近于1。按照同樣的邏輯,分別處理邊界約束多項式,得到的結果如圖所示(圖中紅色圈3所示)。
下面,我們講討論如何增加零知識屬性。
對于證明者Bob來講,執行軌跡是不希望被驗證者Alice看到的,因為它會包含一些重要的信息,因此,限定驗證者Alice只能從6≤x≤10000范圍內隨機選擇一個值,進行驗證,當然這種限定,雙方都是同意的。
存在這樣一類問題。當驗證者Alice收到證明者Bob反饋的值時,如何保證這些值是合法的,確實是通過多項式的形式計算,并且這些多項式是小于某個度的,而不是證明者Bob僅僅為了驗證通過,而生成的隨機值?比如如何確保w(a)、w(a-1)、f(a-1)、Ψ(a)是多項式w(x)、f(x)、Ψ(x)分別在x = a && x = a - 1上的取值呢,且多項式w(x)、f(x)、Ψ(x)的度小于某個固定值的呢?這些問題將在下一篇文章中給出答案,在此之前,不如先討論一下,為何多項式的度小于某個固定值就能證明原始執行軌跡是正確的呢?
從以上的例子中,可以看出,當且僅當執行軌跡是正確的時候,Q(x)才會在x 取值為 1、2、3、4、5時,等于0。那么Q(x)才可以被目標多項式T(x)整除,即:Ψ(x) = Q(x) / T(x) ,d(Ψ(x)) = d(Q(x)) - 5。
從圖3可以看出,需要驗證的多項式的個數是5個(紅色圈4所示),如果對每一個多項式都進行LDT,那么消耗是很巨大的,因此,可以通過將這些多項式進行線性組合(紅色圈5所示),當且僅當每個多項式都滿足小于某個度時,其線性組合后的多項式也是小于某個度的,這個條件時充分的,具體的細節見后續的系列章節。(江小白)
關鍵詞: Arithmetization 零知識證明算法