路印 CTO Steve Guo:什麼樣的二層網絡才是真正的未來?
9月4日的 BeWater DevCon 2021 全球開發者大會上,路印 CTO Steve Guo,他曾任 Intel 高級研發工程師,獵豹移動高級研發總監,15歲考入科大少年班,博士學位。與現場的開發者,分享了"未來真正的二層網絡是什麼樣?"的主題演講。
分享內容概括如下: 1)真正意義上定義的二層網絡,應該是安全性要靠主網來保證。 2)二層網絡從狀態通道到Plasma,再演進到了Rollup,並分成了兩個分支:Optimistic Rollup 和 zkRollup。 3)二層網絡的最終形態是 zkEVM,大家不用改代碼,直接能把原有合約運行在 zkEVM 中。 大家好,我是路印協議的 CTO Steve Guo,很高興這次受邀參加 BeWater 的開發者大會。我今天想和大家探討的主題是什麼樣的二層網絡才是真正的未來。
一、什麼是二層網絡?
我們先從這一頁開始,就是定義什麼是二層網絡。在我看來像Polygon、xDai、BSC這樣的側鏈,嚴格意義上不算二層網絡。真正意義上定義的二層網絡,應該是他的安全性要靠主網來保證。
從技術角度、演化的角度來看,最早的二層網絡的技術叫狀態通道,之後演進到 Plasma,然後到最近很火的Rollup技術,然後Rollup又分為兩個分支,一個叫樂觀匯總------Optimism Rollup,一條道叫zkRollup。
我接下來的演講圍繞這幾個技術的演化來帶著大家走一遍目前二層網絡發展的整個歷史。
1、狀態通道
接下來我們先看第一種二層網絡技術,叫狀態通道。
狀態通道最早的起源應該是比特幣裡面的閃電網絡,然後在以太坊上,我印象中間最早的一個項目叫「雷電網絡」,它試圖去複製比特幣上閃電網絡這樣的技術。
整個狀態通道核心的思想是,比如說Alice和Bob經常要在線下轉賬的話,Alice和Bob就約定好,大家互相沖一筆錢到一個合約裡面,比如說A充5個B也充5個,之後在鏈下A和B就可以互轉,比如這張幻燈片裡面演示的,我可以B先轉給A一個,A就有6個幣,B是4個幣,之後A又轉三個幣給A,最後大家發現A只有3個幣,B有7個幣。
最終要到鏈上去結算的時候,才把最終的一個狀態到鏈上,這樣最後大家再分別退出,就比如最終大家能在圖上看到,A只有3個幣,B只有7個幣。
其核心就是在鏈下之後大家可以互相只用簽名確認的方式,就可以直接進行鏈下無限次的轉賬這樣一個思路。
他最大的缺點在於什麼?就是 A 和 B 一定要互相之間,先在主網上有一個確定的合約去部署。
之後其實像雷電網絡和 CelerNetwork 這樣的項目做了些擴展,把 A 和 B 之間的互相結算,推進成比如 A 跟一個 Hub,然後 B 也跟這個 Hub,C 也跟這個 Hub,有一個中心的類似於Hub 的方式,來把點對點的轉賬推進成點對網絡的轉賬。
但是這還是具有局限性,首先,需要提前抵押資金進智能合約,其次因為他整套技術只是圍繞「轉賬支付」這個角度來解決的。但是大家也都知道,區塊鏈最大的意義在於可編程的應用,而不僅僅是支付,之後的二層網絡技術就自然發展到了第二代 Plasma。
2、第二代 Plasma
上圖這種二層網絡技術叫 Plasma,在我看來他其實就是去嘗試著解決我剛剛提到的「狀態通道」解決方案中的資金要提前鎖定的問題。
他的解決思路是什麼呢?其實它的思路很簡單,鏈上還是要有個智能合約,但是任意的人都可以往這個鏈上的合約去充值也好、提現也好,都是和這個合約打交道。
對應在鏈下有一個叫 Plasma Chain 的概念,一旦資金進了這個合約之後,就可以在鏈下發起轉賬,Plasma Chain 他在不停的把大家在鏈下所發生的交易彙集打包到一起之後,把最終的狀態 Merkle 根遞交到主鏈合約上去保存記錄。
如果在一段時間內沒有人有異議的話,比如 7 天內大家都沒有異議,歷史記錄就不能再被更改。如果隨意一個人對 7 天內的轉賬有異議的話,他可以遞交 challenge,證明說某一筆轉賬是錯誤處理了,從而把資產最終給取出來。這樣一個思路就能解決狀態通道需要提前抵押資金的問題。
他最早的方案同樣也只支持轉賬支付這個場景,比如最早的 Plasma MVP,然後演進到 Plasma Cash、Plasma Debit ,這幾個諸如此類的項目。最終大家發現下來 Plasma 還是很難用。
首先第一個他有類似於七天或者兩周的退出挑戰期。
第二個他的安全性取決於什麼?Plasma Chain 往主鏈上遞交的僅僅只是個 Merkle 根,所有發生在 Plasma Chain 上的交易信息都是記錄在鏈下的,這說明什麼?這說明我必須依賴於提交這個 Merkle 根的這些 Relayer 是如實的在幹活的。
3、Optimistic Rollup
如何能解決 Plasma 的問題,自然的一个演進,就會演進到現在比較火的,叫 Optimistic Rollup。
大家看這張圖 Optimistic Rollup,其實他跟上面 Plasma 唯一的區別,在我看來,就是他遞交到主鏈上的不僅僅是世界狀態的 Merkle 根,而且他是把所有在鏈下發生的交易數據也同時上鏈了,然後允許任何的人在鏈上根據這些公開的區塊鏈上記錄的信息來做挑戰。
比如例子舉到的 S2 狀態切換到 S3 狀態的時候,如果有人有挑戰,他就能根據區塊鏈記錄的一些歷史信息說你處理的不對。
所以 Plasma 演進到 Optimistic Rollup,他的安全性依賴於「退出挑戰機制」這個是不變的,但是它解決了一個數據可用性問題,讓人直接能在鏈上根據已有的數據就去做這個挑戰,而不是要再結合鏈下的數據來做一筆挑戰,這是它最大的改進。
除此之外,Optimistic Rollup 同時還能支持轉賬之外的場景,他可以支持通用編程。
這樣的一個思想其實目前已經有兩個項目在朝著這條道走,一個叫 Optimism,還有一個叫 Arbitrum。
4、Optimism
我先說 Optimism,因為 Optimism 是最早出來說要做 Optimistic Rollup 的,這個團隊本身也跟 Plasma 一脈相承,所以像 Uniswap 最早也是說會最先部署在Optimism 上面。
他的核心思想其實就在於怎麼樣解決挑戰,就是說如果有一個人發現你在二層網絡上沒有如實的處理一筆交易,我該怎麼來挑戰這件事情,他把這個挑戰抽象成一個什麼?
就是在以太坊一層上他布了一個合約,這個合約接受什麼?接受他定義的叫 OVM 的指令集運行,你可以利用他遞交到主鏈上的公開信息,然後去驅動這個 OVM 的執行,如果這個 OVM 執行判定這些值不對,那你挑戰就成功了。
基本上 Optimism 的思路是 OVM 的指令集盡量的跟 EVM 是完全一致的,但其實他沒有做到百分之百的兼容,他有一部分的指令是修改了。
正是因為這些指令需要修改,所以導致他其實很難百分之百兼容 EVM,這可能也是他為什麼一直在延期,還沒最終主網上線的原因之一。
5、Arbitrum
Arbitrum 我覺得他正是看到了這樣的機會,就是說我在一層的智能合約裡面我再去執行類似於 EVM 指令集其實是很困難的一件事情。
我是不是能重新把 EVM 給改成我自己的VM指令,他叫 Arbitrum 的指令集,就是 AVM ,所以在一層智能合約裡面執行的其實是 AVM 指令集,這樣的一個思路本質上是能更比 OVM 的方式可能做到更高效一些。
同時他解決了 OVM 的 Optimism 挑戰機制裡面的一個比較大的問題,就是 Gas 消耗,挑戰一次的 Gas 消耗太高的問題,他的解決思路其實就是用分片挑戰,類似於二分法。
我先讓你說證明執行到一千步是正確的,然後我再縮小到 512,然後再 256,逐步的讓你分片的去執行一系列的指令序列,最終來做一個挑戰的輸出,成功還是失敗。
Arbitrum 主網是 8 月 31 號正式上線,陸續已經有好些項目遷移到 Arbitrum 上面,比如 Sushi、MCDex 等。
但是大家實際發現下來還是有些問題,就是原來大家以為這樣的二層網絡會極大的降低費用,但實際情況卻是 Arbitrum 的主網上一筆交易大概降低到主網上的 1/5 到 1/10 ,這還是遠遠低於我們的預期。我覺得可能要再提高一個量級,這樣才是真正的二層網絡。
二、zkRollup
我們接下來講第二個大分支zkRollup。
1、什麼是ZKP?
講到zkRollup就要先給大家講一講什麼叫ZKP,ZKP其實顧名思義就是零知證明,零知證明在幹一件什麼事情?
如果舉 f(X)=Y 這個例子為例,那就是我能證明說我知道一個 X 值,通過函數f計算能輸出 Y,但是我又不能告訴你 X 是什麼,然後我要讓你相信這件事情,這就叫一個零知識證明。其中函數f是公開,運算的結果 Y 也是公開的,但是我的X是私有的,不讓你知道。
我再舉個更直觀一點的例子大家來理解零知識證明,這張圖其實叫"尋找沃爾多",問題是想在這張大圖裡面試圖找到上面小人的位置在哪。
我要做一個零知識證明,就是我要讓你知道我在這張大圖裡面,這個小人的位置我是知道的,但是我又不能讓你知道這個小人的具體位置在哪。
大體的解決思路就要轉換問題,零知證明本質上就在轉換問題,我把 A 問題轉換成同等等價的,在另外一個域上 B 問題的證明,針對這個尋找沃爾多零知問題的解決,比如說我用一塊很大很大的黑布,我用黑布把沃爾多小人提前剪出來。
然後把這塊大黑布蓋在這塊畫面上,只透出小人,這樣我是不是就向你做了一個零知識證明,我能找到這個圖上小人在哪,但是你其實還是不知道這個小人具體在畫中的位置,因為被整個黑布給蓋著的。
2、zkRollup 介紹
再接下來我講一個 ZKRollup 的思想,ZKRollup 其實是一個技術的統稱。它的核心思想就是像我這裡面這張圖所表示的,世界狀態抽象成所有賬號組成的 Merkle 樹,賬號裡面有一些自己賬號相關的信息,這樣的 Merkle 樹有一個唯一的根就代表了當前世界狀態。
我在鏈下對賬號所做的改動,比如說可以是任意一筆交易去改一些賬號的信息,這叫交易 Tx 信息,我有在鏈下收集到所有的 Tx 信息之後,我可以針對每個Tx的處理引起的世界狀態的轉換做一個零知識證明。
我首先第一個要證明這個Tx是真實的,然後證明Tx能由前一個世界狀態變到下一個世界狀態,最終的世界狀態信息是記錄在鏈上的。
所以一旦某一個歷史狀態被在鏈上確認之後,永遠是不能改的,我就能根據不能更改的歷史記錄然後再加上之後的一系列 Tx,然後再證明推導出下一個新的世界狀態,然後最終一直不停的往鏈上更新最新的世界狀態,這樣一套系統叫 ZKRollup 的解決方案。
3、路印協議
我們路印協議是世界上第一個 ZKRollup 應用到主網上的實例。我們把ZKRollup這套思想擴展到了 Dex 交易上面。
我們針對 Dex 交易在之前剛剛介紹的 ZKRollup Account 模型上做了更進一步的抽象,比如我們抽象出在 Account 下面掛 Balance,Balance 下面再掛Trade History,但本質上還是大的 Merkle 樹,然後不停的把整個 Merkle 樹代表的世界狀態不停的更新到鏈上。
之後大家熟知的還有 Matter Labs 出的 ZKSync 方案,ZKSync方案目前演進到 2.0。1.0 跟我們路印協議很類似,只解決了轉賬、交易、支付這幾個場景,在 ZKRollup 的技術上其實大家是相同的,但只是大家選用的零知證明的算法不一樣。
我們路印協議選的是 Groth16 的算法,而 ZKSync 用的是 Plonk 的零知證明算法,之後 ZKSync 發布了 ZKPorter,ZKPorter 叫ZKSync2.0,
他的區別在哪呢? ZKSync1.0,大家記住,所有交易的數據都上鏈的。但是 ZKPorter 裡面,他為了提高 TPS,所有鏈下的交易信息是不上鏈的,而鏈下的交易信息類似於由一個 PoA 的這種小組,來幫你如實的保存鏈下交易數據。
ZKPorter 的方案我覺得不能完全說是 Z KRollup,ZKRollup 的思路一定是要把所有的Tx 信息也都遞交到鏈上,ZKPorter 其實他就跟我接下來要說的 StarkEx 的方案是有點像的。
回到 StarkWare 推出來的 StarkEx 的方案,這張圖是 StarkEx 整體的介紹,其實他內部的最核心的也還是組織成一個 Merkle 樹,用 ZKRollup 的思路來不停的更新世界狀態。
但它一上來就定義了自己的編程語言 Cairo,大家得用他的這套語言來寫,他再為用Cario 語言生成的程序執行生成零知證明。但是 StarkWare 和路印和 ZKSync 的區別又在於他選用的零知證明的算法叫 zkStark。
這三個零知識證明算法的核心區別在於…Groth16 是每個電路有任何改變都需要運行一次可信設置,這樣可編程性會相對差一些。但是他的優勢在於證明的大小是最小的,鏈上的證明驗證工作量也很小,所以他具有很大的成本優勢。
Plonk 他支持一種叫通用設置,就是我全局只要運行一次可信設置,以後你再改什麼電路就不用再運行可性設置。
ZKStark 就更進一步了,他就完全都不需要可信設置,我可以隨時的去更改電路,但他帶來一定的代價,就是他的證明的大小是最大的,鏈上的證明驗證工作量也是偏大的。
這可能也是 StarkWare 一開始推出來的時候不把交易數據放到鏈上的原因,否則他的上鏈成本還是挺高的。
這就是目前所有的二層解決方案的彙總,但我認為這遠遠還沒到我設想中的最終的二層網絡。
4、zkEVM
最終的一個二層網絡我覺得是叫通用的 zk 虛擬機,我定義叫 zkEVM。zkEVM有幾家也開始在做了,像 Hermez 在做,Matter Labs 也是想做通用的 zkEVM,StarkWare 的 Cairo 他本質上支持可編程,也算是一種 zkEVM。
但最終我覺得在以太坊生態上最好的一個方案還是讓大家直接不用改代碼,直接把智能合約編譯後的代碼運行在 zkEVM 虛擬機上,這樣的思路可能會是最終的一个未來。
以太坊基金會正好也在做這麼一個項目,我這張圖裡就是試圖總結以太坊基金會的zkEVM 思路。
大家看這張圖裡面的右上角,這是一個經典的馮洛伊曼的計算機模型。計算機會包括 CPU 處理器,然後處理器之外有存儲器,有內存,有你的硬盤,有你的外設這種。
存儲 CPU 和外設內存之間都通過總線來通信,取數據、存數據,這樣的一個思路,這叫馮洛伊曼經典計算機模型。
zkEVM 借鑒了這個模型,zkEVM虛擬機裡面的指令集直接就是 EVM 定義的指令集,每段程序代碼執行完之後就會有一段trace,我針對所有的 trace 來做一個證明,我證明這些 trace 是如實的按照程序代碼的指令執行而出的。
這裡面就涉及:
第一個我要證明每個 EVM 的指令執行是正確的,而且執行序列是正確的,這叫 EVM Proof;
第二個 EVM 的執行過程中間就會涉及,比如說我要去存取 storage 的值,我要在memory 中間甚至 Stack 中間去訪問變量,這三個------storage、memory、stack統一叫 state,針對這些 state 的存和取也都是要做相應的零知識證明,我去證明我這個存取的動作是對的。
EVM Proof 和 State Proof 之間有一個橋梁 Bus Mapping,這是總線的概念,就是表述 EVM 的指令要去訪問哪些具體的 state,並證明這些訪問是正確的。
這樣的一套系統一旦部署之後,所有的智能合約都能無縫的遷移過來,我覺得這可能才是真正最終的一個二層網絡的終極形態。
好,謝謝大家,有任何問題歡迎大家隨時跟我聯繫,大家如果對路印的代碼感興趣也可以直接訪問 github。也可以通過郵件跟我聯繫,謝謝。