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