日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详解零知识证明的四大基础技术,如何与以太坊发生反应

發布時間:2024/5/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解零知识证明的四大基础技术,如何与以太坊发生反应 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

zkSNARKs 的成功實現讓我們印象深刻,因為你可以在不執行,甚至不知道執行的具體內容是什么的情況下確定某個計算的結果是否正確 -- 而你唯一知道的信息就是它正確的完成了。但是不幸的是,大多數關于 zkSNARKs 的解釋都浮于表面,而且他們往往會遺留下一些『魔法』,并暗示只有最聰明的人才能懂得 zkSNARKs 是如何工作的。實際上,zkSNARKs 可以總結為 4 個簡單的技術,本篇博客將會逐一解釋這些技術。任何懂得 RSA 加密系統工作原理的人都會對當前使用的 zkSNARKs 有一個更好的理解和認識。讓我們拭目以待!

先做一個簡單的摘要,我們當前使用的 zkSNARKs 包含 4 個主要的部分(在接下來的文章里我們會詳細解釋每個部分):

A) 編碼成一個多項式問題

把需要驗證的程序編寫成一個二次的多項式方程:t(x) h(x) = w(x) v(x),當且僅當程序的計算結果正確時這個等式才成立。證明者需要說服驗證者這個等式成立。

B) 簡單隨機抽樣

驗證者會選擇一個私密評估點 s 來將多項式乘法和驗證多項式函數相等的問題簡化成簡單乘法和驗證等式 t(s)h(s) = w(s)v(s) 的問題。

這樣做不但可以減少證明量,還可以大量的減小驗所需的時間。

C) 同態(Homomorphic)編碼 / 加密

譯者注:在1978年,Ron Rivest,Leonard Adleman,以及 Michael L. Dertouzos 就以銀行為應用背景提出了同態加密的概念,當時使用的單詞是 homomorphism,也就是和抽象代數的同態是一個單詞。現在一般都使用 homomorphic encryption,國內密碼學圈子基本也都稱作同態加密。Ron Rivest 和 Leonard Adleman 分別就是著名的RSA算法中的 R 和 A(還有一位是 Adi Shamir)。

補充(來自白老師):同胚和同態在數學上不是一個意思。同胚指連續變形下的不變性,同態指映射下代數運算關系的保持性。

我們使用一個擁有一些同態屬性的(并不是完全同態的,至少在實際使用中有一些不是同態的)編碼 / 加密函數 E。這個函數允許證明者在不知道 s 的情況下計算 E(t(s)), E(h(s)), E(w(s)), E(v(s)),她只知道 E(s) 和一些其他有用的加密信息。

D) 零知識

證明者通過乘以一個數來替換 E(t(s)), E(h(s)), E(w(s)), E(v(s)) 的值,這樣驗證者就可以在不知道真實的編碼值的情況下驗證他們正確的結構了。

而這其中的難點在于對一個隨機的私密數 k(k 不等于 0)來說,校驗 t(s)h(s) = w(s)v(s) 和校驗 t(s)h(s) k = w(s)v(s) 幾乎是完全一樣的,而不同點則是如果你只接收到了 (t(s)h(s) k) 和 w(s)v(s) 那么從中獲取到 t(s)h(s) 或者 w(s)v(s) 的值就幾乎不可能了。

當然了,這些都只是表面的部分,是為了讓你更好的理解 zkSNARKs 的本質,現在讓我們開始詳細的講解這些知識點。

RSA 和 零知識證明

現在讓我們快速的回想一下 RSA 是如何工作的,先不管那些瑣碎的細節。想想看,我們經常用一個數字對一些數字取模,而并不是所有的整數。這里的等式 “a + b ≡ c (mod n)” 等價于 “(a + b) % n = c % n”。注意,“(mod n)” 這個部分并不是應用在 “c” 上面的,而是應用在 “≡” 以及相同等式所有其他的 “≡” 上面。雖然這樣非常難以閱讀,但是我保證盡量少用他們。接著讓我們回到 RSA:

證明者提供了下面的數字:

  • p,q:兩個隨機的私密素數
  • n := p q
  • d:1 < d < n – 1 的隨機數
  • e:d e ≡ 1 (mod (p-1)(q-1))

公鑰是 (e, n),私鑰是 d。素數 p 和 q 可以丟棄,但是不能暴露。

消息 m 通過下面的公式加密:

c = E(m) 通過下面的公式解密:

因為?,并且 m 的指數就是對 (p-1)(q-1) 這一組數取模,這樣我們就得到了??(譯者注可以由費馬小定理和中國剩余定理推出)。而且 RSA 的安全性是基于假設:n 不能被輕易有效的因式分解,d 不能通過 e 計算得到(如果我們知道 p 和 q 的話,就可以輕易得到我們想要的值)。

RSA 的一個牛逼的特性是同態乘法。通常來講,如果你可以交換兩個操作的順序而不影響計算結果,那么我們就說這兩個操作是同態的。在同態加密中,這就是你可以對加密數據進行計算的一個屬性。完全同態加密是存在的,但是現在還沒有應用到實際中,它能夠對任何基于加密數據的程序完成計算。在這里對于 RSA 來說,我們只談論 group multiplication。更準確的說就是:??,用文字描述就是:兩個加密信息的乘積等于兩個信息乘積的加密。

這個同態的特性已經有一些乘法的零知識證明了:證明者知道一些私密的數字 x 和 y,并計算出了它們的乘積,但是只給驗證者發送加密的版本:a = E(x), b = E(y) 以及 c = E(x y)。驗證者檢驗等式 (a b) % n ≡ c % n 是否成立,此時驗證者只知道加密版的乘積以及乘積是否被正確的計算,但是她不知道兩個乘數和真正的乘積。如果你用加法來替代乘法,那就是一個主要操作為添加余額的區塊鏈方向了。

交互式驗證

我們已經對零知識這個概念有了一定的了解了,現在讓我們著重看一下 zkSNARKs 的另一個主要的特性:簡明性(succinctness)。之后你會看到這個簡明性是 zkSNARKs 更牛逼的部分,因為零知識部分的實現就是因為這一特定編碼,而這個特定的編碼是一個有限形式的同態編碼。

SNARKs 是?succinct non-interactive arguments of knowledge?的縮寫。一般都通用設置之所以叫做交互式協議,是因為這里有一個證明者和一個驗證者,證明者想要通過交換信息的方式讓驗證者相信一個表達式(比如 f(x) = y)。一般來說,沒有證明者可以讓驗證者相信一個錯誤的表達式(可靠性),而且對于證明者來說一定存在一個確定的策略讓驗證者相信任何真實的表達式(完整性)。SNARKs 各個部分的的意義如下:

  • Succinct:比起真正需要計算的長度來說,我們發送的信息大小是很小的
  • Non-interactive:沒有或者只有很少很少的交互。對于 zkSNARKs 來說就是在證明者向驗證者發送一條信息之后的過程。此外,SNARKs 還常常擁有叫做『公共驗證者』的屬性,它的意思是在沒有再次交互的情況下任何人都可以驗證,這對于區塊鏈來說是至關重要的。
  • Arguments:驗證者只對計算能力有限的證明者有效。擁有足夠計算能力的證明者可以創造出關于錯誤表達式的(注意,只要擁有足夠的計算能力,任何公鑰加密系統都可以被破解)證明和參數。這也叫做『計算可靠性』,相對的還有『完美可靠性』。
  • of Knowledge:對于證明者來說在不知道一個叫做證據witness)(比如一個哈希函數的原象或者一個確定 Merkle-tree 節點的路徑)的情況下,構造出一組參數和證明是不可能的。

如果你添加了零知識的前綴,那么在交互中你就需要一個性質,即驗證者除了知道表達式的正確與否之外其他一無所知。尤其是驗證者不能知道?witness string?-- 稍后我們會詳細解釋這是什么。

先舉個例子,讓我們考慮下面的交易驗證計算:當且僅當??和??是賬戶 Merkle-trees(pre 和 post 狀態)的根哈希,s 和 r 是發送者和接收者賬戶,??和??是 Merkle-tree 的證明(當 v 從 s 的余額中轉移到 r 的余額的過程中,能夠證明在??中 s 的余額至少是 v 并且他們的哈希結果是??而不是?),這些條件都成立時,?成立。

如果我們知道所有輸入的話,驗證 f 的計算相對來說是比較容易的。因為我們可以將 f 轉換成一個 zkSNARK,這時只有??和??是公開的,??就是 witness string。零知識的性質現在使得驗證者能夠檢查證明者是否知道一些 witness,這些 witness 可以通過一個方式將根哈希從??轉成??,而這樣的轉換又不影響正常的交易,但是驗證者卻不知道到底是誰發送了多少錢給誰。

關于零知識的部分相對正式的定義(仍然缺乏一些細節)就是:存在一個模擬器,它可以生成一些設置字段,但是卻不知道私密的 witness,它還可以和驗證者交互 -- 但是外部的觀察者卻不能分辨出哪個與驗證者進行的交互,哪個是與證明者進行的交互。

NP 和 簡化的復雜性理論

為了了解 zkSNARKs 能用于哪些問題和計算,我們不得不基于復雜的理論定義一些說法。如果你不知道什么是 “witness” 的話,那么即使『讀』完零知識證明你也不會知道它是什么,并且你也不會了解到為什么 zkSNARKs 只適用于特定的多項式問題,如果真是這樣的話,那么你就可以跳過本節了。

P 和 NP

首先,我們限制函數只能輸出 0 和 1,并稱這樣的函數為問題(problems)。因為你可以單獨的查詢一個長長的結果的每一位(bit),所以這不是一個真正的限制,但是這樣可以讓定理變的簡單一點。現在我們想衡量解決一個給定的問題(計算函數)到底有多『難』。對于一個數學函數 f 的特定機器的實現 M,給定一個輸入 x,我們可以計算出這個函數 f 需要的步數 -- 這就叫做 x 在 M 上的執行時間,這里的『步數』其實不太重要。因為程序對于更大的輸入往往會需要更多的步數,而這個執行時間則是用輸入值的大小或者說長度(bit 的數量)來衡量。這就是例如『??算法』的來源 -- 這就是一個當輸入值大小為 n 時,至多需要??個步數的算法。這里的『程序』和『算法』廣義上是相同的。

執行時間至多為??的程序也叫做 “polynomial-time programs”(多項式時間問題)。

在復雜性理論中有兩個主要的類別,他們就是 P 問題和 NP 問題:

  • P 問題是具有多項式時間的一類問題

雖然 k 的指數對于一些問題來說確實非常大,但是實際上對于那些非人造的,k 不大于 4 的 P 問題仍然被認為是可以『解決的』的問題。要確認一筆比特幣的交易就是一個 P 問題,因為經過評估它需要一個多項式時間(并且只能輸出 0 和 1)。簡單的說就是,如果你只是計算一些值而不去『搜索』,那么這個問題就是 P 問題。但是如果你不得不搜索一些東西,那么你就會進入到另一個叫做 NP 問題的類別中。

NP 類問題

幾乎所有的 NP 類問題都是 zkSNARKs,今天在實際中使用的 zkSNARKs 在通常意義上講都屬于 NP 問題。而我們目前還不知道的是,有沒有不屬于 NP 問題的 zkSNARKs 存在。

所有的 NP 問題都有一個特定的結構,這個特定的結構來自于 NP 問題的定義:

  • NP 問題是 L(含有多項式時間的程序 V)的一類問題, 這個程序 V 可以在給定一個多項式尺度的叫做因子的 witness 的情況下驗證這個因子。更正式的說就是:
    當且僅當一些多項式尺度的字符串 w(被稱作?witness)滿足 V(x, w) = 1 時,L(x) = 1 成立。

讓我們來看一個 NP 問題的例子,比如說一個布爾函數可滿足性問題(SAT)。首先讓我們先來定義一下布爾函數:

  • 任何變量??都是一個布爾函數(我們也會使用其他的字母來設變量)
  • 如果 f 是一個布爾函數,那么 ?f 也是一個布爾函數(否命題)
  • 如果 f 和 g 都是布爾函數,那么 (f ∧ g) 和 (f ∨ g) 也都是布爾函數(∧ 是且, ∨ 是或)

字符串??也是一個布爾函數。

如果可以給變量賦一個真值,然后布爾函數判斷為 true(?true 就是 false,?false 就是 true,true ∧ false 是 false 等等一些普通的規則),我們就說這個布爾函數是可滿足的,可滿足性問題 SAT 就是所有可滿足函數的集合。

  • 當且僅當 f 是一個可滿足函數且不是 0 時,SAT(f) := 1 成立

上面的例子??就不是可滿足的,因此它不屬于 SAT。證明一個給定公式滿足定義并且同時確保它賦值的變量也是可滿足的就是一個可以在多項式時間內被解決的問題。

P = NP ?

如果你將 NP 問題定義為長度為 0 的 witness strings,那么你會發現這就是 P 問題。因此 每個 P 問題其實都是 NP 問題。在復雜性理論研究中有一個主要的任務就是發掘出這兩類問題的不同 -- 即一個不屬于 P 的 NP 問題。在這里似乎是很顯然的,但是如果你可以再一般情況下證明它,那么你可以獲得 1 百萬美元。額外說一句,如果你可以反向證明,即 P 和 NP 是等價的,也可以獲得那筆獎金。而數字貨幣領域有朝一日能夠證明的概率很大。我這么說的原因是,比起一個哈希函數的碰撞或者根據地址找到私鑰來說,找到一個工作難題解決辦法的證明顯然更容易一點。這些都是 NP 問題,因為你剛已經證明了 P = NP,那么對于這些 NP 問題來說就一定存在一個多項式時間的程序。但是本文就不討論了,雖然大部分研究者都認為 P 問題和 NP 問題并不是等價的。

NP 完全問題

讓我們再回到 SAT。這個看起來簡單的問題有個有趣的特性就是它并不僅是 NP 問題,還是 NP 完全問題。『完全』這個詞在這里和『圖靈完備』是一個意思。這意味著它是 NP 中最難的問題,但是更重要的是 NP 完全的定義——任何 NP 問題的輸入都可以用下面的方法轉換成一個同樣的 SAT 的輸入:

所有 NP 問題 L 都有一個在多項式時間可計算的『還原函數(reduction function)』f:

  • L(x) = SAT(f(x))

這樣的一個還原函數不能被看成一個編譯器:編譯器是可以將一些編程語言寫的源代碼等價的轉換成另一種編程語言的機器,也就是擁有語義行為的機器語言。因為 SAT 是 NP 完全的,所以這樣一個還原對于任何可能的 NP 問題都是存在的,比如給定一個合適的 block hash,驗證一筆比特幣交易是否合法。這里還可以將一筆交易轉換成一個布爾函數的還原函數,因此當且僅當這個交易是合法的時候這個布爾函數就是可滿足的。

還原示例

為了弄明白這樣一個還原的方法,讓我們先考慮評估多項式的問題。首先,讓我們定義一個由整數常量,變量,加法,減法,乘法和(正確匹配的)括號構成的多項式(類似于布爾函數)。現在讓我們考慮下面的問題:

  • 如果 f 是一個變量都來自于集合 {0, 1} 的多項式,并且其中包含一個零項,那么 PolyZero(f) := 1

現在我們就可以構建出一個從 SAT 到 PolyZero 的還原方法了,同時這也說明了 PolyZero 也是一個 NP 完全問題(驗證它是否屬于 NP 就當是留給你們的小練習啦)。

在一個布爾函數的結構要素上是可以定義一個還原函數 r 的。對于任何布爾函數 f,r(f) 的值擁有相同的變量個數,并且當且僅當??為 0 時??為 true,這里 true 是 1,false 是 0,并且 r(f) 只假設了來自集合 {0, 1} 的變量值 0 或者 1:

有些人可能會假設將 r((f ∧ g)) 定義為 r(f) + r(g),但是那樣的話多項式的結果就會超出集合 {0, 1} 了。

使用函數 r,((x ∧ y) ∨?x) 被轉換成了 (1 – (1 – (1 – x))(1 – (1 – y))(1 – (1 – x))。

注意,對于 r 來說,每一個替換規則都滿足了之前聲明的目的,因此 r 也正確的實現了還原:

  • 當且僅當 r(f) 含有集合 {0, 1} 中的一個 0 時,SAT(f) = PolyZero(r(f)) 或者說 f 是可滿足的

Witness preserving

從這個例子中你可以看出還原函數只定義了如何轉換輸入,但是當你仔細看的時候(或者閱讀完如何完成一個可用的還原證據之后)你就會知道如何將一個可用 witness 和 輸入一起轉換。在我們的例子中,我們只定義了如何將函數轉換為多項式,但是不知道如何將我們解釋的證據轉換成滿足賦值的 witness。這個 witness 在同一時間轉換對于交易來說不是必要的,但是通常都會包含。而這對于 zkSNARKs 來說是至關重要的,因為對于證明者來說他唯一的任務就是讓驗證者相信有這樣一個 witness 存在,并且還不會暴露任何有關 witness 的信息。

Quadratic Span Programs

在上一部分中,我們看到了 NP 問題的計算是如何被相互化簡的,尤其是那些 NP 完全問題,那些 NP 完全問題基本上又都再次形成了其他的 NP 問題——包括交易驗證問題。那么對我們來說找到一個對所有 NP 問題都通用的 zkSNARKs 就變的很容易了:我們只需要選擇適合的 NP 完全問題。所以如果我們想展示如何使用 zkSNARKs 來驗證交易的話,那么展示如何處理這個確定的 NP 完全問題就是一個有效的方法,并且比從理論上解釋更容易讓人接受。

接下來就是基于論文GGPR12(這里面鏈接的技術報告比原文的干貨更多)來談了,這篇論文的作者發現了一個叫做 Quadratic Span Programs(QSP)的問題,這個問題完全就是為 zkSNARKs 準備的。一個 Quadratic Span Program 是由一組多項式和尋找給定多項式倍數的線性組合任務構成。此外,輸入字符串的每個單獨的 bit 都限制了你能夠使用的多項式。詳細來說(通常來講 GSPs 限制不是那么嚴格,但是我們就是需要這種限制的版本,因為后面我們會用到)就是:

對于輸入長度為 n 的在域 F 上的 QSP 問題由下面這些部分構成:

  • 一組域 F 上的多項式?
  • 域 F 上的一個多項式 t(目標多項式)
  • 一個單射函數 f:{(i, j) | 1 ≤ i ≤ n, j ∈ {0, 1}} → {1, …, m}

這里的任務很粗糙,就是給多項式乘以一個因子并把它們加起來(也叫做『線性組合』)使得它們的總和是 t 的倍數。對于每一個二進制輸入字符串 u 來說,函數 f 限制了可以被使用的多項式,或者更嚴格的講就是它們必須是線性組合的因子。正式的表示就是:

一個輸入 u 會被 QSP?接受(或驗證)當且僅當來自域 F 的元組?滿足:

  • 如果 k = f(i, u[i]) 那么??(u[i] 是 u 的第 i 位)
  • 如果 k = f(i, 1 - u[i]) 那么?
  • 目標多項式 t 整除??,?

注意,在這里當 2n 小于 m 時,選擇元組 a 和 b 仍然是有很大的自由度的。這就意味著 QSP 只對特定大小的輸入是有價值的——這個問題可以通過使用非均勻復雜度來解決,非均勻復雜度這個話題今天我們不會深入的講解,我們只需要知道當輸入值很小時,我們的密碼學也能良好運轉。

做一個和布爾函數可滿足性的類比,你可以看到因子??作為被賦值的變量,或者說是 NP 問題的 witness。因為 QSP 是屬于 NP 的,那么所有的驗證者都必須(只要她知道因子)檢查多項式 t 是否能夠整除??,這也是一個多項式時間的問題。

這里我們不會討論如何將通用計算和線路問題簡化成 QSP 問題,因為這對于我們了解基本概念沒有任何幫助,我們只需要知道 QSP 是 NP 完全(或者說比一些非均勻分布的像 NP/poly 問題更完全)的就好了。實際上,這個簡化是一個『工程』部分——必須要使用一種很聰明的方法才能讓 QSP 問題盡可能的小并且有一些其他的優良特性。

關于 QSP 我們已知的一件事是如何更有效的驗證它們:這個驗證任務就是檢驗一個多項式能否整除另一個多項式。如果證明者可以提供一個滿足??的多項式 h,那么這個任務就被轉變成了檢驗一個多項式恒等式,換句話說就是檢驗?,其實就是檢驗某個特定的多項式是否是零多項式。雖然這看起來似乎很簡單,但是我們接下來要使用的多項式相當巨大(階數大概是原始電路控制級的 100 倍),以至于獲得兩個多項式的乘積并不是一件容易的事。

所以相比于真正的去計算??以及它們的乘積,驗證者只需要選擇一個私密的隨機點(這個點是 zCash 中 “toxic waste” 的一部分),然后對所有的 k 計算??和??,并通過它們以及??和??來驗證等式:??。所有這一系列的多項式加法,標量乘法和一個多項式乘積都可以被簡化成域上的乘法和加法。

只在一個單點而不是在路徑的所有點上驗證多項式恒等式會降低安全性,但是證明者唯一可以作弊的情況是當??不是零多項式時,即使證明者成功的獲得了多項式的一個零項,但是她也不知道 s,并且比起 s(域中元素的數量)可能的值,0 的數量是很少的,所以實際中只在一個單點驗證也是非常安全的。

zkSNARK 詳解

現在讓我們來詳細的描述一下 QSP 上的 zkSNARK。它在開始設置階段會執行每一個單獨的 QSP。在 zCash 中,交易驗證者的線路是固定的,因此 QSP 的多項式也是固定的,這個 QSP 在設置階段只允許被執行一次,然后在所有的只有輸入 u 不同的交易上復用。這個開始的設置會生成一個公共參考串(common reference string,CRS),驗證者選擇一個隨機且私密的域元素,并在這個點加密多項式的值。驗證者使用一些特定的加密方法 E 并在 CRS 中把??和??公布出來。CRS 同時還包含一些可以讓驗證更有效率以及添加零知識屬性的值。這里使用的加密方法 E 有一個明確的同構屬性,這個屬性可以讓證明者在不知道??的情況下計算出??。

如何使用零知識來簡單估計一個多項式

首先讓我們先來看一種簡單的情況,即一個多項式在私密點上的加密估值,而不是完整的 QSP 問題。

為此,我們選擇一個群(這里通常會使用橢圓曲線)和一個生成器 g。對于群中的元素 g,如果存在一個數字 n(群的順序)使得列表??包含群中的所有元素,那么我們就稱 g 為『生成器』。加密方法很簡單:??。現在驗證者選擇一個私密域元素 s 并把它作為 CRS 的一部分公布出來

  • ?—— d 是所有多項式的最高階

之后,s 就可以(確切的說是一定要)被忘記了。這就是 zCash 中說的『有毒廢料(toxic waste)』,因為如果有人恢復了有毒廢料和之后挑選的一些私密值,那么通過找到多項式中的零項,他就可以隨意的偽造證據了。

在不知道 s 的情況下,證明者可以使用這些值對任意多項式 f 計算 E(f(s)):假設我們的多項式是??要計算 E(f(s)) 的話,我們可以得到??,這些值我們都可以從公開的 CRS 中獲取,而不需要知道確定的 s。

這里唯一的問題是當 s 被銷毀之后,驗證者無法驗證證明者是否正確的計算出了這個多項式。因此我們還需要選擇另一個私密的域元素??并公開下面的『轉移』值:

設置階段之后??會隨著 s 一起被銷毀掉,驗證者和證明者都不知道這個值。但是使用這些加密的值,證明者可以輕易的計算出 E(α f(s)),用上面的例子就是:??。所以證明者只要公布 A := E(f(s)) 和 B := E(α f(s))),那么驗證者就可以驗證這些值是否匹配了。要驗證是否匹配就要用到我們的另一個主要的手法『配對函數』e 了。橢圓曲線和配對函數一定要一起選擇,那么 x 和 y 就會滿足下面的式子:

使用這個配對函數,驗證者就可以去檢驗??了——注意一點, 驗證者是知道?的,因為它是 CRS 中?的一部分。為了明確這個方法是可用的,且證明者沒有作弊,讓我們來看下面的等式:

然而,還有一個更重要的問題是證明者能否提供滿足??而不是??和??的 A 和 B。這個問題的答案是『我們希望他不能』。嚴格地說,我們稱之為『d 次方指數知識假設』,而且我們也不知道一個想作弊的證明者能不能做到這一點。這個假設同時也是其他用來證明公鑰加密方案安全性的類似的假設的拓展,而這些假設似乎也不能確認他們到底是不是正確的。

實際上,上面的協議并不是真的要讓驗證者檢驗證明者提供的多項式??,驗證者其實只需要在點 s 上驗證『幾個』多項式就可以了。QSP 問題的 zkSNARK 還包含另外一個值,這個值可以讓驗證者確認證明者是否真的求出了正確的多項式。

這里的這個示例告訴我們驗證者并不需要求出完整的多項式來證明這一點,僅僅使用配對函數就可以了。下一步我們就要添加零知識的部分了,這樣驗證者就不能構建任何關于 f(s) 值了,甚至連 E(f(s)) 這種加密信息也不行。

為此,證明者會挑選一個隨機的??然后發送??和??,而不是??和??。如果我們假設這個加密算法是不能被破解的,那么零知識的屬性就很明顯了。現在我們需要驗證兩個事情:1. 證明者確實可以計算出這些值。2. 驗證者的結果依然為 true。

對于第一件事來說,注意:??,同樣的,?。

第二件事的話,因為驗證者唯一要做的事情就是驗證她接收到的 A 和 B 滿足基于某個 a 的等式:A = E(a) 以及 B = E(α a)。這里的 a 顯然滿足 a = δ + f(s),實際上就是 a = f(s)。

好的,現在我們總算知道了一點關于在驗證者不知道那個值的情況下,證明者是如何在一個加密的私密點上面計算出多項式加密值的。接下來讓我們把這些應用到 QSP 問題中吧。

QSP 問題的 SNARK

還記得嗎,在 QSP 問題中我們有一些多項式??,目標多項式 t(最高階為 d)以及一個二進制的輸入字符串 u。證明者會找到??(這些值都取決于 u)和多項式 h:

在上一節中我們已經解釋了 CRS 是如何生成的。現在我們選擇一個私密數字 s 和??并把它們公布出來:

因為我們沒有單個的多項式,而對于當前問題來說這一列多項式是固定的,所以我們也需要馬上把推出的多項式公布出來:

我們還需要一個之后要用的的私密數字??(它們會被用來驗那些多項式是推算出來的,而不是任意的多項式),然后把它們公布出來:

這就是完整的 CRS。在實際的實現過程中,CRS 中的一些元素并不是必須的,但是那樣會讓我們的表達式變得很復雜。

現在證明者還需要做什么呢?她使用上面解釋過的還原函數來找到多項式 h 和??這些值。這里有一點非常重要,就是要使用一個 witness-preserving reduction(可以看上面的解釋),因為只有到那個時候??才能和 reduction 一起被計算出來,否則將會非常非常困難。為了描述證明者發送給驗證者的證明,我們不得不再看一下 QSP 的定義。

這里有一個限制??這些值的單射函數??。因為相對來說 m 是比較大的,所以對于任何輸入,函數 f 的輸出的都不會包含這些數字。而這些下標沒有被限制,所以我們就把他們叫,然后基于??中的所有下標 k 定義??。對于等式?來說,我們的證明將由下面的式子構成:

最后一個等式用來檢驗是否使用了正確的多項式(這一部分還沒有講到,不過其他的例子會說到它)。要注意的是,我們所有的加密值,證明者只需要知道 CRS 就可以全部推算出來。

而驗證者現在要做的還有這些:

因為 k 不是一個 "free" 的下標,所以??的值可以通過輸入 u(驗證者也知道這個 u 的值,其實這就是要被校驗的值)直接計算得出,驗證者還可以通過 v 計算出總和:

  • ?這里的 k 包含所有的『不在』??中的下標

有了上面的式子,驗證者就可以通過配對函數 e(別害怕...(譯者注:講道理,還是有點怕...))來確認下面的等式了:

  • 要了解這里關鍵概念的知識,你必須要知道配對函數是允許我們在加密信息上進行一些有限的計算的:首先我們可以使用任意多次的加法,但是不能使用乘法。其次這個加法是來自加密方法本身的加同態,乘法則是通過配對函數的兩個參數來實現的。所以??基本上就是在加密空間中用 1 乘以 W’,然后和??乘以 W 做比較。回想一下上面的定義你就會發現 W 和 W’ 應該就是 E(w(s)) 和 E(α w(s))(如果證明者提供的是正確的證明)。

    如果你還記得上面關于如何在一個私密點上推算多項式的話,這三個首先要檢查的點基本上就可以確認證明者確實知道一些用 CRS 中的部分構造的多項式。第二個條目往往是用來確保證明者使用的是正確的多項式 v 和 w,而不是任意的多項式。而它背后的邏輯則是除了從??和?中獲取精確的值之外,證明者沒辦法計算出加密組合。因為??在 CRS 中是隔離的,并不是 CRS 中的一部分,只有在和多項式??組合起來的時候才知道??的值。而將它們『混合』起來的唯一方法則是通過同樣的加密 γ。

    假設證明者提供了一個正確的證明,讓我們檢驗一下等式是否滿足。左邊和右邊的部分分別是:

    第三個條目本質上就是檢驗了??,這也是 QSP 問題主要的條件。有一個需要注意的是,要將加密值的乘法轉換成非加密值的加法,因為。

    添加零知識

    就像我在開頭說的,零知識證明(zkSNARKS)最牛逼的特性其實不是零知識本身,而是一種簡潔性。從現在開始我們將會看到如何添加這個零知識的屬性,下面的一節將會著重介紹簡潔性。零知識的思路是這樣的,就是證明者現在通過一個隨機私密的值來進行『移位』,然后再在其他的等式中『移位回來』以取得平衡。證明者會選擇??,然后在證明中執行下面的替換:

    • 用??來替換?
    • 用??來替換?

    通過這兩個替換,?和 W 這兩個包含 witness 因子編碼的值基本上就變成了無法區別的隨機值,因此要從 witness 中提取出來也不可能。大部分的等式檢驗對修改都是『免疫』的,而我們要確保正確的值就是 H 或者說是 h(s)。那我們就要確保:

    • ?,或者說是

    這兩個等式成立。修改之后,我們得到:

    然后將結果展開,我們就可以用 h(s) 來替換了:

    在輸入和 Witness 大小之間取一個折中的值

    就像你在上面這些小節中看到的一樣,我們的證明由一個群(就是一個橢圓曲線)的 7 個元素組成。而且驗證者的工作就是檢驗一些配對函數的等式是否成立以及計算??這樣一個跟隨輸入大小的線性任務。最主要的是,在這個驗證過程中,既不需要 witness 字符串的大小,又不需要計算工作量來驗證 QSP(沒有 SNARKs)。這就意味著 SNARKs 的校驗是個很復雜的問題,而簡單的問題往往都是一樣的。造成這個結果的主要原因則是,因為我們只在一個單獨的點上面檢驗了多項式的一致性,而不是全部的點。多項式可以變的非常非常復雜,但是一個點始終是一個點。而唯一能影響到驗證結果的參數就是安全性的等級(比如群的大小)和輸入值的最大尺寸。

    減小第二個參數是可行的,將輸入值的一部分移動到 witness 中:我們不驗證函數 f(u, w),u 是輸入,w 是 witness,而是做一次 hash,然后驗證:

    這樣就意味著我們可以用一個 hash 來代表輸入 h(u) 了(這樣就會變的更短),除了驗證 f(x, w),我們還需要驗證某個值 x 的 hash 等于 H(u)(這樣的話,那 x 極有可能就等于 u 了)。這樣就將原始輸入 u 移動到 witness 字符串中了,這樣雖然會增大 witness 的大小,但是輸入值的大小就減小為一個常數了。

    這簡直太厲害了,因為這意味著我們可以在常數時間內完成對任何復雜表達式的檢驗。

    和 Ethereum 的關系

    因為驗證計算是 Ethereum 區塊鏈的核心,所以 zkSNARKs 和 Ethereum 關系緊密相連。有了 zkSNARKs,我們不但可以完成任何人都可證實的私密的計算,而且還可以高效的完成。

    雖然 Ethereum 使用了一個圖靈完備的虛擬機,但是當前在 Ethereum 上實現一個 zkSNARK 還是不可能的。從概念上講,驗證者的任務似乎很簡單,但是配對函數是真的很難計算,而且在單個區塊中還會消耗更多的 gas。橢圓曲線的乘法相對來講已經非常復雜了,而配對函數將這個復雜度又增加了一個級別。

    像 zCash 這種現存的 zkSNARK 系統對每一個任務都使用的是同樣的問題,circuit 計算。在 zCash 中,就是交易驗證。在 Ethereum 上,zkSNARKs 將不會只單單做一個計算問題,而是讓所有的人都能夠在不發布一個新的區塊鏈的情況下構建他們自己的 zkSNARK 系統。每一個添加到 Ethereum 上的 zkSNARK 系統都需要進行一個新的私密的可信任的準備階段(一些可以復用,一些不能),比如生成一個新的 CRS。像為一個『通用虛擬機』添加 zkSNARK 系統將會變的可能。這樣的話當你使用一個新的實例時,你就不需要重新設置了,因為你將不再需要為 Ethereum 上新的智能合約發布一個新的區塊鏈。

    將 zkSNARKs 結合到 Ethereum 上

    在 Ethereum 上啟用 zkSNARKs 有很多種方式。所有的方式都可以為配對函數和橢圓曲線操作(其他必要的操作都很簡單)減小真實的損耗,因此我們也要減小這些操作消耗的 gas。

  • 提升(確保)EVM 的性能
  • 只在確定的配對函數和橢圓曲線乘法上提升 EVM 的性能
  • 第一項在長期顯然會得到很好的回報,但是實現起來難度比較大。我們現在已經在對 EVM 添加一些新的功能和限制了,例如更好的支持及時編譯以及在現存實現下最小改動的解釋器的實現。當然也不排除直接用 eWASM 來替換 EVM。

    第二項則可以通過強制所有的 Ethereum 客戶端執行一個確定的配對函數和確定的橢圓曲線乘法的叫做預編譯合約的東西來實現。這樣做的好處就是實現起來既簡單又快速。而缺點呢則是這樣做我們就會固定在一個確定的的配對函數和一個確定的橢圓曲線上。所有 Ethereum 上新的客戶端都不得不再實現一遍這個預編譯合約。所有,如果有什么新的進展,或者有人可以找到更好的 zkSNARKs 的方法,更好的配對函數,更好的橢圓曲線,又或者發現了橢圓曲線,配對函數和 zkSNARK 的一些缺點,那么我們就會添加到新的預編譯合約中。

    原文地址:?https://zhuanlan.zhihu.com/p/31780893

    總結

    以上是生活随笔為你收集整理的详解零知识证明的四大基础技术,如何与以太坊发生反应的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。