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

2021-01-10 比特幣小白

前言

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

新的實例

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

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

首先生成執行軌跡(EXCUTE TRACE),事實上,它是一張表,總共有1000,000行(實際上,為了達到零知識的目的,還需要在執行軌跡後面增加一些隨機值,具體數量是由證明者和驗證者統一協調決定的,作為一個擴展,不具體講述);生成多項式約束(Polynomial Constrains),多項式約束滿足執行軌跡的每一行(個人理解:步驟1,2沒有一定的先後依賴關係,只是習慣上先生成執行軌跡,再生成約束多項式);對執行軌跡進行插值,得到一個度小於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個點不同,這很重要。將插值後的多項式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;

至此,問題就轉化成了,Alice宣稱「多項式等式在變量x取值[1,1000,000,000]範圍內成立」的問題。那麼驗證者Bob該如何驗證呢?具體過程如下(圖中紅線3/4所示):證明者Alice在本地計算多項式P(x)、Ψ(x)在所有點上的取值,對!從1至1000,000,000,並形成一個默克爾樹;驗證者Bob隨機的從[1,1000,000,000]內選取一個值 ρ,並發送給證明者Alice,要求其返回對應的信息(事實上為了達到零知識的目的,只允許從[1000,000,1000,000,000]上隨機選擇一點);證明者Alice返回 P(ρ)、Ψ(ρ)、root、AuthorizedPath(P(ρ)、Ψ(ρ))給驗證者Bob;驗證者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);

上述的驗證過程為交互式的,如果是非交互式的,可以利用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的理解)。

假如P(x) = x + x^999 + x^1001 + x^999999 = x + x^999 + x * x^1000 + x^999*(x^1000)^999;此時,我們找到一個二維多項式G(x, y),取值範圍分別是[0, 999999999]、[01000, 9999999991000],滿足:G(x, y) = x + x^999 +x * y + x^999*y^999 可以發現,當y = x^1000時,滿足:G(x, y) = G(x, x^1000) = x + x^999 + x * x^1000 + x999*(x^1000)^999 = P(x)如果我們能證明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。

雖然上述實現了在交互次數小於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描述的仍然一致。

還能不能繼續優化呢?答案是肯定的。回想起前面所述的驗證過程,對於每一行/列,驗證者都要獲取1000個點進行插值得出一個度小於1000的多項式,仔細觀察圖6,對於每一行,原始數據裡不就是有1000個數麼?那我們乾脆選這些點插值出一個度小於1000的多項式,然後只需要隨機讓證明者再計算任何一列,並且證明沿著列上的點都在度小於1000的多項式上,並且列上的點也在對應的利用原始數據插值出的行多項式上。此時,證明者複雜度從10^15減少到了10^9次方。總結:個人理解,從步驟1到步驟5,其實是PCP到IOP的選擇過程。PCP要求證明者生成全部的證據,然後驗證者多次隨機選取其中的某一部分進行驗證,但是這樣,證明者的複雜度仍然很高;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

相關焦點

  • 從零開始學習 zk-SNARK(一)——多項式的性質與證明|火星技術帖...
    在這篇文章中,我主要就基於一些實例簡潔明了地闡明 zk-SNARK ,並對這裡面的很多問題做出了解釋,並利用這種方式分享了我的經驗,進而讓更多人也能夠欣賞到這項最先進的技術以及它的創新之處,最終欣賞到數學之美。
  • 二次剩餘——第一個零知識證明協議的歷史背景與證明方法|火星技術帖
    小編:記得關注哦來源:安比實驗室SECBIT原文標題:三分鐘了解第一個零知識證明協議的歷史背景與證明方法完整介紹了第一個零知識證明協議的背景知識、構造以及證明。不用擔心,提出這個概念的圖靈獎級別論文《交互證明系統的知識複雜度》(GMR[85]),曾連續四次被業界頂級的計算理論研討會 STOC 拒絕。看來不只是我們,那個時代最聰明的頭腦們同樣難以理解這篇極為重要的論文所蘊含的深刻意義。
  • 小白也能看懂的「零知識證明」原理
    零知識證明指的是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的,在密碼學中非常有用。顧名思義,零知識證明就是既能充分證明自己是某種權益的合法擁有者,又不把有關的信息洩漏出去,即給外界的 「知識」 為「零」。
  • 怎麼證明你媽是你媽?零知識證明會給你答案!
    【什麼是零知識證明?】你從前一定聽說過這樣一個事情,一家要出境旅遊,需要明確一位家人作為他們的緊急聯絡人,於是爸爸想到了自己的母親。那麼問題來了,旅行社要求爸爸出局書面證明,證明他和他母親是母子關係。可爸爸成家後戶口信息早已不在父母的戶口簿上。
  • 關於圖算法 圖分析的基礎知識概覽
    今天內容很多,坐穩~目錄圖算法 & 圖分析圖基礎知識連通圖與非連通圖未加權圖與加權圖有向圖與無向圖非循環圖和循環圖圖算法路徑搜索算法DFS & BFS最短路徑最小生成樹隨機遊走中心性算法
  • 圖論的各種基本算法
    實際上是不等價的,按入度為零排序,如果出現了多個入度為零的頂點,這多個頂點排序的順序是無關的,可以任意排序。而按出度最大排序,出現了多個入度最大的頂點,這多個頂點排序是有關的,不能任意排序。所以,只能按入度為零排序。實際上,這個想法就是貪心選擇。下面以挑選入度為零的邊作為貪心選擇解決問題,同樣地,還是先證明這個貪心選擇的正確性。
  • 關於圖算法 & 圖分析的基礎知識概覽
    Degree 可以簡單理解為一個節點的訪問機會的大小。例如,在一個社交網絡中,一個擁有更多 degree 的人(節點)更容易與人發生直接接觸,也更容易獲得流感。一個網絡的平均度(average degree),是邊的數量除以節點的數量。當然,平均度很容易被一些具有極大度的節點 「帶跑偏」 (skewed)。
  • 怎麼樣更好地理解排序算法
    這個問題糾纏了我好久,總想怎樣才能把各種算法可視化,更容易理解和記憶。排序是一個經典的問題,它以一定的順序對一個數組或列表中的元素進行重新排序。而排序算法也是各有千秋,每個都有自身的優點和局限性。雖然這些算法平常根本就不用自己去編寫,但作為一個有追求的程式設計師,還是要了解它們從不同角度解決排序問題的思想。
  • 2020 圖算法工程師面試基礎、要點
    為你總結面試必備的知識要點,助你面試成功。 這段時間面試連連,幾輪下來的感受就是,好點兒的公司對細節摳的很細,希望求職者能夠對使用的算法以及這個算法的其它觸類旁通的領域都能夠有系統的理解。
  • 電磁檢測術語大全Electromagnetic Testing Glossary
    crack, forging: Crack developed in the forging operation because of forging at too low a temperature, resulting in rupturing of the material.
  • 帶你深入理解圖靈機--天才所在的時代
    沒有計算機專業知識的同學其實很難理解這個詞的意思,其實計算機專業的同學都沒有深入理解圖靈機,圖靈完備,圖靈測試等概念包含的內涵。為了方便理解區塊鏈技術,理解智能合約,筆者準備分幾篇文章來帶大家從淺入深,一步一步帶你深入理解圖靈機,相信通過這幾篇文章能就能夠理解什麼是圖靈完備。大家知道任何偉大藝術的誕生背後都有迷人的時代背景,偉大的科學思想也是一樣。
  • 2011英語四級閱讀理解專項練習題(6)
    2011英語四級閱讀理解專項練習題(6)  In ancient times the most important examinations were spoken, not written.
  • 谷歌AutoML鼻祖新作AutoML-Zero:從零開始構建機器學習算法
    新方法可自動搜索新算法,僅利用基本的數學公式Automl-Zero 旨在自動發現機器學習算法,從空的或隨機的程序開始,只使用基本的數學運算。它可以同時無偏好地搜索機器學習算法的所有方面,包括模型結構和學習策略。
  • 計算機入門必備算法——快速排序法
    準備停止學習一周,等把項目這一關過了,再繼續深入學習分享算法。後來吧今天遇到的事情都比較鬱悶,也無心情繼續開發項目。便想轉移一下注意力,繼續學習快速排序算法的內容。昨天了解了遞歸的使用原理。今天可以使用這個新技能來解決一個新的問題————快速排序。快速排序是一種排序算法,這個算法比前天學習的選擇排序要快得多,實屬優雅代碼的典範。
  • KNN分類算法的python實現
    前言 K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:在特徵空間中,如果一個樣本附近的k個最近(即特徵空間中最鄰近)樣本的大多數屬於某一個類別,則該樣本也屬於這個類別。。
  • 總結優化算法收斂性證明的兩類方法
    這篇文章中,我們總結兩類做數值優化迭代算法收斂性證明的方法,同時也討論了優化算法設計的思路。1. 簡介數值優化在工程應用中有非常重要的作用。但在使用優化算法時候,算法的收斂性是我們需要認真考慮的東西,例如我們需要知道梯度下降是一階收斂而牛頓法是二階收斂,因此一般情況下,牛頓法會比梯度下降運行更快。