《零知識證實 – zkSNARK 入門》— PPIO Code Talks 第二期

PPIO Code Talks 致力於打造一個以上海爲中心,輻射全球的高質量區塊鏈學習,分享,交友平臺。算法

7月27日,PPIO 舉辦了第二期 Code Talks 閉門技術交流分享會。在上一期的活動中,咱們分享了兩個前沿技術主題《Tindermint 介紹及實戰分析》和《Libra 介紹及對 PPIO 的啓發》。安全

這一期是咱們 Code Talks 的第二期活動,咱們有幸邀請到 Trapdoor CEO Star.LI 老師和 技術大咖王伯洋老師,兩位重量級嘉賓來作主題分享。本期分享的主題是:一、《零知識證實–zkSNARK入門》, 二、《數字貨幣交易所架構初探》。兩位老師分享的內容可謂乾貨滿滿,在本期文章中,咱們先向你們介紹由Trapdoor CEO Star.LI 老師帶來的《零知識證實–zkSNARK入門》主題分享和現場交流情。架構

在介紹零知識證實的技術細節以前,咱們先來回顧一下零知識證實的歷史
1985年 Zero-Knowledge Proofs [GMR85]
1992 年 Succinct ZK[K92]
2013 年 Pinocchio (PGHR13)
2016 年 Groth16
2017 年 Bulletproofs (BBBPWM17)
2018 年 zk-STARKs (BBHR18)
零知識證實,最先能夠追溯到1985年的 Zero-Knowledge Proofs [GMR85] 創始論文。隨後1992 年提出了精簡的 ZK[K92] 證實。到了2013 年,零知識證實已經能夠在現實生活中使用,可是速度較慢。2016 年的時候,Groth 提出了 Groth16算法,證實計算量被大幅度減小,今後,零知識證實開始逐步被真正的商用化落地。隨後推出的 Bulletproofs 和 zk-STARKs,與 Groth16 被認爲是目前主流的三個證實協議。函數

什麼是「零知識證實」?學習

咱們從事區塊鏈開發的朋友們常常會聽到「零知識證實」這樣一個概念。那麼究竟什麼是零知識證實?如何去理解零知識證實?若是去運用它?
咱們先經過一個「阿里巴巴零知識證實」小故事,來通俗解釋一下什麼是零知識證實。
阿里巴巴被強盜抓住,爲了保命,他須要向強盜證實本身擁有打開石門的密碼,同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開本身一箭之地,距離足夠遠讓強盜沒法聽到口令,同時又足夠近讓阿里巴巴沒法在強盜的弓箭下逃生。阿里巴巴就在這個距離下向強盜展現了石門的打開和關閉。
這個整個過程就是零知識證實,證實者可以在不向驗證者提供任何有用信息(石門的口令)的狀況下,使驗證者相信某個論斷(阿里巴巴知道打開石門的方法)是正確的。區塊鏈

如今咱們來詳細解釋一下,零知識證實(zh-SNARK)是 zero-knowledge Succint Non-interactive ARguments of Knowledge 的縮寫。其中:測試

Zero Knowledge:證實者不泄漏欲證實的隱私信息ui

Succinct:證實的數據量比較小code

Non-interactive:沒有或者只有不多交互。圖片

ARguments:計算可靠性下的證實。驗證者只對計算能力有限的證實者有效。擁有足夠計算能力的證實者能夠僞造證實。這也叫「計算可靠性"(相對的還有」完美可靠性")。

of Knowledge:對於證實者來講在不知道證據(Witness,好比一個哈希函數的輸入或者一個肯定 Merkle-tree 節點的路徑)的狀況下,構造出一組參數和證實是不可能的。

「零知識證實」是如何工做的?

若是要使用 zk-SNARK 零知識證實,就要首先將要證實的東西造成一個計算,並用計算電路表達出來,最後生成 QAP。零知識證實,最重要的一個邏輯就是 QAP。

零知識證實的工做流程主要分爲4步:
首先將欲證實的計算性問題,轉換成門電路 Circuit

而後將門電路 Circuit 轉換成 R1CS

再將 R1CS 轉變成 QAP

最後,基於 QAP 實現 zkSNARK 的算法

前面三步能夠預先一次性完成,真正的證實過程主要是在第4步。

什麼是QAP?

QAP 是 Quadratic Arithmetic Program 的縮寫。在理解 QAP 以前,咱們先來了解一下什麼是 P 問題。

P 問題,也就是咱們一般說的 在多項式時間內可解的問題。而與之相對的是 NP 問題。
NP 問題,也就是多項式時間內不可解,可是給定一個解,能夠在多項式時間內驗證這個解是否正確。
NPC 問題,也就是 NP 問題的核心,任何 NP 問題均可以歸爲到一個 NPC 問題。若是某個 NP 問題的 NPC 問題解決了,那麼也就意味着原 NP 問題也解決了。
而咱們今天談的 QAP 問題,實際上是 NP 問題。也是說 QAP問題能夠在多項式時間內驗證一個解是否正確,但在一個有限的時間內,使用有限的資源是很難在多項式時間內推出一個正確的解的。

如何驗證一個 QAP 問題的解?
QAP 問題涉及到三組多項式:
[v0(x) , v1(x), v2(x), … , vm(x) ]
[w0(x) , w1(x), w2(x), … , wm(x) ]
[y0(x) , y1(x), y2(x), … , ym(x) ]
和一個目標多項式
t(x)=(x-1)(x-2)...(x-d),其中 d 爲電路門的個數
若是給定證據
u = [a1, a2, ... , am]
可以使得多項式

(v0(x) + a1v1(x) + a2v2(x) +...+amvm(x))·(w0(x) + a1w1(x) + a2w2(x) +...+amwm(x)) - (w0(x) + a1y1(x) + a2y2(x) +...+amym(x))

可以被 t(x) 整除,則 u 是 QAP 問題的一個解

那麼如何將一個普通的計算性問題轉變成 QAP 問題呢?
首先,咱們將計算性問題 「拍平(Flattening)」,使之變成一個個電路,例如 x3 + x + 5,咱們能夠將其拍平成 4 個電路
sym1 = x * x
y = sym1 * x
sym2 = y + x
out = sym2 + 5
其中 sym1, sym2 以及 y,是整個計算過程當中用的臨時變量,而 out 則爲計算過程的最終輸出結果。

接着,咱們將電路轉換成 R1CS 形式。
咱們先將全部電路中出現的變量放到一個向量 s 裏,而且再加上一個常數 one,也就是 1。
s = [one, x, out, sym1, y, sym2]
緊接着針對每一個門咱們開始變換。
例如 針對門 sym1 = x x,咱們能夠將其當作是 x x - sym1 = 0

其中:
x = [one, x, out, sym1, y, sym2] · [0, 1, 0, 0, 0, 0] = s · [0, 1, 0, 0, 0, 0]
sym1 = [one, x, out, sym1, y, sym2] · [0, 1, 0, 0, 0, 0] = s · [0, 0, 0, 1, 0, 0]
那 sym1 = x * x,咱們就能夠表示成
(s · [0, 1, 0, 0, 0, 0]) * (s · [0, 1, 0, 0, 0, 0]) - s · [0, 0, 0, 1, 0, 0] = 0 (I)
相似的,咱們能夠將 其餘三個 門都表示成這種形式,他們分別是:
y = sym1 * x
sym2 = y + x
out = sym2 + 5
(s · [0, 0, 0, 1, 0, 0]) * (s · [0, 1, 0, 0, 0, 0]) - s · [0, 0, 0, 0, 1, 0] = 0 (II)
(s · [0, 1, 0, 0, 1, 0]) * (s · [1, 0, 0, 0, 0, 0]) - s · [0, 0, 0, 0, 0, 1] = 0 (III)
(s · [5, 0, 0, 0, 0, 1]) * (s · [1, 0, 0, 0, 0, 0]) - s · [0, 0, 1, 0, 0, 0] = 0 (IV)
咱們把上述 (I)、(II)、(III)、(IV)四個式子中的 三個個向量分別用 A,B,C來表示

咱們能夠看到 A,B,C 的向量組的值,只和計算問題相關,而與問題的解無關。而此時 A、B、C向量組就構成了 R1CS。

更進一步的,咱們把門電路編上號,第一個門編號爲1,第二個門編號爲2,依次類推。而且把向量組 A,當作是一個向量函數 A(x) = [A0(x), A1(x), A2(x), A3(x), A4(x), A5(x)],其中 x 第門的編號。
那麼,A0(x) 就至關於 是一個經過 (1,0),(2,0),(3,0),(4,0)這四個點的一個3次多項式。
如何獲得這個多項式呢?答案是能夠採用拉格朗日插值法。這樣咱們就能夠求出 A0(x)
相似的,咱們能夠求出 A1(x), A2(x),..., B0(x), B1(x), B2(x),..., C0(x), C1(x), C2(x),...
這樣咱們就獲得了關於x多項式的 A、B、C 向量
A(x) = [A0(x), A1(x), A2(x), A3(x), A4(x), A5(x)]
B(x) = [B0(x), B1(x), B2(x), B3(x), B4(x), B5(x)]
C(x) = [C0(x), C1(x), C2(x), C3(x), C4(x), C5(x)]
很顯然若是 P(x) = (s · A(x))*(s · B(x)) - s · C(x) 這個多項式在 x=1,2,3,4時都爲0,則意味着原4個門電路都成立,也就等價於證實了 s 是原問題的解。
若是 P(x) = (s · A(x))*(s · B(x)) - s · C(x) 在 x=1,2,3,4時都爲0,等價於 P(x) 能夠被 (x-1)(x-2)(x-3)(x-4)整除。
所以,證實者只須要證實本身擁有某 s,使得 P(x) 被 (x-1)(x-2)(x-3)(x-4)整除便可。
實際證實過程當中,並不須要測試全部的 x 點,而是隨機抽查一個點。

什麼是 t(x)?
其實前面已經提到過了
t(x) = (x-1)(x-2)...(x-d),其中 d 是門電路的個數

Groth 大牛,在2016年提出了 Groth16 算法。該算法大大縮小了證實的數據量,而且也大大提升了驗證證實的速度。從 PPT 中,咱們能夠看出驗證過程只須要驗證一個等式就能夠了,因此驗證特別快。

Groth16 中,證實依然須要提供三個值:A、B、C。但其實 Groth 已經從數學上證實了,最少能夠只要兩個值就能夠做爲證實。但因爲計算量巨大,因此相比而言,三個值比較有實用價值。
具體的證實過程,這裏就不展開了,具體能夠閱讀 「星想法」的公衆號文章:《零知識證實 - Groth16算法介紹》
圖片描述
Groth16 算法中涉及到了不少密碼學的知識,包括:橢圓曲線、同態隱藏、雙線性映射等。
最後,爲何零知識證實能夠作到零交互(Non-interactive)呢?
其實原理就是利用 CRS(Common Reference String)。CRS 其實就把挑戰過程當中所要生成的隨機數和挑戰數,都預先生成好,而後基於這些隨機數和挑戰數生成他們對應的在證實和驗證過程當中所需用到的各類同態隱藏。
以後,就把這些隨機數和挑戰數銷燬。這些隨機數和挑戰數 被稱爲 toxic waste。之因此把他們稱爲 toxic waste,是由於若是他們沒有被銷燬的話,就能夠僞造證實了。

在 Zcash 項目中,你們爲了安全的生成這些隨機數和挑戰數,使用了 MPC 技術。這樣多方一塊兒來生成 這些 toxic waste,只要不是全部人合謀,那麼沒有人能恢復出 toxic waste。從而保證了安全性。
看完這一期的分享,你是否對 」零知識證實–zkSNARK」 有了全面的瞭解呢?若是您意猶未盡,想要了解更多的零知識證實的相關知識,能夠閱讀李星老師公衆號 「星想法」 ,有更多的延展內容能夠學習。

同時咱們將在8月31日(週六)舉辦第三期 PPIO Code Talks 活動,這次活動咱們更是邀請到了神祕重量級嘉賓,來分享關於區塊鏈中密碼學應用和聯盟鏈技術與商業落地的相關問題。

若是您也是區塊鏈從業者,對區塊鏈技術有本身獨特的心得,或者你有區塊鏈相關技術乾貨但願與志同道合的技術愛好者分享,歡迎報名參加咱們第三期 PPIO Code Talks!

後臺回覆「報名表」便可收到報名連接。爲了保證 Code Talks 社區及技術沙龍的質量,提升參加者的參與體驗,咱們將對報名者進行項目背景信息和行業技術實力兩方面的甄選。對核心技術開發人員,區塊鏈從業者咱們會發出最誠摯的邀請,並會有專人聯繫告知後續的參會細則。咱們在 Code Talks 等待實力滿分的你,一塊兒共建區塊鏈技術社區,碰撞出技術討論的火花!下一期文章,咱們將會繼續報道技術大咖王伯洋老師的分享《數字貨幣交易所架構初探》,關注 PPIO 公衆號,精彩正在上演。

相關文章
相關標籤/搜索