Loopring,路印,一直專注在高性能的去中心化交易協議。路印協議的目標是想實現以太坊上基于訂單撮合的去中心化的交易協議。從2017年,路印
Loopring,路印,一直專注在高性能的去中心化交易協議。路印協議的目標是想實現以太坊上基于訂單撮合的去中心化的交易協議。從2017年,路印從“環路撮合”的最初設計,經過了1.0,2.0以及3.0的三個大的版本的協議升級。1.0/2.0,相對來說,受限以太坊本身性能的限制,交易流程復雜,體驗和中心化交易所相比,有較大的差距。路印協議3.0,是一種大膽的設計和嘗試,通過零知識證明技術(ZKP),兼顧去中心化和交易性能。
本文對比路印協議2.0/3.0,分析zkSNARK零知識證明技術如何在路印3.0協議中運用。
1. 路印協議1.0/2.0
路印協議在2.0版本之前,雖然有一些細致的功能和改進,但是,從框架上來說,沒有本質的改變:
鏈下主要由Relay維護訂單(Order Management)和完成訂單的撮合(Settlement Engine)。完成撮合的訂單,需要在鏈上記錄(由鏈上的智能合約實現)。簡單的說,2.0協議之前,采用的是“鏈下撮合,鏈上記錄“的方式。在這種方式下,所有的交易狀態記錄在鏈上,鏈上的智能合約需要實現很多邏輯:
· 檢查訂單的簽名信息
· 檢查訂單的填充率以及是否取消
· 檢查訂單的時間
· 計算費率
· 在上述檢查和計算完成后,完成token之間的轉賬
往往一個撮合中包括多個訂單,完成這樣的一筆撮合大概需要20w~30w的GAS費用。也就是說,在以太坊區塊最大GAS 800w,出塊速度是15秒的前提下,路印2.0協議的撮合性能大概是:每秒大約2筆撮合。
2. 路印協議3.0
采用零知識證明(ZKP)技術,路印協議3.0所有的撮合邏輯都在鏈下完成。每一筆撮合(Settlement)都會生成證明并提交到鏈上,證明鏈下的撮合正確無誤。路印協議3.0的設計文檔發布在Github上:
https://github.com/Loopring/protocols/blob/master/packages/loopring_v3/DESIGN.md
路印協議3.0的框架如下:
2.1 鏈上/鏈下同步
路印協議采用和以太一致的“賬戶”模型,所有的賬戶的“狀態”(余額)都記錄在鏈下。
所有和狀態相關的操作,都是在鏈下更改,提交Proof到鏈上記錄。因為存在鏈上鏈下的狀態同步,賬戶的任何操作有三個狀態:
1/ Committed (操作已經提交)2/ Verified (該操作已經提供了相應的Proof)3/ Finalized(之前的所有的操作都已經提交正確的Proof)
以用戶Deposit“充值”的操作為例:
用戶轉賬到路印協議的智能合約,轉賬在鏈上確認(鏈上完成充值)。該操作的狀態就是“Committed”。鏈下的Relay,監測到“Committed”的狀態后,更改鏈下的狀態,生成Proof,并將證明提交到鏈上,此時該“充值”操作的狀態為“Verified” - 鏈下也已經完成充值。如果之前的所有操作都是Verified,那該操作的狀態就是Finalized(也就是這個狀態是確定的,不會被篡改的)。
2.2 鏈下狀態和操作
為了支持DEX的業務場景,并結合ZKP的技術要求,路印3.0將鏈下的狀態用三層的四叉Merkle樹來表示:
第一層是N層的四叉樹,維護DEX的所有賬戶信息(也就是能支持400w左右的用戶)。
第二層是M層的四叉樹,支持一個賬戶下的所有Token信息。一個Token一個葉子節點。
第三層是K層的四叉樹,一個賬戶下某個Token的Order信息。
所有的操作,都會更改這三層Merkle,完成狀態的變化。路印3.0協議支持如下的一些操作:
1/ On-chain Deposits (在線充值)
2/ On-chain Withdrawals(在線提幣)
3/ Off-chain Settlements (鏈下撮合)
4/ Off-chain Withdrawals (鏈下提幣)
5/ Off-chain Order Cancellation(鏈下取消訂單)
6/ Off-chain Transfers (鏈下轉賬)
大部分操作都比較容易理解,需要說明的是2和4。因為每個操作都需要經歷三個狀態,需要鏈上鏈下的同步,所以, 用戶既可以從鏈上,也可以從鏈下發起提幣操作。
2.3 ZKP證明
路印3.0,采用的是zkSNARK的Groth16算法提供零知識證明。針對每種操作,Relay都會提供對應的ZKP證明電路。以鏈下撮合為例,相應的電路證明的邏輯如下:
假設Account X鏈下轉賬給Account Y。ZKP證明電路,包括:
1/ TradeHistory中Order Ox的變化導致TraderHistory的樹根的變化
2/ TradeHistory中Order Oy的變化導致TraderHistory的樹根的變化
3/ Balance Bx變化導致Balance的樹根的變化
4/ Balance By變化導致Balance的樹根的變化
5/ 兩個賬戶的Balance的變化一致
6/ Account X和Account Y賬戶的變化導致的Account樹根的變化
注意,不同的操作會有不同的電路對應。簡單的說,鏈下的狀態的變化,都會對應不同的電路,并且,電路生成的證明會提交到鏈上。鏈下的狀態變化,“固化”成規則,并通過ZKP的電路表示。這種思路,和以太坊的zk Rollup的思路一致。
在鏈上,雖然智能合約不再需要驗證和記錄撮合信息,但是,需要提供Order信息以及各種操作的證明。Order信息可以通過Calldata存儲在鏈上。在鏈上驗證Groth16的Proof,還是比較昂貴的。一個Proof的驗證,目前需要50w左右的GAS費用。在君士坦丁堡升級后,可以降到原來1/4左右。
為了進一步節省鏈上的GAS費用,路印3.0設計了“Batching”的操作處理(批量處理),也就是多個同類操作,一起生成一個Proof。多個同類操作,被打包在一起,稱為“Block”(和區塊鏈中的Block不是一個含義)。
3. 性能對比
在足夠多的交易的情況下,路印3.0的TPS在目前的以太坊上達到了350。在君士坦丁堡升級后,TPS能達到1400。每筆交易平均下來的費用大約在1美分。
總結:
Loopring,路印,一直專注在高性能的去中心化交易協議。從2017年,路印從“環路撮合”的最初設計,經過了1.0,2.0以及3.0的三個大的版本的協議升級。路印協議3.0,通過零知識證明技術(ZKP),兼顧去中心化和交易性能。在鏈下維護Account模型的賬戶狀態,每個操作都通過ZKP,生成證明并存儲到鏈上,保證鏈下的狀態可靠安全。在足夠多交易的情況下,目前路印3.0協議的TPS可以達到350。每筆交易平均下來的費用大約在1美分。(Star Li)