V神长文:EVM Validiums的退出游戏和Plasma的回归
编译 | Waylandbrand.com未蓝加密
整理 | jk
特别感谢Karl Floersch、Georgios Konstantopoulos和Martin Koppelmann对反馈、审查和讨论的贡献。
Plasma是一类区块链扩容解决方案,它允许所有数据和计算(存款、提款和默克尔根除外)保持在链下。这为实现不受链上数据可用性限制的巨大可扩展性打开了大门。Plasma首次在2017年被提出,并在2018年经历了多次迭代,尤其是最小可行Plasma、Plasma Cash、Plasma Cashflow和Plasma Prime。不幸的是,由于(i)大量的客户端数据存储成本和(ii)Plasma的基本限制使其难以推广到支付之外的应用,Plasma已经在很大程度上被rollups所取代。
有效性证明(又称ZK-SNARKs)的出现使我们有理由重新考虑这一决定。使Plasma在支付方面发挥作用的最大挑战,客户端数据存储,可以通过有效性证明得到有效解决。此外,有效性证明提供了一系列工具,使我们能够创建运行EVM的类Plasma链。Plasma的安全保证不会覆盖所有用户,因为将Plasma风格的退出游戏扩展到许多复杂应用的根本原因仍然存在。然而,实际上仍然可以保护非常大比例的资产安全。
下文中,我将详细介绍 Plasma 是如何实现这点的。
概述:Plasma如何工作
要理解的最简单的Plasma版本是Plasma Cash。Plasma Cash通过将每个单独的代币视为一个独立的NFT,并为每个代币跟踪一个单独的历史来工作。Plasma链有一个运营者,负责制作并定期发布区块。每个区块中的交易都存储为一个稀疏的默克尔树:如果交易转移了代币k的所有权,它就出现在树的k位置。当Plasma链运营者创建一个新区块时,他们将默克尔树的根发布到链上,并直接将与用户所拥有的代币相对应的默克尔分支发送给每个用户。
假设这些是Plasma Cash链中最后三个交易树。那么,假设所有之前的树都是有效的,我们知道Eve目前拥有代币1,David拥有代币4,George拥有代币6。
任何Plasma系统中的主要风险都是运营者的不当行为。这可能以两种方式发生:
1. 发布无效区块(例如,运营者包含了一个交易,将代币1从Fred转给Hermione,即使Fred那时并不拥有该代币);
2. 发布不可用区块(例如,运营者没有将他的默克尔分支之一发送给Bob,阻止他向其他人证明他的代币仍然有效且未花费)。
如果运营者的行为与用户的资产相关,则用户有责任立即退出(具体来说,在7天内)。当用户(“退出者”)退出时,他们提供一个默克尔分支,证明了将该代币从前一个所有者转移给他们的交易的包含。这启动了一个为期7天的挑战期,在此期间,其他人可以通过提供以下三种之一的默克尔证明来挑战该退出:
1. 非最新所有者:退出者签署的后续交易,将退出者的代币转移给其他人;
2. 双重支付:将代币从前一个所有者转移给其他人的交易,在将代币转移给退出者的交易之前被包含;
3. 无效历史:在过去7天内转移代币的交易,没有相应的花费。退出者可以通过提供相应的花费来回应;如果他们不这样做,退出就会失败。
根据这些规则,任何拥有代币k的人都需要看到过去一周内所有历史树中k位置的所有默克尔分支,以确保他们实际上拥有代币k并且可以退出它。他们需要存储包含资产转移的所有分支,以便他们可以应对挑战并安全地退出他们的代币。
扩展到可替代代币
上述设计适用于非同质化代币(NFT)。然而,比NFT更常见的是可替代代币,如ETH和USDC。将Plasma Cash应用于可替代代币的一种方法是将每个小面额的代币(例如0.01 ETH)视为一个单独的NFT。不幸的是,如果我们这样做,退出的燃气费用将会太高。
一种解决方案是通过将许多相邻的代币作为一个单元进行优化处理,可以一次性转移或退出。有两种方法可以做到这一点:
1. 几乎按原样使用Plasma Cash,但使用复杂算法非常快速地计算出大量对象的默克尔树,如果许多相邻对象相同的话。这出人意料地并不难做到;你可以在这里看到一个Python实现。
2. 使用Plasma Cashflow,它简单地将许多相邻的代币表示为一个单一对象。
然而,这两种方法都遇到了碎片化的问题:如果你从购买咖啡的数百人那里每人收到0.001 ETH,你将在树的许多地方拥有0.001 ETH,因此实际退出这些ETH仍然需要提交许多单独的退出,使得gas费用变得过高。已经开发了碎片整理协议,但实施起来颇为棘手。
另一种方法是重新设计系统,考虑更传统的“未使用的交易输出”(UTXO)模型。当你退出一个代币时,你需要提供这些代币最近一周的历史,任何人都可以通过证明这些历史代币已经退出来挑战你的退出。
右下方0.2 ETH UTXO的提款可以通过显示其历史中任何一个UTXO的提款来取消,如图中绿色所示。特别注意,中左和下左的UTXO是祖先,但上左的UTXO不是。这种方法类似于2013年左右彩色代币协议中的基于顺序的染色思想。
实现这一目标有多种技术。在所有情况下,目标都是跟踪历史上不同点上“相同代币”的某种概念,以防止“相同的代币”被两次提取。
推广到EVM的挑战
不幸的是,将其推广到支付以外的EVM要困难得多。一个关键挑战是EVM中的许多状态对象没有明确的“所有者”。Plasma的安全性取决于每个对象都有一个所有者,这个所有者有责任监视并确保链上数据的可用性,并在出现任何问题时退出该对象。然而,许多以太坊应用并非如此运作。例如,Uniswap流动性池就没有单一的所有者。
另一个挑战是EVM不试图限制依赖性。在区块N中,账户A中持有的ETH可能来自区块N-1中的任何地方。为了退出一致的状态,一个EVM Plasma链将需要有一个退出游戏,在极端情况下,希望使用区块N的信息退出的人可能需要支付将整个区块N状态发布到链上的费用:成本高达数百万美元。基于UTXO的Plasma方案没有这个问题:每个用户都可以从他们拥有数据的最新区块退出他们的资产。
第三个挑战是EVM中无限的依赖性使得很难有证明有效性的一致激励。任何状态的有效性都取决于其他一切,因此证明任何一件事都需要证明一切。在这种情况下,由于数据可用性问题,通常无法使解决失败兼容激励。一个特别烦人的问题是,我们失去了UTXO-based系统中存在的保证,即对象的状态不能在其所有者不同意的情况下改变。这个保证非常有用,因为它意味着所有者总是知道他们资产的最新可证明状态,并简化了退出游戏。没有它,创建退出游戏就变得更加困难。
有效性证明如何缓解这些问题
有效性证明最基本的作用是在链上证明每个Plasma区块的有效性。这极大地简化了设计空间:这意味着我们只需要担心运营者的不可用区块攻击,而不是无效区块。例如,在Plasma Cash中,它消除了对历史挑战的担忧。这减少了用户需要下载的状态,从过去一周每个区块的一个分支,减少到每个资产的一个分支。
此外,从最新状态提取(在运营者诚实的常见情况下,所有提取都将从最新状态进行)不会受到非最新所有者挑战,因此在有效性证明的Plasma链中,此类提取根本不会受到任何挑战。这意味着,在正常情况下,提款可以立即进行。
扩展到EVM:并行UTXO图
在EVM的情况下,有效性证明还让我们能够做一些聪明的事情:它们可以用来实现ETH和ERC20代币的并行UTXO图,并用SNARK证明UTXO图与EVM状态之间的等价性。一旦拥有了这个,你就可以在UTXO图上实现一个“常规”的Plasma系统。
这让我们能够绕过EVM的许多复杂性。例如,在基于账户的系统中,有人可以在未经你同意的情况下编辑你的账户(通过发送代币给你,从而增加它的余额),这不重要,因为Plasma构建不是在EVM状态本身上,而是在与EVM并行的UTXO状态上,任何你收到的代币都将是独立的对象。
扩展到EVM:完整状态退出
已经有更简单的方案被提出来制作一个“Plasma EVM”,例如Plasma Free,以及在此之前的2019年的这篇文章。在这些方案中,任何人都可以在L1上发送消息,迫使运营者要么包含一个交易,要么使特定的状态分支可用。如果运营者未能做到这一点,链就开始回退区块。一旦有人发布了整个状态的完整副本,或者至少发布了用户标记为可能缺失的所有数据,链就停止回退。进行提款可能需要发布悬赏,这将支付某人发布如此大量数据的用户份额的燃气费用。
像这样的方案有一个弱点,即它们在正常情况下不允许即时提款,因为总是有可能需要回退最新状态。
EVM Plasma方案的局限性
这样的方案很强大,但不能为所有用户提供完全的安全保证。它们最明显的失败案例是特定状态对象没有明确的经济“所有者”的情况。
让我们考虑一个CDP(抵押债务头寸)的案例,一个智能合约,用户在其中锁定了代币,只有在用户偿还债务后才能释放。假设用户在CDP中锁定了1 ETH(按照本文写作时的价格约为2000美元),并有1000 DAI的债务。现在,Plasma链停止发布区块,用户拒绝退出。用户可以简单地永远不退出。现在,用户有了一个免费的选择:如果ETH的价格跌破1000美元,他们就放弃CDP,如果ETH的价格保持在1000美元以上,最终他们就会认领它。平均来说,这样的恶意用户会因此赚钱。
另一个例子是隐私系统,例如Tornado Cash或Privacy Pools。考虑一个有五个存款人的隐私系统:
隐私系统中的ZK-SNARKs保持了进入系统的代币的所有者与离开系统的代币的所有者之间的联系隐藏。
假设只有橙色已经提取,此时Plasma链运营者停止发布数据。假设我们使用带有先进先出规则的UTXO图方法,因此每个代币都与其下方的代币匹配。那么,橙色可以提取他们的预混和后混代币,系统会将其视为两个独立的代币。如果蓝色尝试提取他们的预混代币,橙色的更新状态将取代它;同时,蓝色将没有信息来提取他们的后混代币。
如果你允许其他四个存款人提取隐私合约本身(这将取代存款),然后在L1上取出代币,这个问题可以得到解决。然而,实际实施这样的机制需要隐私系统的开发者付出额外的努力。
还有其他解决隐私问题的方法,例如Intmax方法,它涉及将几个字节以rollup风格放在链上,以及一个类似Plasma的运营者在各个用户之间传递信息。
Uniswap LP头寸有类似的问题:如果你在Uniswap头寸中用USDC交易了ETH,你可以尝试提取你交易前的USDC和交易后的ETH。如果你与Plasma链运营者勾结,流动性提供者和其他用户将无法访问交易后的状态,因此他们将无法提取他们交易后的USDC。需要特殊的逻辑来防止这种情况发生。
结论
即便到 2023年,Plasma 依然是一个被低估的设计。Rollups仍然是黄金标准,并拥有无法匹敌的安全属性。这从开发者体验的角度尤其如此:没有什么能比得上应用开发者甚至不需要考虑他们应用中的所有权图和激励流动的简单性。
然而,Plasma让我们完全绕过了数据可用性问题,大大降低了交易费用。对于那些本来会是validiums的链来说,Plasma可以是一个重大的安全升级。ZK-EVMs终于在今年实现,这为我们重新探索这个设计空间提供了绝佳的机会,并提出更有效的构建方式,以简化开发者体验并保护用户的资金。
代币