發表文章

目前顯示的是 4月, 2019的文章

深入瞭解 zk-SNARKs

這篇文章主要是更深入介紹zk-SNARKs,不可避免的會有”一些“數學出現,不過會盡量著重在數學式背後的意義,而不是深入探討數學公式,如果不知道什麼是zk-SNARKS的,可以先參考 這篇 跟 這篇 。 一開始的假設 1. Alice有一個多項式P(x) 2. Bob選一個點 s 給Alice 3. Alice回傳P(s)給Bob 希望能達到 1. Alice不知道點 s,Bob不知道多項式P(x)。(Blindness) 2. 但Alice可傳回P(s)給Bob,並且Bob可以驗證P(s)。(verifiable) 也就是雙方都不知道對方的資訊,卻可以共同得到一個可被驗證的結果 上面就是基本的假設。然後,先定義一些基本的數學式 上述所提的多項式定義為: $$P(x) = C_0+C_1x+C_2x^2 + ... + C_nx^n$$ 首先,先介紹Homomorphic Hiding( 同態隱藏 ) [1] ,藉由 同態隱藏 可以達到 隱藏資訊 的目的。我們從數學定義來看他有什麼特質。首先$E(x)$的定義為$E(x) = g^x$ ,然後 $E(x+y) = E(x)*E(y)$ HH支援線性相加,所以下列式子成立 $$E(ax+by) = g^{ax+by} = g^{ax}*g^{by} =E(x)^a + E(y)^b$$ * HH的假設:知道$E(x)$,是無法回推x的值 若我們對$P(x)$作 同態隱藏 , 可以得出 $$E(P(x)) = E( C_0+C_1x+C_2x^2 + ... + C_d^d) = E(1)^{C_0} * E(s)^{C_1}*E(s^2)^{C_2}...E(s^d)^{C_d}$$ 也就是Bob只需要給$ E(1), E(s), E(s^2),...E(s^d)$,而不用給s($E(s)$無法反推出s),Alice就可以得出E(P(s))的值。藉此可以達成第一點的blindness,接下來就是要如何達成verifiable,因為Alice有可能給一個假的值,非P(x)上的點,所以要確保Alice會乖乖地照規矩來。接下來就要介紹如何保證Alice會送出正確的結果,並且Bob可以驗證。 Computation --> Arithmetic Circuit --&