前言
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