2019年11月26日,同濟創業谷與 PPIO CodeTalks 聯合舉辦了《創新X - 區塊鏈與創新創業》區塊鏈技術分享會。在本次分享會中,咱們有幸邀請到了四位重量級嘉賓來作主題分享。算法
在本期文章中,咱們先向你們介紹由路印協議CTO,UVA基金合夥人 ,郭雄輝老師的主題分享——《零知識證實在區塊鏈上的應用》(原文稿有修改)框架
嘉賓簡介: 函數
郭雄輝老師15歲時考入中國科學技術大學少年班,2005年,他取得中科大計算機軟件與技術博士學位,並在Intel開始了他的職業生涯,擔任高級軟件研發工程師。性能
在接下來的幾年裏,他一直致力於安卓 ROM 的開發和定製工做,而且成爲真正的安卓專家。2015年,在他第一家創業公司——帛茂信息科技有限公司被收購以後,郭雄輝加入了在紐交所上市的獵豹移動,並擔任高級研發總監。在獵豹移動內部,他還推進了 contento 項目的立項工做。目前是路印協議CTO,UVA基金合夥人。學習
如下是郭老師的分享實錄:區塊鏈
「 其實區塊鏈的一個最重要的應用方向就是數據上鍊,保證數據公開透明,不可篡改。可是還有一個問題也要解決,就是數據上完鏈以後,其實有些隱私數據是不能公開的,至少是不能對全部人公開。好比你上市公司的不少的機密的合同,這種必須是私密的,可是同時也要上鍊,這怎麼辦?spa
如何作到鏈上數據的隱私保護,就須要用到我接下來介紹的這門技術—零知識證實。設計
我想大概問一下在座的同窗,有多少人聽過這個零知識證實,能夠稍微舉一下手。當我在朋友圈裏面說我要作一次零知識證實的分享後,居然有人跑過來問我說零知識是否是就是零基礎也能聽?我就說這是偏技術的,零知識不是零基礎,零知識證實其實仍是要會涉及不少大量的咱們在大學時代學過的數學的基礎,實話實說,你們要有必定的經驗才能作這件事情。
今天晚上我大概會介紹2塊,第1塊是零知識證實技術的一個簡單的概要,我儘可能讓你們能聽懂明白,不涉及這種公式的推導。而後第2個是我總結了目前在區塊鏈裏,零知識證實技術在區塊鏈中行業的應用方向。3d
1 零知識證實技術概要blog
咱們先來看第1塊,零知識證實技術的概要。這張圖你們一看應該能明白,爲何說零知識證實是零知識?
好比說我想證實,我知道一個函數的 input 的是X,那麼這個函數的 output 就等於 Y,可是我不能告訴你X是多少,這叫零知識。可是,我同時又要讓你相信,我知道這樣的一個 X 能算出 Y,這就叫零知識證實。
因此說這就是一個簡單的函數變換,這個函數你們可能沒什麼感受,咱們來舉兩個具體的例子。
零知識證實系統他會有幾個特性:第一個我給出一個證實,那麼「真的證實是假不了」,我這個證實必定是任何人均可以驗證它必定爲真;另一個是「假的真不了」,就是我給出一個假的證實,必定是過不了那套證實系統,你們必定能夠知道他是假的;第三個特徵就是證實過程不泄露任何知識,就是前面舉過的不泄露X值。
1.1 阿里巴巴與四十大盜
咱們來看兩個具體的例子,第1個就是舉一個阿里巴巴和40大盜的問題。
阿里巴巴知道如何經過某個門的密碼,可是他又不能告訴大盜,同時又讓大盜們相信他有這個密碼,他能過這個門,這怎麼辦呢?
阿里巴巴知道一個密碼能過這個門,可是阿里巴巴不能告訴大盜密碼。很簡單,咱們轉換一個思路,這個山洞是一個環形,大盜只要讓阿里巴巴隨機地從左邊或右邊進入山洞,若是阿里巴巴能從另一邊再出現,大盜就能夠肯定阿里巴巴知道密碼,而且阿里巴巴向大盜證實的過程當中並無泄露密碼。這個就是一個很典型的零知識證實對吧?阿里巴巴沒給出任何的密碼,可是大盜知道阿里巴巴有這個密碼。
1.2 尋找沃爾多
第2個,是小朋友很愛讀的一本書,叫尋找沃爾多。
這個例子其實就是從一張很大的圖中將沃爾多這我的物找出來,在這張圖上,我不能告訴你這我的物的具體位置在哪,可是我要讓你相信我能找出這個位置,那麼如何應用零知識證實來解決這個問題?
你們想想,我不能告訴你這我的的位置在哪,可是我要讓你相信,我知道這我的的位置在哪?這不就又是一種另外的零知識證實。OK這個問題怎麼來作?其實很簡單的辦法,用一塊黑布,而後黑布上,摳出這我的的形狀,而後我用黑布把原始的畫面再給蓋起來,只讓你看到那我的,那不就好了。我能找出人在哪,而後你又不知道在哪,你又不知道真實的地方在哪,這就是零知識證實。我知道一個祕密,可是我不會告訴你,可是你能知道我知道它的魅力所在。
1.3 零知識證實框架結構
經過前面兩個具體的例子,其實你會發現,咱們都要先把問題作一個簡單的變換,我必定要從原始的問題抽象出另一個問題,而後在另外的問題上給出證實,你就能相信我在原問題上也能知道答案,這就是它的核心思想。抽象成這張圖,你們看這張圖,
整體來講,一個零知識證實的框架會分爲四大塊,就4個步驟:
第1個,你們要把問題抽象出來,一般抽象問題咱們會表達成一個算數電路,或者理解成一段程序,一段運算,咱們叫生成電路。有了這個電路表達以後,咱們再構造一個約束系統,這套約束系統其實如今有好幾個,最經常使用的是R1CS約束系統,有了這套約束系統以後,咱們就把這個問題轉化成多項式可知足的一個問題,叫QAP問題。
後面我都會跳過這些細節的介紹,我對其中的流程作一個大概的介紹。我先把一個具體的計算問題轉化成多項式是能知足的一個問題。最後再在這個多項式知足的問題上再去構造這種零知識證實的算法,而後生成一個證實,在多項式知足問題上構造零知識證實算法能夠有多種技術實現,如今只介紹其中一個實現叫zk-snark。
1.4 計算到證實
假設我是要去算這個函數X^3+X+5,把其表達成加和乘的電路很簡單,就是先X平方再乘X就表達了一個X三次方,而後再加一個X再加5。這樣一個電路就表達了這個方程式。
有了這個電路以後,我要用一種約束系統來表達電路,
由電路表達以後生成一個約束系統,約束系統以後再到一個QAP的問題的歸結,而後QAP 問題獲得以後,再用零知識證實的各類算法、各類體系去給出生成最終的證實。
這就是整個零知識證實的一套框架系統。
2.路印協議3.0
目前咱們正在開發的路印協議的3.0版本是嘗試將零知識證實落地的應用場景之一。
其實路印協議是17年發起的一個項目,先後作了兩版分別是1.0與2.0,當時發現交易速度實在太慢了,在以太坊上每秒最多2~3筆的交易,這樣的性能是很難被實際使用的。
如何去解決這個問題,去年開始咱們就在考慮是否是能把零知識證實技術用到咱們協議當中。
我只要利用零知識證實來證實咱們如實撮合交易了,路印3.0核心的設計思想就在這張圖上體現了。
咱們把這個技術叫ZKrollup。
你們看圖中的每一個節點,表示一個account就是我一個帳號有多少錢,我有一批帳號,而後全部的帳號構成一個默克爾樹,用root就能表明當前全部的帳號世界狀態,我只要有一個根的root哈希,我就能表明着全部的帳號狀態,我只須要證實每一步狀態的更改都是在更改這個默克爾樹,好比說我交易A跟B:
我只要能證實 A 減 B 加一樣的餘額,你就能相信,個人確是如實的作了一筆撮合交易。
因此說你看其實咱們這裏面就會涉及一個智能合約,智能合約會存儲每個世界狀態的root哈希,而後同時咱們有個中繼模塊,會去收集每一個人發出的每筆交易,咱們叫tx。收集到以後,咱們就能對這一批交易構造零知識證實。其實咱們要證實的事情就是這個世界狀態的轉換,就是由前面鏈上已確認過的一個狀態,通過這麼多筆交易以後,會到達另一個世界狀態。我只要如實的證實這件事情,你就知道全部的的動做都是可驗證的。
爲何以前的TPS很慢,是由於你全部的動做都要在鏈上發生。
基於ZKRollup這樣的一個設計之上,咱們作了一些改進:第1個改進是咱們把默克爾樹給分層了,在咱們的體系上分爲三層。好比說若是是一個充值交易,我只須要改balance層就好了。若是我是一筆交易類型的,我就得先改 trade 層,而後再改balance,再改 account,再改默克爾 root。這樣的分層操做,能極大的減小電路的生成 size。
第2個咱們的改動點是在哪?一般的默克爾樹都是二叉樹,只有兩個左右節點,而後算一個哈希值,咱們的作法是改爲四叉樹,而後同時採用 Poseidon 哈希,這樣你會發現生成證實的時間極大的下降了。
而後整個這樣的一套 solution 完成以後,咱們就能從原來的兩筆交易每秒提升到目前的1400筆。這就是零知識證實能應用的一個方向,咱們把它叫擴容。
我大概就講這麼多,若是你們對路印協議感興趣,咱們都是 open source 的,你們均可以去學習,由於區塊鏈必然是擁抱開源精神。而後也歡迎你們跟我聯繫。
3. 問答環節
同窗問:
「若是說有4個 account,其中 account1 與 account2 發生交易,同時 account2 也與 account3 發生交易,那麼就做出了兩次狀態改變,咱們怎麼去證實這兩筆交易是被正確執行的?」
郭老師答:
「謝謝。你問的這個問題挺好的一個問題。其實這就涉及一個點,你提到的交易咱們叫Tx。每一筆交易實際上是有順序的,好比說咱們已經假定這樣的一個順序,你的整個的世界狀態的轉變就已經決定了,你遞交到鏈上數據的前後順序,就決定了你的交易的順序。明白這件事情嗎?由於全部的這種Tx的數據都到要鏈上,你把數據放到鏈上面的過程就已經作了個排序。」
想了解更多有關 PPIO 的信息,能夠移步官網:pp.io