前言
Layer1作為一種分佈式系統,為了達成共識需要高昂的通訊代價,並且大量的計算也會消耗昂貴的gas。所以,作為Layer1的擴展,Layer2的設計可以有效地提升Layer1的效率。但是從這個角度來說,Layer2的設計仍然面臨著和Layer1一樣的一大難題,就是如何平衡去中心化程度和高效性。
zkRollup是非常有前景的Layer2擴容方案,通過將計算搬到鏈下並向Layer1鏈上提供零知識證明的方式來實現。在實現zkRollup的方案當中,FOX系統採用了當下主流結構,主要有兩種節點,分別是Sequencer和Folder。簡單來說,Sequencer負責對用戶提交的交易進行排序打包,並且更新Layer2鏈上狀態,Folder負責對Sequencer打包的交易生成證明並提交到Layer1。
一個有意義的問題是,Layer2的節點是否應該是去中心化的,如果是,如何設計激勵機制來保證這一點。因為可以想像,Layer1效率低的本質就是,為了實現去中心化每個節點都需要進行大量的計算和通訊。而使用了Layer2系統,將計算過程解耦,如果在這部分依然用完全等效於Layer1的去中心化模式,則又會因為同樣的原因造成Layer2的擁堵,所以這裡需要做權衡。
激勵機制的設計就是通過調整Layer2節點獲得激勵手續費的方式以及平衡支付給Layer2節點的費用,來鼓勵節點參與Layer2系統維護。本質上,Layer2節點收到的激勵費用來源與以太坊一樣,來自於提交交易的用戶付出的Gas費。本文會探討在FOX的系統當中,FOX的節點如何參與系統收取手續費,以及這樣做的原因。
Gas的作用
首先我們來回顧Gas費在以太坊系統當中的作用。 Layer1的計算資源是有限的,用戶提交交易時候會指定交易Gas費,Gas費基本同交易的執行操作複雜度相關,而在此基礎上願意支付更高昂的Gas費的用戶可以獲得更優先的交易執行。礦工的激勵就來源於打包的區塊的Gas費總和。此外,Gas費機制還可以有效防止惡意合約(例如無限循環),限制區塊容量大小,這樣在一定程度上保障了安全性。
所以可以看出,對Gas費的合理利用,本質上是對鏈上計算資源的合理調度和分配,同時也是項目方、礦工和用戶的多方博弈。好的激勵機制的設計以及手續費的使用和分配對於系統運行至關重要。
交易上鍊流程
用戶提交交易給FOX系統當中的交易池同時要附加一筆用來激勵FOX節點的手續費,然後系統中的Sequencer節點將從交易池中抓取交易進行打包排序,這裡每次打包的交易就構成Layer2的區塊,同時Sequencer需要執行交易計算,並將計算結果傳到Layer1的FOX合約當中,並且,Sequencer還需要將交易數據存到ZK-Ringer當中來保障數據可用性。之後,Sequencer的排序結果以及計算結果會傳給Folder節點,Folder正確計算證明(包括證明聚合部分)並傳到Layer1的合約當中。在這個過程中,Sequencer對於交易的執行結果會在執行結束之後直接更新到Layer2當中,而交易真正被Layer1共識的時間節點可以認為是Folder的證明被驗證之後。
可以看到,在這個流程當中,用戶最初附上的手續費要涵蓋幾個用途:
支付給Sequencer的手續費
支付給Folder的手續費
Sequencer將交易結果提交到Layer1的Gas費
Sequencer將信息存儲到ZK-Ringer的手續費
Folder調用合約的Gas費
為此,我們需要梳理具體的機制來激勵各方參與。
FOX的激勵機制
FOX的激勵模式比較新穎。首先,為了平衡去中心化和效率的問題,我們將節點的角色分為負責排序以及執行交易的Sequencer節點,以及負責對交易執行正確性生成證明並聚合的Folder節點。 FOX的Folder節點採用了去中心化的模式,也就是說任何FOX礦工都可以接入網絡擔任證明生成者,為了鼓勵更多節點的參與,成功提交正確證明到Layer1合約的Folder可以獲得代幣獎勵。與此同時,為了避免算力浪費,我們指出,並不是只有第一個證明提交者可以獲得獎勵,在第一個證明提交者成功提交之後的一個時間窗口和數量窗口內(這裡具體參數會隨系統狀況進行調整),所有正確的證明者都可以獲得獎勵。
圖1:原始版本的激勵模式
然而在這種機制下,惡意的Folder會有一種很狡猾的攻擊。
當某一個惡意的Folder,記作Adv,在完成了證明生成之後,一方面將證明提交到Layer1中的Verifier合約進行驗證,另一方面它串通一些節點(或者就是該Folder控制的節點),將計算好的證明透露給這些節點,然後它們就可以不經過自己計算而直接將Adv計算好的證明提交,也可以領取到一部分獎勵,而這個過程之中他們沒有付出任何算力,從另一個角度來說,Adv通過較少的算力獲得了多份的收益,並且造成其它節點即便生成了正確的證明也難以爭搶過Adv。
圖2:惡意Folder的攻擊方式
在這個攻擊當中,產生問題的原因是Verifier無法區分每一份證明是否由該Folder獨立生成,因為證明值都是相同的。為了規避這個問題,我們需要將Folder的獨特的地址信息加入到Folder提交的證明當中,從而使得每一個Folder提交的證明都只能是自己獨立生成的而不能是其它節點提交的。
而融入這種信息的方法很巧妙,使用Fiat-Shamir heuristic(讀者可以參考FOX之前的文章《如何將交互式證明改造為非交互式?Fiat-Shamir Heuristic!》來了解技術細節)。按照生成證明的過程計算,其中一步,證明者,也就是Folder需要通過哈希函數來生成一個隨機挑戰值,只需要要求在這個哈希的輸入當中加入Folder的地址,就可以保證挑戰值與Folder的地址相對應,且仍然是一個Folder無法預測和控制的隨機數。
嚴格說明這種方法的安全性需要用到比較深入的密碼學中理論安全的隨機函數的概念以及不可區分性等等,我們不在這裡詳細討論。簡單來說,可以認為,由於哈希函數本身的安全性以及Fiat-Shamir heuristic結構的安全性,添加一個固定的值作為哈希的原像並不會破壞輸出的不可預測性,所以原來zkp算法的安全性仍然可以保證。
這樣一來,每個Folder就必須獨立進行證明生成而不能直接利用其它節點結果,從而實現了我們的目標。
圖3:修改後的激勵模式
結語
本文從節點手續費的重要作用角度出發,介紹了手續費與如何激勵節點參與系統維護之間的聯繫,同時指出,好的激勵機制可以有效地維護系統安全性。在此基礎之上,我們詳細討論了FOX當中採用的對於Layer2的Folder的激勵機制,並且解釋了這種做法的合理性,以及技術上如何巧妙地運用Fiat-Shamir heuristic來實現這一點。
參考文獻
《深度|迭代與競爭——以太坊的Layer2 擴容之路》國盛區塊鏈研究院https://www.theblockbeats.info/news/24443