#69
2018 / 公開文章 / 文章

看懂零知識證明(zero-knowledge proofs)

15 分鐘閱讀

嗨,早安!

上週六我與幾位區塊鏈領域的專家,共同在台灣網路治理論壇,討論區塊鏈目前的發展。想看錄影內容,可以點擊這邊。當天有兩個場次與區塊鏈有關,第一場次是討論區塊鏈的法規議題,最後場次是討論區塊鏈的發展。

不知道有多少會員,現在還有在挖礦?如果你挖的是以太幣,那麼你就和 Google 的共同創辦人 Sergey Brin 正在做同樣的事。

除此之外,他在上週的區塊鏈高峰會裡還提到「零知識證明」這個概念「實在是不可思議」(mind-boggling)。這讓大家開始好奇零知識證明究竟是什麼黑科技,為什麼會讓 Google 創辦人發出這樣的驚嘆?


在區塊鏈領域內,零知識證明(zero-knowledge proofs)是很有名的技術詞彙。但是,多數人討論到它就像討論到 MakerDAO 差不多,會紛紛點頭表示聽過,並尷尬地表示自己懂得不多。

零知識證明是區塊鏈領域公認困難的技術,這個技術才剛出來不久,現在開始瞭解應該是門檻最低的時候。但相對的,它也有還有很多有待改善的地方。今天我們先從區塊鏈跟零知識證明有什麼關係開始看起。

區塊鏈的兩難:隱私、可查驗

我們曾經用帳本比喻過區塊鏈,負責記帳的人叫做礦工。

礦工在記帳的時候,會先確定轉出地址(或帳戶)裡餘額還充足,且這些錢隨時可動支,還沒有被預定要花在其他地方。基於礦工的查核需求,目前許多區塊鏈的設計,是在網路上公開每個地址的交易明細,礦工電腦運行的軟體才有辦法逐一檢查地址裡面的餘額剩多少。

反面來說,因為交易明細都被迫公開在網路上接受礦工查核,導致大家只要知道對方的地址,就可以光明正大地查到他所有的交易紀錄,毫無隱私性可言。

用銀行帳戶來想,會更容易理解這件事可怕在哪。

這就像是別人只要知道我的匯款帳號,他就可以光明正大的上網查詢我銀行帳戶的收支紀錄。只不過現在可查詢的,是多數人比較少用的密碼貨幣收支記錄而已。例如你可以試著在這篇文章底下,找到文章作者的以太幣收款地址,再把地址貼到這裡的搜尋框內,就可以看到有多少人在何時打賞他。

那為什麼我們現在用的銀行轉帳服務,不需要公開自己的帳戶餘額,就能正確記帳呢?

銀行的轉帳服務是把個人帳戶資料完全對銀行公開,換句話說銀行完全知道你帳戶的收支紀錄,只不過銀行受到嚴格監管,不能對外公開這些資料。但是區塊鏈上並沒有銀行負責記帳,而是由全球運行挖礦軟體的礦工負責,所以區塊鏈的原始設計,才會是強迫大家都得公開帳戶資料。

因此,區塊鏈的發展面臨兩難困境:用戶想保有隱私,但是礦工記帳又必須知道用戶的交易紀錄才行。這符合我之前歸納出的結論:比特幣區塊鏈的「匿名公開」設計,其實正好與現實需求的「實名秘密」完全相反。

在過去幾個月,我們已經看到包含台灣在內的許多國家,都開始要求交易所將「實名認證」加入帳號的註冊流程中,這是為了防範犯罪。另外,今天我們也可以理解用戶未來會更重視密碼貨幣的交易隱私性,不希望像現在這樣完全公開在網路上。

但是,如果交易紀錄沒有公開,礦工就不能查核交易。這該怎麼辦呢?

零知識證明就是用在這個地方。

保持秘密,但可驗證

零知識證明(zero-knowledge proofs)的效果,等同於你不需要讓礦工知道你帳戶裡面確切餘額有多少,但是礦工仍然可以知道你的帳戶裡的錢,夠不夠錢支付這一筆消費。

我引用麻省理工學院多媒體實驗室(MIT Media Lab)對零知識證明的解釋:

你手上有兩顆撞球,分別是綠色和紅色,除了顏色之外這兩顆撞球一模一樣。假設我是紅綠色盲,因此,就我看來你手上拿的是兩顆一模一樣的撞球。

問題來了,請問你是否能在不提到任何顏色資訊的前提下,說服我這個色盲相信這兩顆球的顏色,確實不同?

當然可以!

你只要把兩顆球交給我這個色盲,然後要我拿到背後去隨意變換左右順序之後,再拿出來讓你「猜」原本在左手的球,現在換到了哪一手。

對你來說,你一眼就可以判斷本來左手拿的是綠色,現在綠色跑到右手去,根本不用猜,很輕易就能指出球換位置了。但是,這對色盲來說簡直驚訝!因為就我看來,這是完全相同的兩顆球,你肯定只是運氣好猜中的。

不過,只要重複做個幾次測試,我很快就會相信你說的,這兩顆球肯定有哪裡不同,只是我看不出來。而且,你也完全沒有透露任何關於顏色的資訊。

這就叫做零知識證明。

我們之間的互動中,完全沒有提到顏色資訊。換句話說,雙方對顏色這項資訊是「零知識」的情況下,你仍然能夠用其他方法,說服色盲相信兩顆球在顏色上的差異。

對看得到顏色的人來說,當然一眼就看出兩者顏色不同,但是對色盲又想知道兩顆球哪裡不同的人來說,就得用零知識證明的方法說服他。

你發現了嗎?

這裡的色盲就好像區塊鏈上的礦工,假如現在大家都沒有把交易明細公開在網路上,那用戶就得使用零知識證明這套方法,來說服查核的礦工,自己真的有這筆錢可以花,只是他看不到而已。

當然,用零知識證明來說服礦工自己有足夠多的錢,複雜度遠比說服色盲高得多,電腦的運算量會非常大。撞球只是方便理解的簡化舉例,但是兩者的邏輯完全相同。

很反直覺吧!所以,Sergey Brin 才會說這是個不可思議的技術。

現在我們再回過頭來看零知識證明對區塊鏈的重要性,就會清楚許多。透過零知識證明,可以讓原本在區塊鏈上看似零和遊戲兩個角色(使用者、礦工),現在可以同時兼顧各自的隱私性(secrecy)及查核需求(accountability)。

那麼,真的有人在用零知識證明嗎?

有的,最早使用零知識證明技巧的區塊鏈叫做 Zcash,實際的作法叫做 zk-SNARKs,這是許多零知識證明的做法之一,也是最有名的一個。

Zcash 可以將交易紀錄上的匯款者、收款者和金額都經過加密隱藏起來,因此礦工無從得知這些交易上的細節,但仍然可以驗證交易。不過,目前多數使用者在 Zcash 上的交易,還是選擇未經加密的作法。

為什麼?因為花費的成本比較高,下一段我們馬上會討論。

另外,以太坊(Ethereum)上的智慧合約目前也已經可以運用 zk-SNARKs 這套零知識證明的作法。但以太坊不完全是從隱私的角度切入,而是從節省運算成本的角度應用零知識證明。

透過 zk-SNARKs,以太坊礦工可以不用再重新執行交易的運算,而是只要對方提得出證明即可。大概就像我不需要真的知道你會高一到高三的數學,而只要看到高中畢業證書就能確定你懂高中數學。不過,這只有在製作證明的成本,遠低於實際運算成本的情況下才划算。

簡單來說,零知識證明是一套可以兼顧用戶隱私性、礦工查核需求的新作法。但是如同一開始我們所提,零知識證明才剛出現不久,還有許多弱點有待研究、改進。

技術值得期待

即便軟體開發者現在已經可以將 zk-SNARKs 應用在以太坊的智慧合約上,但實際上使用的人並不多。最主要的考量點,是 zk-SNARKs 所耗費的運算時間太長、運算量太大。

運算時間太長很好理解,就是原本礦工只要 1 秒以內就能完成查核的事,現在要花上 7 秒甚至長達 40 秒,這會拖慢整體區塊鏈的運作效率。

至於運算量太大,上週我們剛討論過,以太坊上礦工費的計算方式是單價(gas price)與運算量(gas limit)相乘。因此,將 zk-SNARKs 應用在智慧合約上,智慧合約的使用者就得付出高額的礦工費。如果又因為急件而提高單價的話,礦工費就更貴。

除此之外,目前以太坊的每個區塊(block)容量上限是 8,000,000 個 gas 左右。如果每次執行智慧合約就得花掉上百萬個 gas,那麼其他交易沒有空間寫入區塊,就只能等下一個區塊再寫,這等同於進一步拖慢了區塊鏈的運作速度。

在目前各種區塊鏈都以提升運作效率、解決規模化(scalability)問題為首要目標的情況下,採用零知識證明的優先序反而沒有那麼高。因此,距離區塊鏈廣泛採用 zk-SNARKs 應該還有幾年的時間要走,不需要過度驚慌。對研發人員來說,現在或許是個投入研究的好時機。

最後,我們再從監管的角度來看。

越注重隱私性的技術,犯罪者也越喜歡。原本警察可以根據比特幣區塊鏈公開在網路上的交易紀錄,清楚地追查交易流向,雖然不知道這些交易地址的背後操控者是誰,但只要搭配其他的資訊(例如 IP 位址)就有機會找到操控者。

但是,如果未來區塊鏈採用零知識證明,就會讓政府監管的難度變得更高。所以,未來政府會如何在用戶隱私與監管之間拿捏尺度,是很值得期待的部分。又或者從技術的角度來看,說不定幾年之後就又有新技術可以同時滿足兩者需求,就像是零知識證明同時滿足隱私、查核需求一樣。

本文感謝陳昶吾、梁智程協助審稿


推薦閱讀:降低開店門檻,0x 是交易所界的淘寶