头条
Plasma 让我们完全绕过了数据可用性问题,大大降低了交易费用。
撰文:Vitalik Buterin
编译: jk,Odaily 星球日报
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 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 中的许多状态对象没有明确的「所有者」。Plasma 的安全性取决于每个对象都有一个所有者,这个所有者有责任监视并确保链上数据的可用性,并在出现任何问题时退出该对象。然而,许多以太坊应用并非如此运作。例如, Uniswap 流动性池就没有单一的所有者。
另一个挑战是 EVM 不试图限制依赖性。在区块 N 中,账户 A 中持有的 ETH 可能来自区块 N-1 中的任何地方。为了退出一致的状态,一个 EVM Plasma 链将需要有一个退出游戏,在极端情况下,希望使用区块 N 的信息退出的人可能需要支付将整个区块 N 状态发布到链上的费用:成本高达数百万美元。基于 UTXO 的 Plasma 方案没有这个问题:每个用户都可以从他们拥有数据的最新区块退出他们的资产。
第三个挑战是 EVM 中无限的依赖性使得很难有证明有效性的一致激励。任何状态的有效性都取决于其他一切,因此证明任何一件事都需要证明一切。在这种情况下,由于数据可用性问题,通常无法使解决失败兼容激励。一个特别烦人的问题是,我们失去了 UTXO-based 系统中存在的保证,即对象的状态不能在其所有者不同意的情况下改变。这个保证非常有用,因为它意味着所有者总是知道他们资产的最新可证明状态,并简化了退出游戏。没有它,创建退出游戏就变得更加困难。
有效性证明最基本的作用是在链上证明每个 Plasma 区块的有效性。这极大地简化了设计空间:这意味着我们只需要担心运营者的不可用区块攻击,而不是无效区块。例如,在 Plasma Cash 中,它消除了对历史挑战的担忧。这减少了用户需要下载的状态,从过去一周每个区块的一个分支,减少到每个资产的一个分支。
此外,从最新状态提取(在运营者诚实的常见情况下,所有提取都将从最新状态进行)不会受到非最新所有者挑战,因此在有效性证明的 Plasma 链中,此类提取根本不会受到任何挑战。这意味着,在正常情况下,提款可以立即进行。
在 EVM 的情况下,有效性证明还让我们能够做一些聪明的事情:它们可以用来实现 ETH 和 ERC 20 代币的并行 UTXO 图,并用 SNARK 证明 UTXO 图与 EVM 状态之间的等价性。一旦拥有了这个,你就可以在 UTXO 图上实现一个「常规」的 Plasma 系统。
这让我们能够绕过 EVM 的许多复杂性。例如,在基于账户的系统中,有人可以在未经你同意的情况下编辑你的账户(通过发送代币给你,从而增加它的余额),这不重要,因为 Plasma 构建不是在 EVM 状态本身上,而是在与 EVM 并行的 UTXO 状态上,任何你收到的代币都将是独立的对象。
已经有更简单的方案被提出来制作一个「Plasma EVM」,例如 Plasma Free,以及在此之前的 2019 年的这篇文章。在这些方案中,任何人都可以在 L1 上发送消息,迫使运营者要么包含一个交易,要么使特定的状态分支可用。如果运营者未能做到这一点,链就开始回退区块。一旦有人发布了整个状态的完整副本,或者至少发布了用户标记为可能缺失的所有数据,链就停止回退。进行提款可能需要发布悬赏,这将支付某人发布如此大量数据的用户份额的燃气费用。
像这样的方案有一个弱点,即它们在正常情况下不允许即时提款,因为总是有可能需要回退最新状态。
这样的方案很强大,但不能为所有用户提供完全的安全保证。它们最明显的失败案例是特定状态对象没有明确的经济「所有者」的情况。
让我们考虑一个 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 终于在今年实现,这为我们重新探索这个设计空间提供了绝佳的机会,并提出更有效的构建方式,以简化开发者体验并保护用户的资金。
特别感谢 Karl Floersch、Georgios Konstantopoulos 和 Martin Koppelmann 对反馈、审查和讨论的贡献。