STARKs 多項式證明(一)

2021-08-24 20:44:50 字數 4907 閱讀 4460

相信現在很多人都聽說過zk-snarks(zero-knowledge succinct non-interactive argument of knowledge零知識下簡明的非互動知識論證,該技術可以解決如下問題:證明者和驗證者交換資訊,在不直接展示該知識的情況下,使驗證者確信「證明者的確擁有這項知識」),這是一種通用的、簡潔的零知識證明技術,它可以應用於可驗證計算、需要保護隱私的加密貨幣等用途。

你可能不知道的是,zk-snarks還有乙個兄弟:zk-starks。其中的t字母代表「透明的」,zk-starks解決了zk-snarks的乙個主要缺陷,即zk-snarks依賴於「可信執行環境」。zk-starks還具有更簡單的密碼學假設,避免了使用橢圓曲線、配對和指數知識假設,而完全依賴雜湊和資訊理論;這也意味著即使是攻擊者使用量子計算機,也能保證加密的安全。

然而,這是有代價的:證明內容的大小從288位元組增加到幾百 kb,在傳統的中心化應用中,這樣的代價不太值得;但在其他時候,特別是在類似公有鏈的應用程式中,對信任最小化的需求非常高,那這樣的代價可能是非常值得的;如果哪一天橢圓曲線被破解或者量子計算機出現的話,那這麼點代價就一定是值得的了。

01   新的零知識證明是如何工作的?

how does this other kind of zero knowledge proof work?

首先,讓我們回顧一下零知識證明的一般工作原理是怎樣的。假設你有乙個(公共)函式f,乙個(私有)輸入x和乙個(公共)輸出y,你要證明你知道乙個x,使f(x) = y等式成立,卻不用告訴驗證者x具體是什麼。此外,為了使證明更簡潔,你希望證明過程比計算f本身要快得多。

讓我們來考慮以下幾個例子

那麼,這些例子的困難之處在哪呢?事實證明,零知識(即隱私)證明(相對而言)容易提供;有很多方法可以把任何計算問題都轉化為類似三色圖的問題,三色圖對應於原始問題的解,然後用傳統的零知識證明協議來證明你有乙個有效的圖,但你卻沒有透露計算的具體內容。馬修·格林(matthew green)在2023年有一篇非常精彩的文章對這一點做了詳細的描述。

其實最難實現的還是簡潔性。簡單來說,要簡潔的證明計算是否正確是非常困難的,因為計算的過程非常脆弱。假設你有乙個又長又複雜的計算任務,而且你有在計算過程中改變任意一位bit從0變成1的能力,那麼在很多情況下即使改變這一點點都足以使計算結果完全不同。因此,有時候很難檢查出你是否對計算過程做過什麼手腳,如果只對計算過程進行抽樣檢查的話,那就非常容易忽略你做過的這一點點手腳了。然而,這種做手腳的情況是可以通過一些數學方法避免的。

02  一些簡單的示例幫助你更好的理解

a somewhat ****** example

假設你想證明你有乙個多項式p使得p(x)是乙個整數,0 <= p(x) <= 9,對於所有的x從1到100萬。這是乙個「範圍檢查」的簡單例項;你可以把這種檢查是想象成某種驗證方式。例如,在處理過一些交易之後,一組賬戶餘額仍為正數。如果是1 <= p(x) <= 9,這可能是檢查這些值是否是構成正確的數獨解的一部分。

證明這個問題的「傳統」方法是列出所有的1,000,000點,並通過檢查值來驗證它。然而,我們想看看我們是否可以找到一種在不到1,000,000步內被驗證的證明方法。簡單地隨機檢查p的值是不行的;惡意驗證者總是有可能在999,999個地方找到乙個p滿足約束,但在最後乙個地方不滿足約束,並且隨機抽樣幾個值基本上是會忽略這個值的。那麼我們該做什麼呢?

讓我們從數學的角度來解決這個問題。假設c(x)是乙個約束檢驗多項式;如果0 <= x <= 9,則c(x) = 0,否則為非零。有乙個簡單的方法來構造c(x): x * (x-1) * (x-2) *…* (x-9)(我們假設所有的多項式和其他值都使用唯一的整數,所以不需要擔心中間的數字)。

現在,問題變成:證明已知p,x從1到1,000,000,使得c(p(x)) = 0,z(x) = (x-1) * (x-2) *…(x - 1000000)。已知的數學事實是,z(x)的多項式等於0,在x從1到1,000,000時值等於0。因此,這個問題可以被再次轉換: 證明已知p和d,使得所有x的c(p(x)) = z(x) * d(x)(注意,如果你知道乙個合適的c(p(x)),那麼將它除以z(x)來計算d(x)並不太難; 你可以使用長多項式除法,或者使用基於快速傅利葉變換的更快的演算法)。現在,我們已經把原來的語句轉換成數學上看起來很清楚而且很可能是可以證明的。

那麼,如何證明呢?我們可以將證明過程想象為證明者和驗證者之間的三步通訊:證明者傳送一些資訊,然後驗證者傳送一些請求,然後證明者傳送更多的資訊。首先,證明者提交乙個x符合p(x)和d(x)從1算到10億(即,建立乙個merkle樹並向驗證者傳送根雜湊值)。這包括0 <= p(x) <= 9的100萬個點,以及可能不是這樣的9.99億個點。

我們假設驗證者已經知道所有這些點的z(x)的值;x就像乙個「公鑰」,每個人都必須提前知道(使用者端沒有z(x)的儲存空間,但是可以簡單地儲存全部z(x)的merkle根,並需要證明者為每個需要查詢z(x)值的驗證者提供分支;另外,對於某些x,z(x)是很容易計算的)。在接收到證明者提交的merkle 根之後,驗證者隨機選擇1到10億之間的16個x值,並要求證明者提供那裡p(x)和d(x)的merkle分支。證明者提供這些值,驗證者檢查:

(i) 分支是否與之前提供的merkle根匹配,

(ii) c(p(x))在所有16種情況下是否等於z(x) * d(x)。

我們知道這個證明是完整的——如果你確實知道乙個合適的 p(x),那麼如果你計算 d(x) 並正確構造證明,它將始終通過16次檢驗。但是可靠性又如何呢?--也就是說,如果乙個惡意的證明者提供了乙個錯誤的 p(x),那麼他們被發現的最小概率是多少?我們可以分析一下,因為 c(p(x)) 是乙個由乙個1,000,000次的多項式組成10次多項式,疊加起來就是10,000,000次。一般來說,我們知道兩個不同程度的 n 次多項式在最多n個點上是一致的; 因此,乙個10,000,000次的多項式和總是等於 z(x) * d(x) 的多項式,如果這兩個多項式不同的話,對於 x 至少有990,000,000點不相同。因此,乙個錯誤的 p(x) 在乙個回合中被抓住的概率已經達到99%;如果想要通過16次檢查,不被發現的概率達到10-32,也就是說,這個方案就像計算雜湊衝突一樣難以偽造。

我們剛才做了什麼?我們使用多項式來「提高」任何錯誤解的誤差,所以,對於任何不正確的解決方案解決原始問題,都需要上百萬次檢查才能發現,轉換為驗證協議的解決方案,即使只進行一次檢查,也可以在99%的時間內將其標記為錯誤。

我們可以將這個三步機制轉換成非互動式證明,它可以由乙個證明者廣播一次,然後由任何人使用fiat-shamir啟發式進行驗證。證明者首先構建p(x)和d(x)值的merkle樹,並計算樹的根雜湊值。根本身就是熵的**,它決定了證明者需要提供的樹的哪些分支。然後證明者將merkle根和分支作為證明一起廣播。計算都是在證明方進行;從資料中計算merkle根的過程,然後使用它選擇要審計的分支,有效地替代了對互動式校驗者的需求。

沒有有效 p(x) 的惡意證明者唯一可以做的事就是一遍又一遍的嘗試做出有效的證明,直到最終可以非常幸運地得到計算merkle根選擇的分支,但可靠性為10-32,以現在的計算能力,需要數十億年的惡意證明才能作出可通過的證據。

03   更進一步說明,或許你會想知道更多

going further

為了說明這種技術的強大之處,讓我們使用它來做一些不那麼重要的事情:證明你知道第一百萬個斐波納契數。為了證明,我們將證明你已知計算帶的多項式,p(x)代表第x個斐波那契數。斐波那契數的規則如下:c(x1,x2,x3)= x3-x2-x1(注意如何c(p(x),p(x + 1),p(x + 2))= 0表示所有x,則p(x)表示斐波納契數列)。

轉換後的問題是:證明已知p和d ,c(p(x), p(x+1), p(x+2)) = z(x) * d(x)。對於證明審計的16個索引中的每乙個,證明者需要為p(x)、p(x+1)、p(x+2)和d(x)提供merkle分支。驗證程式還需要提供merkle分支,以顯示p(0) = p(1) = 1。否則,整個過程是相同的。

現在,要實現這一目標,有兩個問題需要解決。第乙個問題是如果我們試著用常規的數字來解決問題在實踐中效率不高,因為數字本身很容易變的非常大。例如,第一百萬個斐波那契數是乙個208988位數。如果我們真的想要在現實中簡潔的實現,而不是用常規數字做多項式,我們需要利用有限域——系統數量仍然遵循相同的數學規則,就像乙個a*(b + c)=(a * b)+(a *c)和(a ^2 -b ^ 2)=(a - b)*(a + b),但保證每個數字占用一定量的空間。要證明第一百萬個斐波那契數就需要乙個更複雜的設計,在這個有限域數學的基礎上實現大數運算。

其次,你可能已經注意到,在我上面關於可靠性的證明概要中,我忽略了一種攻擊方式:如果攻擊者提交的不是可信的1,000,000個p(x)和9,000,000個d(x)的值,而是任何相對低次多項式上都沒有的值,該怎麼辦?那麼,乙個無效的c(p(x))必須與任何有效c(p(x))不一樣,至少在9.9億點上是不一樣的,因此可能存在更有效的攻擊型別。例如,攻擊者可以為每乙個x生成乙個隨機值p,然後計算d = c(p) / z(x),並將這些值提交給 p(x)和d(x)。這些值不會在任何低階多項式上,但它們會通過測試。

事實證明,這種可能性還是可以有效的防範的,儘管這樣做需要相當複雜的工具,因此你可以相當合理地說,它們填補了starks數學創新的空缺。此外,該解決方案也有乙個限制:你可以清除對任何1,000,000次多項式的資料的證明(例如,你需要更改所有值的20%以使其成為1,000,000多項式),但是你不能排除僅與乙個或兩個座標不同的多項式資料。因此,這些工具可以提供的是鄰近證明 - 證明p和d上的大多數點都是多項式的正確解。

儘管有兩個「意外情況」,但是作為證明方法已經足夠了。首先,驗證者需要檢查幾個索引,以彌補這些侷限性引入的錯誤。其次,如果我們還要做「邊界約束檢查」(例如,在上面的fibonacci示例中驗證p(0)= p(1)= 1),我們還要擴充套件臨近證明,不僅證明大多數點是在同乙個多項式上,但也證明了那兩個特定點(或者你想要檢查的任何其他數量的特定點)都在該多項式上。

04   總結

review and summarize 

在本系列的第二部分中,我將更詳細地描述接近檢查的解決方案,在第三部分中,我將描述如何構造更複雜的約束函式,不僅檢查斐波那契數和範圍,還檢查任意計算。

MATLAB多項式及多項式擬合

多項式均表示為陣列形式,陣列元素為多項式降冪係數 1.polyval函式 求多項式在某一點或某幾個點的值.p 1,1,1 x 2 x 1 x 1,0,1 y polyval p,x 另外求函式在某一點或某幾個點的值可以用函式feval.x 1,0,1 y feval x exp x x 注意用的乘法...

數學 多項式 多項式求逆

多項式求逆 前置知識 ntt 給定乙個多項式 f left x right 求乙個多項式 g left x right 使得 f left x right g left x right equiv 1 left bmod 998244353 right 考慮遞迴求解。假定現在已經求出了 g 0 le...

matlab多項式與非多項式擬合

擬合標準 1 原始資料向量與擬合向量之間的距離最小,該距離的度量一般使用誤差平方和表示,即均方誤差 r q y 22 2 當均方誤差最小時,說明構造的擬合向量與原始向量最為接近,這種曲線擬合的方法稱為最小二乘法 3 計算均方誤差最小時的擬合係數,可以通過微積分中求解極值的方法實現 多項式擬合 1 多...