一文详解以太坊扩容方案:Rollup工作原理
Arbitrum Rollup是一个链外协议,由链上Ethereum合约管理。一个dapp开发者有一组用Solidity编写的合约,开发者将这些合约编译成Arbitrum虚拟机(VM),在Arbitrum Rollup上运行。你希望它们能快速运行。
Rollup的基础知识让我们从基础知识开始。你的虚拟机的状态被组织成一个Merkle树,所以可以计算出虚拟机状态的加密哈希。在协议中的任何一点,虚拟机的某个状态都是完全确认的和最终的。它的哈希值存储在链上。
协议的参与者可以做出一个可争论的断言(DA),该断言声称,从某个状态哈希开始,在一些技术前提条件下,虚拟机可以执行指定数量的计算步骤,从而得到指定的新状态哈希,并且在计算过程中虚拟机进行指定的支付和发出指定的日志事件。DA可能是有效的(即真实的)或无效的。做出DA的一方将被要求对DA的有效性进行押金。(更多关于赌注和它们如何工作的内容将在下面介绍。)
如上图所示,一个可争议的断言创建了一个逻辑决策点,协议最终要解决这个问题。如果DA有效,系统将进入右上角的新状态,有一个新的状态哈希,并有DA中指定的副作用(支付和日志)。或者在另一个分支上,DA无效,它被拒绝,状态不变。旧的Arbitrum协议最初的Arbitrum协议每次处理一个可争论的断言。某个当事方会提出一个DA,然后会有一个质疑期,在此期间任何人都可以对DA提出质疑。如果没有人提出质疑,则确认DA;否则将运行争议协议,取消DA(为安全起见,以防提出者和质疑者合谋 "烹制 "争议结果)。
这很简单,但有两个缺点。首先,由于一次只能有一个诉讼请求,虚拟机的进展速度将受到限制。本质上,在每个挑战期内都必须停止进展。第二,恶意方可以通过故意挑战为该虚拟机制作的所有DA来冻结该虚拟机。这将使攻击者付出一系列的赌注,但如果他们愿意付出这个代价,他们可以至少在某些情况下长时间地保持进度。
新的和改进的我在这篇文章中介绍的新的Arbitrum Rollup协议解决了上述两个缺点。多个DA可以被 "管道化",这样一个虚拟机的进度就像验证节点可以模拟虚拟机的计算一样快。其次,正如我们在下面会看到的那样,一个恶意行为者不能减慢进度,他们只能暂时延迟链上对结果的认可,而这些结果对诚实的各方来说已经是 "不可信的最终结果"。
那是怎么做到的呢?让我们来挖掘一下新协议......
每个状态最多可以有一个DA跟随它。如果一个DA没有跟随状态,那么任何人都可以创建一个跟随它的DA,创建一个新的分支点。结果将是一棵可能的未来树。
这个树状图表示了未来的多种可能性stake协议的另一个重要部分是staking。任何人都可以放一个stake在树上的一个方格上。通过在一个方格上staking,你是在断言这个方格最终会被协议所确认。换句话说,你是在断言你已经在从当前状态到你所staking的方格的路径上的每一个DA采取了正确的分支。如果你错了,你可以预期失去你的stake资产。staking的行动不能被撤销。你可以将你的stake向右移动--在每个分支点选择向上或向下--但你不能向左移动,因为这相当于撤销你之前做出的stake承诺。
做出可争论断言的一方需要在该DA的 "DA有效 "继承人上staking。通常情况下,他们可以通过将现有的赌注移动到右边,将其放在所需的继承方格上来满足这一要求。在极少数情况下,如果他们不能做到这一点,他们可以在所需的方格上放置一个额外的stake。但要注意的是,他们就会在两条不一致的道路上staking,这样他们最终至少要失去两个stakes中的一个--自相矛盾可不是明智之举)。)
关于赌注还有一个细节:如果你所赌的方块被确认并成为公认的历史,你可以选择收回你的赌注。这意味着,如果你是正确的,你可以将你的赌注保留在原地,等待系统 "赶上 "你,然后你就可以收回你的赌注。
在这一点上,你可能会担心,可能性的树状图会变得非常大,而且‘枝繁叶茂’。这在实践中是不可能发生的,因为这需要多方对相互不一致的结果进行押注。他们中只有一个人可以是正确的,而其他人都会失去他们的利益。更有可能的是,这棵 "树 "实际上是一个有效的DA链,一个接一个,而且所有的赌注都在同一个结果上。staking期限
我们需要系统在时间过长之前,对每个可争议断言做出决定。所以,当一个DA被添加到链上,创建一个分支点时,会有一个deadline与该DA相关联。这个deadline在未来足够远,如果大家选择这样做的话,就有时间检查这个DA是否有效,并在链上得到一个交易来押注这个DA的结果。如果有人想承诺支持或反对该DA的有效性的赌注,他们必须在截止日期之前这样做。(在截止日期后,仍然可以引入利害关系,但他们不参与决定支持或反对该DA。) 一旦到了最后期限,所有与决定该诉讼请求有关的利害关系都将被告知。
争议如果Alice和Bob分别位于不同的位置,那么有两种情况之一是真的。要么是有一条从其中一个到另一个的向右移动的路径--这意味着他们的主张是一致的--要么就没有这样的路径。如果没有一条向右移动的路径连接Alice和Bob的方块,那么他们一定是在某些事情上有分歧。他们之间总会有一个独特的争议点--一个独特的DA,对于这个DA,他们中的一个人以这个DA有效为赌注,而另一个人则以它无效为赌注。
每当双方发生争议时,系统可以启动双方之间的交互式争议解决协议。我没有篇幅在这里描述争议解决协议--我只想说,这是一个类似于我们在其他Arbitrum文件中描述的二段式互动协议。
争议解决协议的结果是,有一方将被认定为不正确。该方将丧失其利益。赌注将被从其所在的链上抹去。其中一部分将交给争端中的另一方,其余的将被销毁。
多个纠纷可以同时进行,但每个赌注者一次最多只能参与一个纠纷。因为输家的赌注会被抹去,所以每次纠纷都会减少系统中的分歧量。输掉赌注的当事人如果愿意可以重新赌注,但新的赌注将无法影响赌注期限已经过去的DA。这样做的效果是,在一个DA的赌注期限过后,争端将逐步消除关于如何处理该DA的任何分歧。
确认结果当一个DA的下注截止日期过后,所有剩余的及时(下注截止日期前)下注都在该DA的同一分支上,系统可以确认该DA的结果。该DA被接受或拒绝,当前状态移动到该DA右侧的相应方格。
如果DA被确认为有效,例如如支付,就会在链上生效。虚拟机的状态就是这样向前移动的。
在一般情况下,当事人会诚实地行事,因为他们不想因为押注在虚假的索赔上而失去自己的赌注。只有有效的DA才会被断言,在一个单一的链条上,没有人会在任何DA的无效分支上押注。在这种情况下,每一个DA都可以在其押注期限到期后立即得到确认。
为什么它是去信任的Arbitrum Rollup的一个重要属性是它是去信任的--一个诚实的一方可以迫使虚拟机表现正确并取得进步。要知道为什么,想象一下,Alice总是在每个DA上押在真实的分支上,如果树曾经空了,她就会断言DA。
因为Alice是在真实的树状图上staking,所以她会赢得她所陷入的每一场纠纷。如果其他人不同意Alice的观点,他们要么(a)在与第三方的无关纠纷中失去自己的股权,要么(b)最终与Alice发生纠纷,并将股权输给她。无论哪种情况,所有与Alice意见相左的人最终都会失去自己的股权。只有与Alice意见一致的stake才会存活,所以Alice在树上的路径最终将是唯一一条有及时stake的路径--而Alice的路径将被确认。
因为这种方式的系统是不可信的,如果Alice被押在一个方块上,并且她知道通往那个方块的路径是真实的,那么Alice就可以确定自己所在的方块最终会被确认。对于Alice来说,那条路径就如同最终的一样。
即使你没有被押在一条路上,如果你看到有好几个人被押在这条路上,而且你相信这些人中至少有一个人是诚实的,那么你可以肯定那条路最终会被确认--就你而言,那条路就是最终的路。
去信任最终性的好处
为什么说结果的去信任性是有价值的?经典的例子来自于之前对其他rollup协议的讨论。假设一个虚拟机要向Alice进行支付。支付事件是在诚实的路径上,但要在链上确认支付发生的方块,还需要一段时间。
去信任性的结果就是给Alice提供了一个马上拿到钱的方法。如果Bob有立即支付的钱,他可以马上把钱给Alice,作为交换,Alice把未来尚未确认的付款转让给Bob(加上支付给Bob的最低费用)。Bob只有在他能确定付款会真正发生的情况下才会想这么做。Bob可以通过押注诚实的结果来确定这一点--那么他就会对付款最终会发生充满信任的信心。不仅仅是Bob能做到这一点,任何有资金的人都可以借给他。任何有资金的人都可以用同样的方式把资金借给Alice和其他像她一样的人。这些人可以通过提供更低的费用来相互竞争,促使Alice马上获得资金的成本降低。关键的一点是,这种市场机制的可行性取决于去信任的结果。如果 "每个人 "都已经知道这件事最终会被确认,那么一件事在链上确认的延迟就不会有那么多不便。
不仅对于支付是如此,对于虚拟机做的其他事情也是如此。如果虚拟机要发出一个日志项,宣布某件事情已经发生,那么去信任的结果意味着任何人都可以肯定地行动,该日志项将在链上得到确认。
延迟攻击因为这个系统是有去信任性的,所以坏人不能强行制造错误的结果。他们可以尝试做的是减缓进展。这样做需要他们牺牲利害关系,如果利害关系的金额很大,那么代价就会很高。
让我们想象一下,有人有动机发动延迟攻击,而且他们愿意牺牲利害关系。他们能造成的最坏的损失是什么?
首先要注意的是,坏人无法阻止诚实的当事人继续建立出诚实的路径。而且他们也无法阻止诚实方在最终确认诚实分支的过程中获得去信任的信心。
攻击者能做的就是在假分支上staking,以延迟诚实路径的链上确认。他们每放一个stake,就会对诚实方多产生一次纠纷,在这种情况下,诚实方就会拿走攻击者的一大块stake。一旦攻击者的所有stake都被拿下,链上进度将继续进行。
如果攻击者将多个赌注放在虚假的结果上呢?那么这些赌注就必须在纠纷中逐一拿下。如果有多人押注在诚实的结果上,这些人都可以对攻击者进入纠纷,同时努力拿下攻击者的赌注。而且注意,大家都会很清楚发生了什么事,很多人都会想参与进来,押注在真实的结果上,这样他们就可以加入到利用纠纷抢夺攻击者股权的喂养狂潮中。如果有K人在诚实的一方下注,那么攻击者将花费K个赌注来购买一个争端期的延迟。如果攻击者下更多的赌注,那很可能会吸引更多的老实人赌注。这对攻击者来说是个不好的动态。
优化
可以进行各种优化,以减少操作协议所需的链上记账量,降低链上气体成本,并使针对延迟攻击者的有益喂养狂潮更容易上演。我不会在这里钻研这些优化,这篇文章已经够长了。
前进的道路
我们正在Offchain实验室构建这个协议。预计这个Arbitrum Rollup协议将很快被推送到我们的开源代码库中。