(作者:郭宇(安比實(shí)驗(yàn)室創(chuàng)始人))
這篇文章解釋利用ZKP(零知識(shí)證明)與區(qū)塊鏈來實(shí)現(xiàn)去中介的交易協(xié)議的原理,講講我們是怎么把這個(gè)理論變成實(shí)用的代碼的,這是一篇概述,希望了解更多的朋友請(qǐng)關(guān)注后續(xù)。
[注]:如果你相信未來區(qū)塊鏈技術(shù)能改變世界,請(qǐng)留意看文末
沒有第三?,能保證交易的公平性嗎?
想象?下這樣?個(gè)交易場(chǎng)景,?個(gè)買家拎著現(xiàn)?箱?,另?個(gè)賣家也拎著?個(gè)箱?,裝著某種貴重貨物。在電影中的情節(jié)?,買賣雙?會(huì)坐在?個(gè)桌?兩側(cè),雙?倒數(shù)?、?、三,?起把箱?推給對(duì)?(很酷的姿勢(shì)),當(dāng)然雙?最好都帶武器,防?對(duì)?依然耍賴。除了買家賣家,沒有任何第三?在場(chǎng)(可能是?個(gè)?市交易),這兩?互不信任。可以想象,任何??都不敢先出?,把??的箱?交給對(duì)?,因?yàn)檫@樣接下來很可能出現(xiàn)的場(chǎng)景是,對(duì)?拿到箱?會(huì)?即跑路,這樣就導(dǎo)致錢貨兩空的結(jié)局。
在上世紀(jì)90年代,正值互聯(lián)?早期,電?商務(wù)已然是?家普遍看好的互聯(lián)?應(yīng)?。但在這些早期的在線交易實(shí)驗(yàn)中,會(huì)出現(xiàn)上述的兩?交易難題:到底是賣家先發(fā)貨,還是買家先付款? 當(dāng)然,賣家收到錢款后拒絕交付商品;或買家收貨之后拒絕付款的現(xiàn)象,難以避免。于是如何實(shí)現(xiàn)買賣雙?在線上進(jìn)行「公平交易」,即實(shí)現(xiàn)可靠的 「??交錢,??交貨」 成了?個(gè)熱門經(jīng)典的學(xué)術(shù)問題。但是很不幸地是,科學(xué)家們?cè)缇妥C明了這樣?個(gè)結(jié)論[1-2]:
在沒有可信第三?的前提下,?法實(shí)現(xiàn)買賣兩?的公平交易
所謂「公平交易」是指買賣雙?在不相識(shí)(不互信)的情況下,能夠放?進(jìn)?交易??需擔(dān)?對(duì)?作弊。如果交易順利完成,則買家得到商品,同時(shí)賣家得到錢款;若協(xié)議中途任何??退出,或任何??作弊,協(xié)議都會(huì)保證另??的利益不會(huì)受損。
在 Google 論?搜索引擎??搜「Fair Exchange」,我們能看到多達(dá)兩百多萬篇學(xué)術(shù)論?。假如我以一天看十篇的速度估算,這一輩子都看不完。

在過去近 30 年的研究?,公平交易?案中都必須要求存在?個(gè)絕對(duì)可信、可靠的第三?。?付寶正是起到這樣?個(gè)關(guān)鍵作?,擔(dān)任?個(gè)?家都信賴的第三?,?旦買賣雙?發(fā)?糾紛,?付寶負(fù)責(zé)介?事務(wù)并解決問題。 當(dāng)互聯(lián)?電?商務(wù)蓬勃發(fā)展到今天,這?類的信任第三?已經(jīng)變成了巨?霸。而大家所感受不到的事實(shí)是,第三?所引?的「信任成本」正在急速攀升。毫?疑問,對(duì)第三?的過度依賴會(huì)帶來嚴(yán)重的「隱私泄露」、「單點(diǎn)失效」還有「?jìng)€(gè)?信息濫?」的問題。當(dāng)然有?些學(xué)術(shù)成果表明,這個(gè)條件可以放寬,也就是依靠?個(gè)“半可信第三?”(Semi-trusted Third Party)。但是請(qǐng)諸位思考,所謂 "半可信" 這并不解決根本問題,半可信第三方只是停留在理論層面的一種設(shè)想。
時(shí)間走到了 2008 年,?特幣橫空出世,中本聰給出了?種天才設(shè)計(jì):在?個(gè)可以?任何準(zhǔn)?許可的 P2P ?絡(luò)中,采取「POW與最長鏈」共識(shí)協(xié)議,以?種?常公平的?式進(jìn)?去中心化記賬[3]。我們可以從另?個(gè)?度來理解中本聰?shù)膭?chuàng)新:
Bitcoin 實(shí)現(xiàn)了?種分布式協(xié)議,它以去中?化的?式「模擬」出了?個(gè)「虛擬」的「可信第三?」
當(dāng)我們?cè)谑??特幣時(shí),可以完全想象存在著這么?個(gè)虛幻的可信第三?,它?夠可靠,不會(huì)記錯(cuò)賬。那么?家很容易聯(lián)想到剛才的問題:?特幣或者區(qū)塊鏈能否也模擬出?個(gè)虛擬的可信第三?來實(shí)現(xiàn)經(jīng)典的公平交易呢?這樣?來,交易的買賣雙?不就可以不再依賴?個(gè)實(shí)體第三?了嗎?這樣交易的效率會(huì)驚?地?幅提升,中介成本會(huì)降到極低。
如果區(qū)塊鏈技術(shù)真的可以做到這?點(diǎn),那么實(shí)際上就可以實(shí)現(xiàn):「零信任公平交易」。設(shè)想下,我們可以隨意在?絡(luò)上與完全不互信的另??進(jìn)?「數(shù)字化商品」交易,?且不?擔(dān)?他會(huì)作弊,因?yàn)橛袇^(qū)塊鏈在旁邊擔(dān)任?個(gè)協(xié)助者,或者仲裁者的??。這會(huì)將交易、商品流通或貿(mào)易的效率提升到一個(gè)無法想象的高度。
實(shí)現(xiàn)零信任的兩方公平交易的先驅(qū)——簡述 ZKCP
?特幣開發(fā)者 Greg Maxwell 早在 2011 年就在?特幣維基?站上提出了 「零知識(shí)有條件?付」(ZKCP)的構(gòu)想[4]。采用比特幣這個(gè)被 模擬 出來的第三方來充當(dāng) 交易支付 中的可信第三方。由于比特幣網(wǎng)絡(luò)是去中心化,因而這個(gè)第三方將會(huì)是一個(gè) 零信任第三方。

通過這個(gè)?案,買賣雙?可以通過 BTC 進(jìn)?數(shù)據(jù)的交易,并且可以做到所謂的「原子交換」,賣家在收款的瞬間,買家拿到數(shù)據(jù)。這個(gè)原理其實(shí)?常簡單,下面來講述下整個(gè)過程:
主角
賣家:Alice
買家:Bob

第一步: Alice 將「數(shù)據(jù)」??個(gè)「鑰匙」 加密,鎖在箱子里面。

第二步:Alice 將箱子發(fā)送給 Bob,Alice 還將附加?個(gè)「零知識(shí)證明」,證明兩個(gè)事實(shí):(1)箱子可以用鑰匙打開,(2) 鑰匙的哈希等于一個(gè)值 「h」

第三步:Bob 檢查零知識(shí)證明,確認(rèn)上述事實(shí)為真。然后 Bob 將零知識(shí)證明中的一部分撕下來作為「收貨收據(jù)」。這個(gè)收據(jù)上寫著鑰匙的哈希,也就是「h」

第四步:Bob 創(chuàng)建?個(gè)智能合約,鎖定 1BTC,寫?「h」。?付腳本要求:凡是可以提供「h」的哈希原象的?可以提?這枚 BTC

第五步:Alice 向智能合約出示鑰匙

第六步:智能合約檢查「鑰匙」是否和「收貨收據(jù)」匹配

第七步:如果智能合約通過檢查,則它把 1BTC 付給 Alice,同時(shí)把鑰匙交給 Bob。

第八步:Bob 用「鑰匙」打開「箱子」,取出數(shù)據(jù)。至此,雙方完成交易
所謂原?交換是指,?家要么交換,要么不交換,這個(gè)交換動(dòng)作不能再分割,像?個(gè)物理世界的原??樣。在第六到第八步,這個(gè)三個(gè)步驟是不可分割的。Alice ?「鑰匙」提? 1BTC,同時(shí)「鑰匙」也就暴露在了區(qū)塊鏈上,Bob 就可以拿?「鑰匙」解密數(shù)據(jù),同時(shí)得到了數(shù)據(jù)。「原?交換」是公平性的?個(gè)體現(xiàn),保證買家賣家的交換能完成。好了,其實(shí)只有「原?交換」還不夠。思考?下,這整個(gè)流程中,還有兩個(gè)技術(shù)難點(diǎn)同樣關(guān)鍵:
問題(1):數(shù)據(jù) D 確實(shí)是 Bob 想要的數(shù)據(jù)
問題(2):Alice 出示的密鑰必須是正確的密鑰
2016年 G. Maxwell 和 S. Bowe 等?實(shí)現(xiàn)了第?個(gè)基于區(qū)塊鏈技術(shù)的「完美公平」交易案例[5]。這是一個(gè)了不起的實(shí)驗(yàn),人類歷史上第一次做到了,無需可信第三方的公平交易。實(shí)驗(yàn)完成了兩筆數(shù)獨(dú)答案的公平交易。他們采? zkSNARK 技術(shù)來產(chǎn)?零知識(shí)證明,來同時(shí)解決上?的問題(1)與問題(2)。
信任的產(chǎn)生:零知識(shí)證明技術(shù)
零知識(shí)證明是如何解決 問題(1)與問題(2)。接下來我插播一下科普,零知識(shí)證明是什么呢?可能大家都聽說過這個(gè)概念,特別是在一些匿名加密數(shù)字貨幣中。零知識(shí)證明的英文是
Zero-Knowledge Proof
這里面的每一個(gè)單詞背后的深意,能值得好好聊聊(這里空間太小,寫不下 :P)。但是這里我打算用大白話來嘗試解釋下。零知識(shí)證明是 1984 年由 Goldwasser、Micali 與 Rackoff 三個(gè)人提出,他們當(dāng)時(shí)寫了一篇文章,題目叫做《The Knowledge Complextiy of Interactive Proof Systems》,中文名翻譯過來叫《交互式證明系統(tǒng)中的知識(shí)復(fù)雜性》。

大家仔細(xì)看這張圖的左上角,可以看到這篇論文其實(shí)發(fā)表在 1989 年。由于這篇文章的思想太過超前,太過震撼,以至于從他們 1984 年寫出初稿到 1989 年正式被采納發(fā)表,經(jīng)歷了整整五年時(shí)間。正是這篇文章提出來了 零知識(shí)證明 這個(gè)偉大概念,這個(gè)概念也逐步成為了現(xiàn)代密碼學(xué)理論的根基之一。后來大家都知道在 2012 年,Goldwasser 和 Micali 兩人因?yàn)檫@個(gè)開創(chuàng)性工作而分享了 圖靈獎(jiǎng) 。
【注】我們通常理解的零知識(shí)證明技術(shù)是特指狹義的如何高效構(gòu)造通用零知識(shí)證明 的理論和技術(shù),而廣義的「零知識(shí)」是密碼學(xué)的核心理論根基。
我想引用這篇文章的一句話:
一般來說,在協(xié)議的設(shè)計(jì)中經(jīng)常會(huì)遇到這種問題:A 想讓 B 相信某件事情。我們知道,如果此刻有一個(gè)「天使」(或者 B信賴的某個(gè)人)能夠讓 B 確信 A 說的是實(shí)話,那么這個(gè)協(xié)議是安全的。我們想讓「零知識(shí)證明」這個(gè)概念能夠在這里發(fā)揮作用,而不是依賴可信第三方,讓這個(gè)協(xié)議仍然是安全的。 ——[GMR89]

這段話是不是有點(diǎn)繞,但是用一句話就可以說明白:
零知識(shí)證明提供的「信任」,能夠代替一個(gè)「可信第三方」
聽上去很玄幻,不是嗎?零知識(shí)證明怎么「憑空產(chǎn)生了信任」?我們?cè)趺葱湃瘟阒R(shí)證明?零知識(shí)證明的信任基礎(chǔ)是什么呢?這些問題不難回答,其實(shí)它的信任基于比較客觀的理論,一類是基礎(chǔ)理論,包括「數(shù)論與代數(shù)」,「數(shù)理邏輯」,還有「計(jì)算理論」。還有一類是一些安全假設(shè),比如「離散對(duì)數(shù)難題」,「Knowledge of Exponent」等等。如果我們信任數(shù)學(xué),信任邏輯,信任這些安全假設(shè)沒有被攻破,那么我們可以得出下面的結(jié)論:
零知識(shí)證明實(shí)現(xiàn)了一類密碼學(xué)理論技術(shù),它基于一些安全假設(shè)「模擬」出了?個(gè)虛擬的可信第三?
聽上去很耳熟對(duì)不對(duì)?我在前面說了類似的話,拷貝過來:
Bitcoin 實(shí)現(xiàn)了?種分布式協(xié)議,它以去中?化的?式「模擬」出了?個(gè)虛擬的可信第三?
很巧合是不是?自從 2016年 《經(jīng)濟(jì)學(xué)人》提出來的「區(qū)塊鏈?zhǔn)切湃螜C(jī)器」的說法,我就在一直思考這個(gè)問題:「信任機(jī)器」如何體現(xiàn)。自從深入思考零知識(shí)證明以后,我慢慢發(fā)現(xiàn)他們殊途同歸,只是各自的維度不一樣,區(qū)塊鏈解決的是「分布式計(jì)算的信任」,零知識(shí)證明解決的是「數(shù)據(jù)的信任」。如果再加上形式化驗(yàn)證,就可以解決「邏輯的信任」。
這三個(gè)點(diǎn):邏輯 <-> 計(jì)算 <-> 數(shù)據(jù) 才真正構(gòu)成了一個(gè)閉環(huán),也許才能真正實(shí)現(xiàn)「信任機(jī)器」這一構(gòu)想。而我們正在踐行的 zkPoD 項(xiàng)目正是從這三個(gè)不同的維度出發(fā),摸黑前進(jìn)。
【思考】三個(gè)維度缺一不可,這個(gè)觀點(diǎn)是否能解決區(qū)塊鏈在現(xiàn)實(shí)場(chǎng)景難以落地的問題呢?
ZKCP的“局限性”與零知識(shí)證明漏洞
ZKCP 的構(gòu)想雖然 2011 年就被提出,但是好事多磨,這個(gè)構(gòu)想?直到 2016年2月才正式實(shí)現(xiàn)。ZKCP基于當(dāng)時(shí)最前沿的零知識(shí)證明技術(shù) ——— zkSNARK [5]。來自 ZCash 團(tuán)隊(duì)的 Sean Bowe 編寫了 ZKCP 的代碼,并且 Gregory Maxwell 從 Sean Bowe 手里購買了 一個(gè) 16x16 的數(shù)獨(dú)答案,花費(fèi)了 0.1 BTC。

但是 ZKCP ?案還只是一個(gè)玩具,難以?持稍微??點(diǎn)的數(shù)據(jù)(比如?于 1MB ),因?yàn)檫@會(huì)為買家?guī)?法承受的計(jì)算量(計(jì)算量主要是為了產(chǎn)? zkSNARK 零知識(shí)證明)。雖然這個(gè)?案還?法實(shí)際應(yīng)?,但是它卻顯現(xiàn)出了區(qū)塊鏈技術(shù)真正的威?:
總體上我認(rèn)為像這些 “Trustless” 的智能合約具有非常大的價(jià)值,不管是低價(jià)值但高頻的自動(dòng)交易——傳統(tǒng)交易中的沖突開銷(開銷過大,而交易價(jià)值過低)剝奪了尋求嚴(yán)肅公正的參與度,亦或是高價(jià)值交易中的低速,不可靠(特別是需要訴諸司法),或者傳統(tǒng)交易沖突仲裁中的隱私保護(hù)缺失,都將會(huì)變得無法接受。
當(dāng)這個(gè)技術(shù)變得越來越實(shí)用時(shí),我期待會(huì)出現(xiàn)非常激動(dòng)人心的應(yīng)用。
————— Gregory Maxwell
然而在 2017年,M. Campanelli 等?發(fā)布在 ACM CCS 安全頂會(huì)上的一篇文章揭示了 ZKCP ?案中的一個(gè)安全漏洞[6],ZKCP的實(shí)驗(yàn)對(duì)于賣家不公平,買家可以通過特定手段,使得零知識(shí)證明不再零知識(shí),從而在不付錢的情況下拿走(部分)數(shù)獨(dú)答案。他們?cè)赯KCP的基礎(chǔ)上進(jìn)?改進(jìn),提出了 ZKCSP ?案,但是仍然沒有解決實(shí)?性問題。2018年,S. Dziembowski 等?在朝著使用方向努力,在 ACM CCS 的論文里講解了一個(gè)新思路—— FairSwap[7]。它可以?持多達(dá)數(shù) GB 的數(shù)據(jù)?件交易。Fairswap 通過虛擬電路的?式來解決上?的問題(1),對(duì)于問題(2),F(xiàn)airswap 采?了?種 “惡意?為舉報(bào)” 的?式來應(yīng)對(duì)。這個(gè)思路類似閃電?絡(luò) , Plasma 等區(qū)塊鏈?層協(xié)議,賣家 Alice ?先交付密鑰,但是這時(shí)候買家 Bob 需要在?定時(shí)間內(nèi)(?如說三個(gè)?時(shí)),檢查密鑰的正確性,如果不正確就趕緊舉報(bào),并且向區(qū)塊鏈(或合約)提供證據(jù),證明密鑰或數(shù)據(jù)存在問題。這種?案要求買家必須能夠在規(guī)定時(shí)間內(nèi)完成舉報(bào)動(dòng)作。雖然從理論上,這種交易?案沒有做到「??交錢,??交貨」,但是仍然是零信任公平交易。只是對(duì)賣家 Alice ??,她需要等到三個(gè)?時(shí)以后才能拿到貨款。
什么是 zkPoD
零信任公平交易是很多行業(yè)中普遍存在的需求,也是電子商務(wù)技術(shù)的未來。是我們安比實(shí)驗(yàn)室推出的?個(gè)實(shí)?的,?以交易?批量數(shù)據(jù)(可數(shù)字化商品)的零信任公平交易系統(tǒng)。
zk表示「零知識(shí)」,PoD是 底層安全協(xié)議的名字,是一種(非)交互式證明系統(tǒng)(PoD 代表 Proof of Delivery),用來實(shí)現(xiàn)可驗(yàn)證的數(shù)據(jù)交付(Verifiable data delivery,也可以理解成可驗(yàn)證的數(shù)據(jù)傳輸)。
zkPoD 基于零知識(shí)證明[8-13](包括GROTH09, Bulletproof, zkSNARK-Groth16等技術(shù)),結(jié)合區(qū)塊鏈實(shí)現(xiàn)交易的零信任,既解決了 ZKCP ?法交易?數(shù)據(jù)?件的問題,也?持?付/交付動(dòng)作的原?性,實(shí)現(xiàn)真正意義上的 “完美公平” 。與 FairSwap 相?,zkPoD 協(xié)議更加?效,?絡(luò)通訊量更?,智能合約更輕量級(jí),?持各種類型的區(qū)塊鏈架構(gòu)。任何的可數(shù)字化商品(Digitalized Commodities)都可以在鏈下完成商品交付,在鏈上同時(shí)完成?付。
或者更直白點(diǎn):zkPoD 是一個(gè)實(shí)用的「零知識(shí)有條件支付」 ZKCP 系統(tǒng)。其實(shí),zkPoD 不僅實(shí)現(xiàn)ZKCP 中「原?交換」,也就是「??交錢,??交貨」?效交易流程,同時(shí)也?持類似 Fairswap 的投訴?式證明。后者具有更高的數(shù)據(jù)吞吐量。
zkPoD 在試圖解決這樣一些問題:
如何在做到完美公平的前提下,達(dá)到實(shí)用,所謂實(shí)用不是交易幾個(gè)字節(jié)的信息,而是上GB,甚至達(dá)到TB級(jí)別。
如何有效融合并優(yōu)化最前沿的零知識(shí)證明技術(shù),使得我們可以使用手機(jī)和移動(dòng)網(wǎng)絡(luò)就可以參與。
如何保證底層的協(xié)議與基礎(chǔ)算法牢不可摧,這是在區(qū)塊鏈這種開放式環(huán)境中保證安全的「唯一途徑」。
做一個(gè)安全并且實(shí)用的系統(tǒng),相比紙上理論而言,要處理更多的現(xiàn)實(shí)問題:比如協(xié)議的設(shè)計(jì)要考慮以太坊平臺(tái)的各種安全隱患,比如「Front-running Attack」,比如去年我們發(fā)現(xiàn)的針對(duì)FOMO3D游戲的「堵塞攻擊」;比如協(xié)議要考慮各種交易方的惡意行為;比如協(xié)議要讓各方成本達(dá)到一個(gè)可接受的水平;比如大計(jì)算量算法未來能否支持硬件加速;密碼學(xué)安全強(qiáng)度是否合適等等。
zkPoD 如何解決兩方交易中的公平性問題
我們?cè)僦貜?fù)下上面提到的有關(guān)「公平性」兩個(gè)關(guān)鍵問題:
關(guān)鍵問題(1):被加密的數(shù)據(jù)確實(shí)是你想要的數(shù)據(jù)
關(guān)鍵問題(2):而我出示給你的密鑰必須是正確的密鑰
首先我們分析下問題(1),zkPoD 如何保證買家在掏錢之前就知道數(shù)據(jù)的真實(shí)性?其實(shí)數(shù)據(jù)的真實(shí)性是一個(gè)可以很主觀,也可以很客觀的標(biāo)準(zhǔn)。比如,我買的音樂,mp3好聽不好聽,這是一個(gè)非常主觀的判斷?;蛘咴偻艘徊?,我買的一首歌是不是某個(gè)明星真唱的?這是一個(gè)半主觀的判斷。再退一步,我想付費(fèi)觀看一部動(dòng)作片,沒想到買到的是喜羊羊,那么這個(gè)判斷可以是很客觀的嗎?可以是,但是寫一個(gè)算法來檢驗(yàn)一部電影是否是恐怖片,還是動(dòng)畫片,并不簡單。最后還有一種情況,那就是數(shù)據(jù)的真實(shí)度能夠非常客觀地來判定,比如 ZKCP 實(shí)驗(yàn)中,數(shù)據(jù)是一個(gè)數(shù)獨(dú)游戲的答案。這是可以寫一個(gè)算法來客觀檢驗(yàn)的。因此如果數(shù)據(jù)是存在一個(gè)算法,或者說可以通過寫一個(gè)程序來自動(dòng)判定真實(shí)性,那么這里可以直接構(gòu)造一個(gè)「零知識(shí)證明」來向買家出示,這好比是「模擬出一個(gè)天使」,告訴用戶雖然數(shù)據(jù)是加密的,但是數(shù)據(jù)的真實(shí)性是可信的。但是如果是另外幾種情況呢?這個(gè)程序太復(fù)雜了,不好寫,或者說根本判斷是很主觀的。為了應(yīng)對(duì)這種情況,zkPoD 采用的是最簡單粗暴的方案,用戶可以先購買一點(diǎn)點(diǎn)數(shù)據(jù),進(jìn)行驗(yàn)貨。確保數(shù)據(jù)無誤后,再大批量購買。「試吃方案」無疑是在現(xiàn)實(shí)世界中最簡單有效的方法。但是與普通的「試吃」不一樣的是, zkPoD 可以額外保證:
驗(yàn)貨數(shù)據(jù)可以讓用戶來隨機(jī)挑選
驗(yàn)貨次數(shù)不做任何限制
多次驗(yàn)貨,與大批量購買的數(shù)據(jù)必須來自于同一個(gè)數(shù)據(jù)集
為了保證上面這三點(diǎn),zkPoD 也是采用了零知識(shí)證明技術(shù)來做到。更詳細(xì)點(diǎn),任何購買的數(shù)據(jù)都必須攜帶一個(gè)證明:證明該數(shù)據(jù)片段是來自于某一個(gè)「唯一確定」的數(shù)據(jù)集合。為了解決問題(1),zkPoD 當(dāng)前版本采? Pedersen Commitments 來實(shí)現(xiàn)隱藏和半同態(tài)計(jì)算,并且利?擴(kuò)展的 Schnorr 認(rèn)證協(xié)議來傳輸加密數(shù)據(jù),并采用 J. Groth 等人的方法來構(gòu)造零知識(shí)證明[8-13],從而保證數(shù)據(jù)的真實(shí)性。
我們?cè)俜治鱿聠栴}(2),區(qū)塊鏈在 zkPoD中的核心作用是檢查這樣一件事情:賣家出示的密鑰必須是正確的密鑰。這個(gè)問題我們可以想象一下,我把密鑰出示給「智能合約」,它在完全不接觸數(shù)據(jù)或者加密數(shù)據(jù)的情況下,如何來保證我出示的密鑰,真的能解密?這聽上去很難做到。其實(shí),這里我們也可以用零知識(shí)證明「模擬出一個(gè)天使」,來告訴買家用戶還有智能合約:我給你們出示的這個(gè)密鑰是正確的密鑰。這里的原理涉及到PoD安全協(xié)議,我在這篇文章里就不展開講解原理了,只是講一個(gè)大概的思路。首先,我(作為賣家)給你(買家)出示一個(gè)關(guān)于密鑰的零知識(shí)證明,還有一把鎖(并不鎖任何東西,單純鎖起來的一把鎖)。關(guān)于密鑰的零知識(shí)證明了這樣一個(gè)事實(shí):凡是能打開這把鎖的密鑰一定能解密剛發(fā)給你的數(shù)據(jù)。而在交易的最后一步,你把這把鎖交給智能合約,而我交出鑰匙,而智能合約負(fù)責(zé)檢查鑰匙能不能打開這把鎖。如果能正常打開,那么你就可以把鑰匙拿走去解密數(shù)據(jù)了。如果打不開,那么說明我交出來的鑰匙是假的,那么我拿不到付款。我們可以這么理解,通過零知識(shí)證明,我們把密鑰有效性的檢查「歸結(jié)」(Reduce)到一個(gè)鑰匙開鎖問題。而這個(gè)問題是一個(gè)智能合約容易解決的問題。(zkPoD充分考慮了現(xiàn)有智能合約平臺(tái)上進(jìn)行計(jì)算的代價(jià)和實(shí)用性)。對(duì)于問題(2),zkPoD 利?了安全哈希函數(shù),并結(jié)合零知識(shí)證明技術(shù)來保證對(duì)于密鑰的校驗(yàn)。zkPoD ?前僅支持以太坊,并且經(jīng)過數(shù)次協(xié)議優(yōu)化,?前在以太坊上的 Gas 消耗量已基本達(dá)到實(shí)?。
「零信任」、形式化驗(yàn)證與安全性證明
我們前面談了區(qū)塊鏈,談了零知識(shí)證明,下面繼續(xù)來談?wù)劇感问交?yàn)證」。在 zkPoD 里面,不管是零知識(shí)證明,還是智能合約,還是底層的橢圓曲線算法,這些都是 zkPoD 公平性的基礎(chǔ)。我經(jīng)常會(huì)被問到這樣的問題:
那么這些底層玩意兒可信么?
我想你也會(huì)有同樣的疑問,尤其在這個(gè)群魔亂舞的區(qū)塊鏈行業(yè)。憑什么我能相信你的零知識(shí)證明技術(shù)沒問題,憑什么我相信區(qū)塊鏈沒問題?這篇文章的標(biāo)題是「零信任」,其實(shí)這個(gè)說法并不準(zhǔn)確。
任何「信任」都需要基于某些信任基礎(chǔ)(Trusted Computing Base),任何「安全」都有安全性假設(shè)
zkPoD 也不例外,它的可信度仍然要基于許多「可能沒問題」的部件,甚至是很多「說不清楚」的東西。
補(bǔ)上信任的最后一環(huán)正是「形式化驗(yàn)證」。這里不深入細(xì)節(jié),我只簡單討論下「形式化驗(yàn)證」到底在 zkPoD 場(chǎng)景下能做到哪些,能解決什么問題。形式化驗(yàn)證實(shí)際上是為邏輯,流程或者業(yè)務(wù)進(jìn)行形式化建模,你可以理解為用一種數(shù)學(xué)語言進(jìn)行描述,模型就是一些數(shù)學(xué)概念(或數(shù)學(xué)對(duì)象),比如集合、代數(shù)、范疇等等。然后所有的形式化驗(yàn)證都在用「顯式」的或「隱式」的方式「嚴(yán)格證明」某個(gè)結(jié)論(或者叫做定理)。一旦當(dāng)某個(gè)部件的可靠性論點(diǎn)被「證明」了,那么他就可以被移出 Trusted Computing Base。
【注】沒有產(chǎn)生證明(包括隱式證明)的分析過程,不能稱為形式化驗(yàn)證,因?yàn)檫@些分析過程沒有客觀的檢驗(yàn)標(biāo)準(zhǔn)。
上面我們提到了兩個(gè)「模擬」,一個(gè)是區(qū)塊鏈,另一個(gè)是零知識(shí)證明。他們之所以可信,是因?yàn)樗麄兡軌颉改M出可信第三方」。這個(gè)模擬過程是如何模擬的?首先下個(gè)結(jié)論:這兩個(gè)模擬過程都是可以形式化的,并且是可證明的。
在 Goldwasser 和 Micali 的論文中,他們就闡述了如何證明「零知識(shí)」,如何證明「模擬」這個(gè)操作。到如今,模擬(Simulation)和安全性證明已是密碼學(xué)界的共識(shí),也是基本的形式化工具,沒有經(jīng)過證明/驗(yàn)證的模擬是無法讓大家接受的。證明零知識(shí)的過程恰好就是一個(gè)直覺主義構(gòu)造性證明:構(gòu)造一個(gè)概率圖靈機(jī),他能夠模擬出各種第三方,還有各種有趣的概念。我看過的絕大多數(shù)零知識(shí)證明科普文章中,鮮有提到「模擬」這個(gè)概念,更不會(huì)提到安全性證明。這導(dǎo)致再怎么解釋零知識(shí)證明,讀者理解起來就如同霧里看花一樣,始終抓不住那個(gè)關(guān)鍵點(diǎn),模模糊糊好像懂了,但是似乎又說不清楚。因?yàn)槲已芯苛耸畮啄甑倪壿嬜C明,在啃了一些論文和證明之后,慢慢從那些密碼學(xué)安全性證明中體會(huì)到了「模擬」與「零知識(shí)」中所表達(dá)出的神奇理念。這些理念與當(dāng)年我們驗(yàn)證操作系統(tǒng)、驗(yàn)證編譯器工作中的理念非常吻合。另外一方面,學(xué)術(shù)界已經(jīng)開始在對(duì)「區(qū)塊鏈模擬」,也就是共識(shí)協(xié)議的信任進(jìn)行非常嚴(yán)格的數(shù)學(xué)建模與證明[14-16]。
形式化驗(yàn)證在 zkPoD 中解決「區(qū)塊鏈」,「零知識(shí)證明」這些技術(shù)依賴的那些「信任基礎(chǔ)」的可信度問題。理論上,所有客觀標(biāo)準(zhǔn)都能進(jìn)行驗(yàn)證,大到一個(gè)安全協(xié)議,小到一行代碼,凡是經(jīng)過形式化驗(yàn)證的部件,將會(huì)變成「零信任」。這是一個(gè)漸進(jìn)的過程。我們正在對(duì) PoD 安全協(xié)議進(jìn)行形式化驗(yàn)證,對(duì)「零知識(shí)證明」相關(guān)的理論進(jìn)行證明,我們正在對(duì) zkPoD 中的以太坊智能合約(零信任第三方)進(jìn)行形式化建模與驗(yàn)證。未來我們會(huì)利用形式化方法對(duì)交易協(xié)議進(jìn)行更細(xì)致的建模與驗(yàn)證。
zkPoD 的演進(jìn)
zkPoD 這個(gè)項(xiàng)?源于去年國慶節(jié),團(tuán)隊(duì)?胡說有個(gè)好玩的想法,?家聽了很興奮,于是很快搞出來?個(gè)? Demo,但是令人沮喪的是,不久我們就發(fā)現(xiàn)了其中的理論漏洞。然后接下來是漫?的啃密碼學(xué),補(bǔ)理論的過程,那酸爽。請(qǐng)教過各路?神,也曾??迷茫,每?次?突破卻又能偷偷開?好?陣?。
這?給?家講?個(gè)測(cè)試數(shù)據(jù)。拿?個(gè) 1GB 的數(shù)據(jù)?件為例,賣家初始化這個(gè)數(shù)據(jù),需要花 90 秒 ,也就是?分鐘多?點(diǎn),喝口水的時(shí)間。然后如果買賣雙方要采用最慢的原子交易協(xié)議(zkPoD提供三種不同的協(xié)議),對(duì)接低 TPS 公鏈(比如 Ethereum),賣家需要計(jì)算產(chǎn)?較多的零知識(shí)證明,?概需要花費(fèi) 9 個(gè)?時(shí)(普通PC,6核CPU),平均在 20KB/s 這個(gè)速度,這個(gè)速度已經(jīng)???年前 Modem 撥號(hào)上?時(shí)代的下載速度快不少。單筆交易的以太坊消耗 Gas ?概在15萬單位左右,相當(dāng)于十美分,折合RMB 7毛錢。?如果是采?「投訴證明」方式的交易協(xié)議,賣家只需要花費(fèi) 124秒 就可完成零知識(shí)證明的產(chǎn)?,?買家也基本以相同的時(shí)間 120秒 來接收并校驗(yàn)數(shù)據(jù)。請(qǐng)注意,在這種模式下,?絡(luò)的通訊量要翻倍,也就是需要傳輸2GB 多的數(shù)據(jù),以太坊 Gas 消耗?于 20萬單位。總體上,傳輸速率可達(dá) 3MB/s,這已經(jīng)接近??年前普通局域??件傳輸?shù)乃俣?。針?duì)高TPS公鏈,或者聯(lián)盟鏈,zkPoD 還提供了性能更好的協(xié)議模式。雖然 zkPoD 的核?性能已經(jīng)可以達(dá)到?撐?本、?頻、甚?視頻的效果,但是系統(tǒng)還需要對(duì)協(xié)議做進(jìn)?步的完善、改進(jìn)和優(yōu)化,才能?持豐富的上層應(yīng)?。現(xiàn)在系統(tǒng)還只有?個(gè)粗陋的命令?界?:

好奇的同學(xué)請(qǐng)點(diǎn)擊這?觀看一個(gè)完整的演示:
https://asciinema.org/a/251240?autoplay=1&speed=2.71828182846
更多的關(guān)于 zkPoD 的技術(shù)細(xì)節(jié)、系統(tǒng)架構(gòu)、代碼結(jié)構(gòu),測(cè)試結(jié)果,還有一個(gè)技術(shù)白皮書請(qǐng)參考我們的代碼倉庫:
https://github.com/sec-bit/zkPoD-node
也可以下載代碼編譯試運(yùn)?,默認(rèn) zkPoD 將會(huì)鏈接我們部署在以太坊測(cè)試?絡(luò)上的合約
Ropsten:0x07d04D5912383F8523208b978C73D4786a5b1e86
雖然 zkPoD 已可以達(dá)到 Demo 演示的狀態(tài),但是還是個(gè)半成品。周邊各種協(xié)議?持,?具鏈還有客戶端等都還待完善。zkPoD 還有許許多多好玩的擴(kuò)展功能在路上,也有?些創(chuàng)意功能還沒來得及實(shí)現(xiàn)。zkPoD 也將會(huì)對(duì)接更多的優(yōu)秀公鏈。
我們的想法是能不能把這么好玩的項(xiàng)?做成?個(gè)?由開源開放的社區(qū)項(xiàng)?,希望能有各種技能的?伙伴們加?一起協(xié)作。后續(xù)社區(qū)會(huì)整理?些技術(shù)?檔包括經(jīng)驗(yàn)分享,還有在這個(gè)過程中所了解到的各種有趣的知識(shí),還請(qǐng)大家持續(xù)關(guān)注。
zkPoD 的?標(biāo)?我還沒想清楚,也許是成為下?代互聯(lián)?的基礎(chǔ)協(xié)議,實(shí)現(xiàn)數(shù)據(jù)與價(jià)值的雙向流動(dòng)
零知識(shí)證明再述
零知識(shí)證明是我近年來?過的最有趣的理論和技術(shù)。零知識(shí)證明的學(xué)術(shù)理論確實(shí)有些深度。但是它的概念和應(yīng)?卻也沒那么難懂,雖然?檻略?。?論中?還是英?,這??的資料都極度缺乏,?程實(shí)踐更是少之?少。
我想通過?個(gè)簡單例?來解釋,假如我數(shù)學(xué)考試考了61分,爸媽問起來,我只要出示?個(gè)零知識(shí)證明,這個(gè)證明是?串?dāng)?shù)字,但是可以讓爸媽確信這個(gè)分?jǐn)?shù)確實(shí)及格了,但是具體多少分呢?對(duì)不起,?爸是?論如何都沒辦法從這串?dāng)?shù)字中推算出,甚?也?法知道到底是80分以上,還是80分以下。這類零知識(shí)證明被稱為「范圍證明」(Range Proof)。當(dāng)然我還要再捆綁一個(gè)數(shù)字簽名的零知識(shí)證明,「可驗(yàn)證計(jì)算證明」(Verifiable Computation Proof),向老爸證明,這個(gè)分?jǐn)?shù)曾被老師簽過名(我們這里假設(shè)是采用的BLS短數(shù)字簽名)??沈?yàn)證計(jì)算證明,你可以想象成我把老師簽名的過程用手機(jī)拍了下來,但是鏡頭里出現(xiàn)分?jǐn)?shù)的地方,我都把它馬賽克了。
又假如,我保存了?個(gè)你的秘密,?如說?特幣的助記詞,我可以向所有?出示?串?dāng)?shù)字,證明我沒有忘記你的助記詞,但是任何?都不能從這個(gè)證明中得到這個(gè)助記詞的任何?段。這類零知識(shí)證明又被稱為「知識(shí)證明」(Proof of Knowledge)。因?yàn)槿魏?都不能從這個(gè)證明中分析出更多關(guān)于助記詞秘密的內(nèi)容,因此這個(gè)證明是零知識(shí)的。換句話說,這個(gè)證明是?串?dāng)?shù)字,看起來就和隨機(jī)數(shù)?樣,沒有信息量。(這里有個(gè)小問題留給讀者:我如何向你的朋友們證明,這個(gè)助記詞對(duì)應(yīng)比特幣地址上的錢沒有被我花掉。有想法請(qǐng)后臺(tái)留言)
零知識(shí)證明的?處?常?泛,?家可以各種開腦洞,其中?個(gè)最直接也?常重要的?處就是敏感數(shù)據(jù)的保護(hù)。不管是成績單、病歷、賬本、密碼、等等等,你都可以把其中任何部分扣掉,換成?個(gè)很像隨機(jī)數(shù)的零知識(shí)證明,它能證明被扣掉的敏感數(shù)據(jù)仍然是可信的,真實(shí)的。(這?請(qǐng)?家開腦洞,還有哪些好玩的場(chǎng)景。)
在 zkPoD 中,零知識(shí)證明扮演了?常重要的??,數(shù)據(jù)的交付過程是以零知識(shí)證明的?式交付,買家先拿到的是?堆的零知識(shí)證明,當(dāng)然數(shù)據(jù)隱藏在這些數(shù)據(jù)中,但是從外部整體上看,這些看似?常隨機(jī)的數(shù)據(jù)中,是沒有任何辦法去得到關(guān)于原始數(shù)據(jù)的哪怕?個(gè)bit。(這?點(diǎn)可以證明,請(qǐng)?jiān)徫胰滩蛔〔?點(diǎn)學(xué)術(shù)術(shù)語:基于離散對(duì)數(shù)難題假設(shè)的「完美零知識(shí)」,Perfect Zero-Knowledge)理解零知識(shí)證明理論的核心是理解我上面反復(fù)提到的「模擬」這個(gè)暗黑并有趣的概念。這個(gè)我們以后再展開講。
參考文獻(xiàn)
[1] Pagnia, Henning, and Felix C. G?rtner. On the impossibility of fair exchange without a trusted third party. Technical Report TUD-BS-1999-02, Darmstadt University of Technology, Department of Computer Science, Darmstadt, Germany, 1999.
[2] Garbinato, Beno?t, and Ian Rickebusch. "Impossibility results on fair exchange." 10th International Conferenceon Innovative Internet Community Systems (I2CS)–Jubilee Edition 2010– (2010).
[3] Nakamoto, Satoshi. "Bitcoin: A peer-to-peer electronic cash system." (2008).
[4] Maxwell, G. "Zero knowledge contingent payment. 2011." URl: https://en.bitcoin.it/wiki/Zero_Knowledge_Contingent_Payment (visited on 05/01/2016) (2016).
[5] Greg Maxwell. “The first successful Zero-Knowledge Contingent Payment.”https://bitcoincore.org/en/2016/02/26/zero-knowledge-contingent-payments-announcement/
[6] Campanelli, Matteo, Rosario Gennaro, Steven Goldfeder, and Luca Nizzardo. "Zero-knowledge contingent payments revisited: Attacks and payments for services." In Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security, pp. 229-243. ACM, 2017.
[7] Dziembowski, Stefan, Lisa Eckey, and Sebastian Faust. "FairSwap: How to fairly exchange digitalgoods." Proceedings of the 2018 ACM SIGSAC Conference on Computer and CommunicationsSecurity. ACM, 2018.
[8] Groth, Jens. "Linear algebra with sub-linear zero-knowledge arguments." Annual InternationalCryptology Conference. Springer, Berlin, Heidelberg, 2009.
[9] Bootle, J., Cerulli, A., Chaidos, P., Groth, J., & Petit, C. (2016, May). Efficient zero-knowledgearguments for arithmetic circuits in the discrete log setting. In Annual International Conference on theTheory and Applications of Cryptographic Techniques (pp. 327-357). Springer, Berlin, Heidelberg.
[10] Bünz, Benedikt, et al. "Bulletproofs: Short proofs for confidential transactions and more." 2018IEEE Symposium on Security and Privacy (SP). IEEE, 2018.
[11] Gennaro, Rosario, et al. "Quadratic span programs and succinct NIZKs without PCPs." AnnualInternational Conference on the Theory and Applications of Cryptographic Techniques. Springer Berlin, Heidelberg, 2013.
[12] Parno, Bryan, et al. "Pinocchio: Nearly practical verifiable computation." 2013 IEEE Symposiumon Security and Privacy. IEEE, 2013.
[13] Groth, Jens. "On the size of pairing-based non-interactive arguments." Annual InternationalConference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2016.
[14] Doug Woos, James R. Wilcox, Steve Anton, Zachary Tatlock, Michael D. Ernst, and Thomas Anderson. Planning for Change in a Formal Verification of the Raft Consensus Protocol. CPP 2016, St. Petersburg, FL, January 2016.
[15] P?rlea, George, and Ilya Sergey. "Mechanising blockchain consensus." Proceedings of the 7th ACM SIGPLAN International Conference on Certified Programs and Proofs. ACM, 2018.
[16] Palmskog, Karl, et al. Verification of Casper in the Coq Proof Assistant. 2018.