你畢業十年,事業驕豔,成功男士光芒塗滿同學聚會的觥籌交錯間。

你和女同學們聊得正歡,餘光裏殺出個男的敬你酒,你不喝,他紅着鼻子醺你:不喝不是男人,你到底是不是?

你說你是。他把酒杯往桌上一拍:是男人要麼悶掉這杯,要麼掏出來看看。

怎麼辦?如果真掏,明早鐵定頭版頭條;如果不掏,成功男士的光芒會被紅塵籠罩。

急中生力,你一咬牙拔出身份證往桌上一拍,酒鬼楞了一下,好像突然清醒,驗貨之後,自己把酒喝掉,轉身又醉去。

女同學們都誇你的寶貝好厲害,你卻笑而不語,因爲你明白,這並不是什麼寶貝,而是區塊鏈世界的一招:簡明非交互零知識證明(zk-SNARK)。

一、什麼是簡明非交互零知識證明?

zk-SNARK:Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge

明明生澀冗長,用兩行才能裝下,那它怎麼好意思誇自己“簡明”呢?掰開揉碎一步步來:

零知識(Zero-Knowledge):你不出具真傢伙,就能向酒鬼證明你的性別。

簡明(Succinct):證據簡短且明文,驗證方便。

非交互(Non-Interactive)指雙方不多嘴。證明者只向驗證者發一次信息,極端複雜時,最多一個來回就能搞定驗證。

知識的驗證(Arguments of Knowledge):別人無法僞造,可信度極高。

所以,你看出來了,即使開篇的故事把比方打成這樣,我們還是不到位,還是太溫柔,還是沒有扒開 zk-SNARK 的底褲:

要證明你是男人,不靠喝、不靠掏、也不靠身份證,那些都是原子世界的思維定式。數字世界,你只要出示一口氣息,就能證明你的性別。

這口氣息的名字叫 zk-proof (零知識證據),它不僅簡明,而且只需發射一次,就能擺平質疑。

本文本該參閱 zk-SNARK 的經典三篇,因爲作者是大神:以太坊創始人 V 神。可本文作者沒翻兩頁就跪了,決定不拿 V 神文中 27 個新概念來爲難你。

於是,換個國產 V 神吧:Victor,麻省理工學院計算機科學博士,他有篇文章是連接入門者和 zk-SNARK 之間最好的紐帶。於是,下文生扒了 Victor《衆目睽睽下隱身,zk-SNARK 黑科技如何保護區塊鏈隱私》的技術詳解部分:

首先明確兩個角色:證明者和驗證者。

你是證明者,口袋裏裝着兩個數字:3 和 4。你想證明自己有,但由於這兩個數字重要得如地址、如私鑰,所以不想被人看到。

我是驗證者,想驗證你確有這兩個數,但我不能伸手到你口袋裏來掏。傳統意義上,我們只認眼見爲實,所以這事絕無可能辦到。但在科技叢林裏我們總能逮到新物種,而 zk-SNARK 就是其中活奔亂跳的一隻。

別人想看,你不能給,卻非要證明你有,怎麼辦?

下面我們打開弧光燈,用手術刀切開 zk-SNARK 的運轉過程,一探究竟。

二、理解這節內容你就合格:zk-SNARK 基礎過程

你找出一個玻璃盒,罩在數字上,這個盒子能讓數字發生折射,使它們看上去不是 3 和 4,而是 9 和 10。這個神奇玻璃盒就是同態隱藏函數 E (x),它有三個特性:

1、 光看錶象數字 9,猜不到內部數字 3——雖然通透,但保密性好,通過 E(x) 無法推導出 x。

2、 包住 3 透出 9,包住 4 透出 10——不同的輸入得到不同的輸出,即:若 x≠y,則 E(x)≠E(y)。

3、 我作爲驗證者,不知道你口袋裏的具體數字,但玻璃盒表面數字具備玻璃盒內數字的特性:我只靠 E(x) 和 E(y),經過複雜計算能得出 E(x+y) 的值。

如果經過複雜運算得出 E(x+y) 的值等於玻璃盒表面兩個數字之和 E(x)+E(y),即通過 zk-SNARKs 驗證。

你手裏的玻璃盒“同態隱藏函數”簡直就是一隻魔法水晶球:既能證明你有,又能滴水不漏。如果數學在天有靈,那我就必須無條件認你兜裏的數字貨真價實,即使我從來沒見過。

同態隱藏是一類加密函數,細分下去有兩種:本例屬於加法同態,即 E(x)+E(y)= E(x+y);如果滿足 E(x)×E(y)= E(xy),就是乘法同態。

讀到這裏,你的好奇心可能會隱隱作痛:如果我知道你口袋裏的 x+y=7,那難道我就不能去抱養一隻礦機,暴力破解出 x 和 y 的正確答案麼?

你想對了,完全可以。

所以,必須引入一個概念:隨機偏移

你必須找到一個隨機數 t,使得你玻璃盒透射出的數字並不是 E(x) 和 E(y) 本身,而是 E(x+t) 和 E(y-t),否則你的祕密就存在被我窮舉的風險。

也就是說,此時我從盒子上看到的就不再是 9 和 10 (E(x) 和 E(y)),而是 26 和 47 (E(x+t) 和 E(y-t))。

注意,玻璃盒上的 9、10、26 和 47 是杜撰出來的值,只爲便於你理解,不必糾結過程。

如果你勵志讀懂本文的數學原委,那我們可能要一起去搞兩頂碩士帽戴戴,而且讀到動情之處,躲在博士帽下的人都未必能醒悟。所以我們只要知道同態隱藏函數 E(x) 在數學上能實現就行。

“E(x+t)、E(y-t)”和“E(x)、E(y)”一樣,能通過複雜計算得出 E(x+y) 的值,這是基於同態隱藏函數的性質。所以,如果我發現 E(x+y) 最終等於 E(x+t)+E(y-t),那麼恭喜你,通過了我的驗證。

問題終於解決,你長出一口氣。但是,每當我們認爲春風得意到理所當然時,不妨多問自己一句:問題真的解決了麼?

答案爲否。

應付村裏的小嘍嘍,上述方法早已足夠。但挺進大都市,面對更復雜的場景,老辦法就會掉隊了。

讀到這裏,如果你沒有 8 分鐘的專注時間,可以直接翻下讀結語。因爲下一節我們將冒着失去一半讀者的風險解剖複雜場景下 zk-SNARK 的五臟六腑。

而你有兩個選擇:

第一, 用手指飛速劃過本文第三部分 1926 個字難受的學習區,瞬間轉移至舒適區:結語

第二, 迎難而上,留在學習區修行。感覺上會不好受,但總會有人選擇正確的難受,不是麼?

三、直面複雜場景:zk-SNARK 進階過程

我們已經理解,如何在不出示靜態數字本身的情況下,證明你確實有這些數字。

可如果你兜裏放着的不是幾粒數字或字符,而是動態數字——多項式,那你又該如何證明?

什麼是多項式?其實我們很熟悉,比如:

P(x) 就是一個多項式。

複雜場景指:你如何在不展示多項式本身的情況下,證明你有這個多項式?

此時,光靠同態隱藏函數的玻璃盒已經不夠用了。因爲一個多項式中,x 可能有無窮多個值。

必須另闢蹊徑。

數學家給我們指了條明路:與其驗證所有可能的解,不如我隨口問你:x=2 時,你的多項式等於幾?

即,驗證者向證明者發射一個隨機點 s。證明者只要回覆驗證者 P(s) 的值,就能完成驗證。

你需要告訴我的僅僅是:當 x=2 時,你手裏多項式的值就行,本例中 P(2)=77。

現在,我還不知道你手裏多項式的模樣,但我憑 2 和 77 兩個值,就能驗證你是否有這個多項式,理由是上文同態隱藏函數的第三條性質。

但你可能已經發現,這個方法有兩個問題:

第一,我可能會拿你給我的蛛絲馬跡,暴力破解你的祕密多項式,所以你必須再找一個隨機偏移多項式 R(s)。這個 R(s) 必須像眼藥一樣,使得我根本看不清 P(s) 的模樣。

你把 P(s) 與 R(s) 之和放進同態加密的玻璃盒,只讓我瞄一眼表面數字:E(P(s)+R(s)) 的值,但這已足夠我驗證。

於是,第一個問題解決。

第二個問題是:我把隨機點 s=2 發送給你,你完全可以找個值來唬弄我,因爲 P(x) 的值可能有一籮筐,如果你並沒有這個多項式,但你特別能猜,一猜就中,怎麼辦?

最簡單的方式是我把隨機點 s 加密,再發送給你。

但這樣做的尷尬是:你無法計算出 P(s)、R(s) 以及加密函數值 E(P(s)+R(s))。

所以,爲了讓你能輕鬆算出 E(P(s)+R(s)),我把 E(1)、E(s)、E(s2)、E(s3) 全部發給你(s2 和 s3 代表 s 的平方和立方,下文同)。

根據加密函數第三條性質,你可以根據 E(1)、E(s)、E(s2)、E(s3) 計算出 E(P(s)+R(s))。

特別有價值的一點是,此時隨機點 s 的具體數據沒有暴露。換句話說,你並不知道我隨口說的 s 值等於 2,但你依然可以把有價值的信息發給我驗證。

所以,如果你並沒有多項式,用“渺茫”形容你蒙對的可能性,那是在誇你,用“零”描述才貼切。

但如果你的確沒有多項式,可你就是中着彩票長大的,我作爲驗證者又該如何對抗你的手氣呢?

zk-SNARK 的答案是繼續灌入隨機,稀釋你的好運。

我在生成隨機數 s 的同時,再生成一個隨機數 k,接着向你發送關於 s 和 k 的信息,你只要給我兩個數就行:

第一,P(s) 的加密值 E(P(s))

第二,kP(s) 的加密值 E(kP(s))

回憶一下:加密就是套個神奇玻璃盒子,加密值就是我透過玻璃盒子能看到的數字。

注意,k 是一個只有我知道的祕密隨機值,如果你可以告訴我 P(s) 和 kP(s) 的信息,就證明你不靠胡說八道過日子,你確實知道 P(x) 的樣子。

具體原因是一個概念:知識係數假說 Knowledge of Coefficient Assumption。如果你有興趣,可以去 Google。本文不再鋪開,因爲再不收筆,我們專欄的另一半讀者也沒了。

於是,zk-SNARK 的終極方案是:

我選取隨機點 s 和隨機係數 k,向你發送兩溜加密函數的值:

E(1)、E(s)、E(s2)、E(s3);

E(k)、E(ks)、E(ks2)、E(ks3);

你產生一個隨機偏移多項式 R(x),根據我給你的值,分別計算:

E(P(s)+R(s))

E(kP(s)+kR(s))

你算出上述兩個值,丟給我驗證就行啦,zk-SNARK 會保證我們都不喫虧、都不上當。

好,我們收起手術刀,關掉弧光燈,洗洗手,總結一下這場解剖,我們注意到最重要的一點:

驗證者發送給證明者的信息不隨驗證內容變化。因此可以事先設置,不斷複用。這個可以事先設置的信息稱爲:共同參考字符串:CRSCommon Reference String。

但正是基於此,引出 zk-SNARK 的兩根軟肋:

第一,如果驗證一個複雜多項式,需要耗費極多計算資源,所以在燒 gas 的平臺上運行會很貴,當前常用的解決方案是先預編譯然後上鍊跑。所以,優化計算過程仍是一條艱辛漫長之路。

第二,生成和保存隨機信息的方式仍然很土。比如,使用 zk-SNARK 技術的 Zcash 中,CRS 裏存放的只是隨機點 s 和隨機係數 k 的加密值,而 s 和 k 的明文則由 6 個人私下保管。

傳說只要這 6 個人不同時變壞,這些隨機數就不會被完整恢復,而且爲讓祕密永遠祕密下去,這些人還模仿桃園結義拜過把子,但這恰好給我們人類下一場史詩級的思考開了一個小頭:

祕密的祕密,應該交給誰來保密?

結語

是騾子是馬,再也不用拉出來遛了。

我們都曾證明過一些雞毛蒜皮,爲此不得不丟棄隱私,付出“非簡明”的代價,動不動逼你掏出來看的場景並非只侷限於同學聚會。

區塊鏈世界的初始設置本是公開透明,但人性卻渴求隱私。若不爲得到公共服務的便利,沒有誰願意憑空拋灑自己的財產信息、醫療記錄或地理位置數據。

歷史無數次證明:呵護隱私的不可能是道德,只能靠技術,而 zk-SNARK 和衆多保密技術一樣,負責給你的隱私塗上馬賽克。

比如,你能在不暴露準確位置的情況下,向人證明你在上海;如有必要,你還可以縮小範圍證明你在浦東,而不必暴露你在陸家嘴的精準位置。

zk-SNARK 可能會演化成一個旋鈕指針,供你在完全公開和絕對私密兩頭自主遊移。讓你在享受公共服務便利的同時,守住個人私密。它能防止你的隱私變成脫繮野馬、絕塵而去。最終,讓你在虛擬世界裏全身放鬆、自然舒展。

這是一種安排數學擔任信任中介的手段,雖然 zk-SNARK 尚未解決計算量臃腫和隨機數隱憂兩大問題,但這樣的星星早晚點亮黑科技的夜空。

新技術可能不在天頂閃爍,但早已在我們腳下湧動,它們不會改變水的顏色或者空氣的味道,但我們的世界必然會被這些光芒重新雕塑。

來源鏈接:None