區塊鏈100講:新型零知識證實,背後的「隱身」大法是什麼?

image

如今不少人都據說過ZK-SNARKs協議,這是零知識證實技術的通用性說法,使用它的案例從可驗證的計算到私人保護的數字貨幣。也許你不知道,ZK-SNARKs協議有更新的版本,ZK-STARKs。其中改變的字母T表明的是「透明」,ZK-STARKs解決ZK-SNARKs的其中一個弱勢,它依賴於一種「可信任的配置」。並且ZK-STARKs也有更加簡單的加密假設,從而避免橢圓曲線,配對以及指數假設的知識,而是僅僅依賴於哈希和信息的理論;這也就意味着他們對於量子計算機的攻擊來講,是安全的。算法

可是,這也會有代價:證實的存儲大小也從288字節增長到幾百千兆字節。有時候這個代價並不值得,可是有時候,特別是在討論公鏈應用的時候,須要的最小信任很是高,事情就極可能這樣。而且若是橢圓曲線打破或者量子計算機真地出現,這事情就確定會發生。安全

因此這種零知識證實是如何工做呢?首先,讓咱們來看看通用的ZKP協議是作什麼的。假設你如今有一個公開函數f,一個私密的輸入x以及一個公開的輸出y。你想要證實你知道一個x,從而獲得f(x) = y,而不用泄露x是什麼。而且,爲了保證這個協議足夠簡單,你想要它的驗證比計算f自己還要快。函數

image

讓咱們來舉個例子:工具

f 是一個須要在普通計算機上運行2周的計算,可是在數據中心只須要2小時。你給數據中心發送了這個計算(也就是說,運行f的代碼),而後數據中心就會運行,而且經過證實反饋了答案y。你在幾毫秒以內,就驗證了這個證實,而且相信y其實就是答案。區塊鏈

你有一個加密的交易,表格中的X1是我以前的餘額。X2是你以前的餘額。X3是我新的餘額。X4是你新的餘額。你想要建立一個證實,其中這個交易是有效的(特別指出,以前和如今的餘額都是正的,並且我餘額的減小抵消了你餘額的增長)。x能夠是祕鑰對,而且f能夠是一個函數,其中包含了內置公開輸入的交易,並且做爲輸入祕鑰,解密了交易,完成了檢驗,若是經過就返回1,若是失敗就返回0。y 固然會是1。編碼

你有個相似以太坊的區塊鏈,並且你下載了最近的區塊。你想要一個證實,表示這個區塊是有效的,並且這個區塊是在鏈的頂端,其中鏈上任何區塊都是有效的。你想讓一個現存的全節點來提供這樣的驗證。x是整個區塊鏈,f是區塊處理的函數,驗證有效性而且輸出最後區塊的哈希,並且y就是你以前下載區塊的哈希。加密

因此這些問題的困難點在哪呢?就像它表現出來的,須要很容易爲零知識證實(也就是,隱私性)提出保證;如今有不少種方法來將任何計算轉換爲例如三色圖表問題的狀況,其中圖表的三種顏色都對應原始問題的解決方案,而後使用傳統的零知識證實協議來證實,你即便不揭露它的信息,也能夠得到有效的圖表顏色。設計

更困難的地方在於提供簡潔性。直觀地來講,證實關於計算簡潔性是困難的,由於計算是難以置信地脆弱。若是你有個很長很複雜的計算,那麼你須要有能力在計算過程當中的任何地方,從0跳到1,而後再不少狀況下,甚至很小的失誤都會致使計算結果徹底不一樣。所以,很難知道你如何才能作出例如對計算過程地隨機取樣,才能保證正確性。由於,很容易就會錯過「很小部分的計算」。可是,經過一些厲害的數學方法,你就能夠作到。開發

總體的感受是,和這些聯合在一塊兒的協議,都在使用糾偏編碼的數學方式,這種方式一般用來讓數據能夠容錯。若是你有項目數據,那麼你能夠將這些數據做爲行代碼,而後你能夠在這行中選出四個點。其中任何兩個點都足夠來從新構造這條線,所以也給你另外兩個點。而且,若是你甚至對數據進行了很小的改變,那麼它至少保證了你四個點中的三個。你也能夠將數據編碼成1,000,000維度的多項式,而且從中選出2,000,000個點;這些點中的任意1,000,001個都會得到初始數據,所以其餘點,以及數據的任何偏離都會至少改變1,000,000個點。這裏的算法將會這樣利用多項式,從而使得偏差放大。get

image

原始數據更改1個點,對於多項式都會有很大的改變

簡單舉例

假設你想要證實,你有個多項目P,從而對於x從1到100萬,P(x)是0 <= P(x) <= 9之間的整數。這就是「範圍檢查」的簡單舉例;也許你會假設這類檢查能夠用來進行驗證,例如在進行轉帳後,帳戶餘額仍然是正數。若是1 <= P(x) <= 9成立,那麼這多是檢查這些值造成正確的數獨解決方案的一部分。

「傳統」的方式是證實這會顯示全部1,000,000個點,而且經過檢查這些數值來驗證。可是,咱們想要看到是否咱們可以作出證據,能夠在少於1,000,000個步驟的時候就被驗證。簡單隨機檢查P的估值不會這樣作;總會有欺詐者出現,來證實P是知足999,999個位置,可是不能知足最後一個,並且隨機取樣就幾個數字,一般老是會錯過那個。那麼咱們能夠怎麼作呢?

image

讓咱們從數學方式來轉化這個問題。假設C(x)是多項式檢驗;若是0 <= x <= 9,那麼C(x) = 0,不然,C(x)就是非零數字。有一種很簡單的方法,就能夠構建C(x):x * (x-1) * (x-2) * … * (x-9)(咱們會假設,全部咱們的多項式和其餘數字都會使用常數,全部咱們不須要擔憂之間的數字)。

image

如今,問題變成了:證實你知道P,而後對於全部的x從1到1,000,000,C(P(x)) = 0。讓Z(x) = (x-1) * (x-2) * … (x-1000000)。很基本的數學事實是,對於x從1到1,000,000,任何等於零的多項式都是Z(x)的乘積。所以,問題再次轉變成了:證實你知道P和D,而後對於全部的x,C(P(x)) = Z(x) * D(x)(須要注意到,若是你知道一個合適的C(P(x)),那麼用Z(x)除以計算D(x)不是太困難;你可使用長多項式除法或者基於FFT算法來進行更快地運算)。如今,咱們將最初的問題轉換成了數學問題,而且看起來能夠順利解決。

那麼如何證實這個問題呢?咱們能夠假設,證實過程是證實者和驗證者之間的三步溝通:證實者發出了一些信息,而後驗證者發出一些需求,以後證實者發出更多的信息。首先,證實者認可(也就是說,建立一個Merkle樹,而且給驗證者發去根哈希)對於1到10億之間x的全部P(x) 和 D(x)的估值。這就包含了0 <= P(x) <= 9之間的100萬個點,以及剩下的9.99億個點。

image

假設驗證者已經知道Z(x)在這些點的估值;那麼Z(x)就像一個「公共的驗證祕鑰」,從而每一個人都必須提早知道(沒有地方存儲Z(x)的客戶端,能夠簡單地將它存儲在Z(x)的Merkle樹根部,並且須要證實者也爲每一個Z(x)的數值提供驗證者須要的分支;或者,有些數字字段,對於x和Z(x)都很容易計算)。在得到這個承認(也就是說,Merkle樹的根部),驗證者而後會在1和10億之間選擇隨機的16x數值,並且讓證實者來提供P(x)和D(x)的Merkle樹分支。證實者提供了這些數值,並且驗證者會檢查(i)這些分支和以前提供的Merkle樹根部符合(ii)C(P(x))其實等於Z(x) * D(x)。

image

咱們知道這個證實有很好的完整性,若是你其實知道一個合適的P(x),那麼你能夠計算D(x)而且構建正確的證實,來經過16個檢查點。可是穩定性又如何呢?也就是說,若是欺詐的證實者提供了個錯誤的P(x),他們被抓的最小可能性是多少?咱們能夠進行以下分析。由於C(P(x))是由1,000,000維度多項式組成的10維度多項式。總體來講,咱們知道這兩個不一樣的多項式最多在N個點符合;所以,10,000,000維度的多項式和任何等於Z(x) * D(x)的多項式都不會相等。對於x來講,至少在990,000,000個點都不會贊成。所以,對於很差的P(x),在一輪被抓住的機率已是99%;經過16輪檢查,被抓住的機率是1 – 10-32 ,也就是說,這個機制不可能存在欺詐。

那麼,咱們剛剛作了什麼?咱們使用多項式來推進任何不良解決方案的錯誤,以致於對於初始問題的任何錯誤解決方案,都須要100萬個檢查才能發現,最終致使驗證協議的解決方案,能夠99%的機率發現錯誤。

咱們能夠將這三步的機制轉換成一個非交互式的證實,這能夠經過單個的證實者來廣播,而後被任何人使用菲亞特-夏米爾啓發式算法來進行驗證,證實者首先構建P(x) 和 D(x)數值的Merkle樹,而後計算樹的根哈希。這個根部自己被用於做爲熵的來源,用來決定證實者須要提升這個樹的哪些分支。證實者而後就會廣播Merkle樹的根部,分支還有證實。計算所有會在提供方完成;從數據計算Merkle樹根部的過程,而後是使用這些來選擇通過審計的分支,有消息地完成了交互性驗證者的需求。

欺詐者在不須要有效的P(x)前提下,惟一能作的事情,就是嘗試進行有效驗證,直到最終他們特別幸運,選擇到了正確的Merkle樹分支,可是機率只有1 – 10-32 (也就是說,至少有1 – 10-32 的機率,虛假的證實不會經過檢查),欺詐者須要花費幾十億年,才能獲得能夠經過的證實。

image

前景展望

爲了說明這項技術的能力,咱們來作些看起來不是很重要的事情:證實你知道第100萬個斐波納契數。爲了完成這個,咱們會證實你對多項式有了解,P(x)表明第x個斐波納契數。多項式檢驗就會從3個維度進行:C(x1, x2, x3) = x3-x2-x1(須要注意,若是對全部x來講,C(P(x), P(x+1), P(x+2)) = 0,那麼P(x)久表明斐波納契數)。

image

因此問題就變成了:證實你知道有個P和D,而後C(P(x), P(x+1), P(x+2)) = Z(x) * D(x)。對於其中的16個因子,證實者須要爲P(x), P(x+1), P(x+2) and D(x)提供Merkle樹的分支。證實者並且還須要保證所提供的Merkle樹的分支能夠保證,P(0) = P(1) = 1。不然,整個流程就是同樣的。

如今,爲了完成這個,還須要解決2個問題。第一個是,若是咱們嘗試進行列舉數字的方法來解決這個問題,效率就會很低,由於這些數字一般都會很大。例如,第100萬個斐波納契數有208988個數字。若是咱們其實想要得到簡單性,與其使用常規數字進行列舉,咱們須要使用有限的數字系統,始終符合咱們瞭解的規則,例如a * (b+c) = (ab) + (ac) and (a^2 – b^2) = (a-b) * (a+b),可是每一個數字都會佔據必定空間的數據。證實關於斐波納契數數字的問題,須要更加複雜的設計。最簡單的模式,就是將每一個a + b用a + b的N進制數來代替,對減法和乘法也是一樣地方法,對於除法,使用模塊逆轉(例如,若是N=7,那麼3 + 4 = 0, 2 + 6 = 1, 3 * 4 = 5, 4 / 2 = 2並且5 / 2 = 6)。

其次,你也許注意到了,在上面的證實中,我忽略了一種攻擊:若是攻擊者不是經過看似真實的P(x),而是使用了並不在這些多項式的數據?那麼,無效的C(P(x))必需要和有效的C(P(x))在至少9.9億個點上相同,就不會應用了,並且會很是不一樣,並且更有效的攻擊是有可能發生的。例如 ,一個攻擊者會保證任何x都有一個隨機數p,那麼計算d = C(p) / Z(x),而且將這些數字都放入P(x)和D(x)。這些數字不會在任何低維度的多項式,可是它們會經過檢測。

這就證實了這種可能性會頗有效地抵抗攻擊,雖然作這些的工具相對複雜,並且你能夠說它們組成了STARKs協議中的數學創新。同時,這個解決方案有個限制:你能夠清除這些數據,可是你不能清除和你的多項式存在一個或兩個變量差異的多項式。所以,這些工具會提供接近性證實,證實大多數在P和D的點上,都會表明正確的多項式。

因此最終證實,這已經足夠來打造證實,儘管會有兩個小問題。首先,驗證者須要檢查更多的指數來彌補錯誤佔據的有限空間。其次,若是咱們正在打造邊界檢測,那麼咱們須要將接近性證實擴大到不止是證實大多數點是在同個多項式,並且證實這兩個特別的點是在那個多項式上。

內容來源:巴比特 原文做者:Vitalik Buterin

Blockathon|48小時極客競賽,區塊鏈馬拉松等你挑戰(成都)

時間:2018年9月14-16日

地點:成都高新區天府五街200號菁蓉國際廣場2號樓A座12樓中韓互聯網+新技術孵化器

  • 招募50名開發者(識別下圖二維碼或點擊「閱讀原文」便可報名)

  • 報名費100元爲參賽押金,參賽者我的緣由不能到場參加活動概不退款;參賽者全程參與活動,待活動結束後現場退還。9月14日18:00開始第一次簽到,9月15日和16日天天早上都要記得簽到哦。

  • 主辦方免費提供2天的食物、飲料,併爲每一位參會者準備一件文化衫

image

相關文章
相關標籤/搜索