特别感谢 Karl Floersch、Georgios Konstantopoulos 和 Martin Koppelmann 对反馈、审阅和讨论的贡献。

Plasma 是一类区块链扩容解决方案,允许 deposits、提款和 Merkle roots 之外的所有数据和计算都在链下进行。这为实现超大规模的可扩展性提供了可能性,而不受链上数据可用性的限制。Plasma 首次于 2017 年提出,并在 2018 年经历了多次迭代,其中最显着的包括小型便携式 Plasma、Plasma Cash、Plasma Cashflow 和 Plasma Prime。然而,由于主要涉及到大型客户端数据存储成本和 Plasma 的基本限制,导致其难以推广到支付额外的复杂应用,因此 Plasma 在很大程度上已被 Rollups 取代。

有效证明(ZK-SNARKs)的出现给我们提供了重新考虑这一决定的理由。使 Plasma 在支付方面发挥作用的主要挑战之一,即客户端数据存储,可以通过效率证明得到有效解决。另外,validity 证明提供了各种工具,使我们能够创建一个 Plasma 的链来运行以太坊虚拟机(EVM)。Plasma 的安全性保证可能无法覆盖所有用户,因为 Plasma 式的退出游戏难以推广到许多复杂应用的根本原因仍然存在。然而,在实践中,仍然可以确保非常大比例的资产安全。

本文描述了如何将 Plasma 重组以实现这一目标。

概述:Plasma 的工作原理

最容易理解的 Plasma 版本是 Plasma Cash。Plasma Cash 的工作原理是将每个单独的代币视为独立的 NFT,并为每个代币跟踪单独的历史记录。一个 Plasma 链有一个操作员,负责生成并定期发布区块。每个区块中的交易以稀疏的 Merkle tree 形式存储,如果一笔交易转移了代币 k 的所有权,它就会出现在树的第 k 位置。当 Plasma 链操作员创建一个新的区块时,他们会将 Merkle tree 的根发布到链上,并直接向每个用户发送相应于该用户拥有的代币的 Merkle branches。

假设这是 Plasma Cash 链中的最后三棵交易树,并假设所有先前的树都是有效的,我们知道 Eve 目前拥有代币 1,David 拥有代币 4,George 拥有代币 6。

在任何 Plasma 系统中,主要的风险是操作者的不当行为,通过两种方式发生:

发布无效区块。例如,操作者在其中包含一笔交易,即使 Fred 在那个时候不拥有代币 1,也将其发送给 Hermione。

发布不可用的区块。例如,操作者未向 Bob 发送他的一个区块的 Merkle branches,使他无法向其他人证明他的代币仍然有效且未使用。

如果操作员以与用户资产相关的方式不当行事,用户有责任立即退出(具体而言,在 7 天内)。当用户("退出者")退出时,他们提供一个 Merkle branches,证明了将该代币从先前所有者转移到他们的交易中。这启动了一个为期 7 天的挑战期,在此期间,其他人可以通过以下三者之一的 Merkle 证明来挑战退出:

非最新所有者:退出者签署的后续交易,将退出者的代币转移到其他人。

双花:一笔将代币从先前所有者转移到其他人的交易,包含在退出者交易之前的交易。

无效历史:在过去 7 天内转移代币的交易,没有相应的支出。退出者可以通过提供相应的支出来回应;如果他们不这样做,退出将失败。

根据这些规则,任何拥有代币 k 的人需要看到过去一周内所有历史树中位置 k 的所有 Merkle branches,以确保他们实际拥有代币 k 并能退出。他们需要存储包含资产转移的所有分支,以便能够回应挑战并安全退出他们的代币。

泛化到可互换代币

上述设计适用于非同质代币(NFTs)。然而,比 NFTs 更常见的是可互换的代币,例如 ETH 和 USDC。将 Plasma Cash 应用于可互换的代币的一种方式是简单地将每个代币的小面额(例如 0.01 ETH)作为单独的 NFT。然而,如果这样做,退出的 Gas 成本将会过高。

一种解决方案是通过将许多相邻的代币视为单个单位进行优化,可以一次性转移或退出。有两种方法可以实现这一点:

使用几乎不变的 Plasma Cash,但使用高级算法快速计算非常大数量的对象的 Merkle tree,如果许多相邻对象相同,这其实并不难实现;你可以在这里看到一个 Python 实现。

使用 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-1 中,帐户 A 中持有的 ETH 可能来自 N 中的任何地方。为了退出一致的状态,EVM Plasma 链需要一个退出游戏,在极端情况下,希望使用来自区块 N 的信息退出的人可能需要支付费用以在链上发布整个区块 N 的状态:这将导致数百万美元的 gas 成本。基于 UTXO 的 Plasma 方案没有这个问题:每个用户都可以从他们拥有数据的最新区块退出他们的资产。

第三个挑战是 EVM 中无限制的依赖关系使得更难以获得对证明有效性的一致性激励。任何状态的有效性都取决于其他一切,因此证明任何一个事物都需要证明一切。在这种情况下解决故障通常无法因数据可用性问题而保持激励兼容。一个特别令人讨厌的问题是,我们失去了在基于 UTXO 的系统中存在的保证,即对象的状态在没有所有者同意的情况下不会改变。这个保证非常有用,因为它意味着所有者始终知道其资产的最新可证明状态,并简化了退出游戏。没有这个保证,创建退出游戏变得更加困难。

有效证明如何解决这些问题

证明的有效性对于改进 Plasma 链设计的最基本的事情就是在链上证明每个 Plasma 块的有效性。这极大地简化了设计空间:这意味着我们唯一需要担心的是操作员的不可用块攻击,而不是无效块。以 Plasma Cash 为例,它消除了对历史挑战的担忧。这减少了用户需要下载的状态,从最近一周的每个区块一个分支,变为每个资产一个分支。

此外,在最新状态中提取资金(在操作员诚实的大多数情况下,所有提取都将来自最新状态)不受非最新所有者的挑战的影响,因此在经过验证的 Plasma 链中,这样的提取将不受任何挑战的影响。这意味着在正常情况下,提取可以是即时的!

扩展到 EVM:平行 UTXO 图

在 EVM 情况下,有效性证明还让我们能够做一些聪明的事情:它们可以用来实现 ETH 和 ERC20 代币的并行 UTXO 图,并在 UTXO 图和 EVM 状态之间进行 SNARK 证明等价。一旦实现了这一点,您就可以在 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 的价格保持在以上,则最终可以提取。总体而言,这样的恶意用户可以从中赚钱。

另一个例子是隐私系统,例如 Tornado Cash 或 Privacy Pools。考虑一个有五个存款人的隐私系统:

隐私系统中的零知识可证明系统(ZK-SNARKs)将进入系统的代币的所有者与离开系统的代币的所有者之间的关联保持隐藏。

假设只有橙色用户已提取,此时 Plasma 链操作员停止发布数据。同时假设我们采用 UTXO 图的方法,使用先进先出规则,因此每个代币都与下面的代币匹配。然后,橙色用户可以提取他们的预混和后混(pre-mixed and post-mixed)代币,系统将其视为两个单独的代币。如果蓝色用户尝试提取他们的预混代币,橙色用户的最新状态将覆盖它;与此同时,蓝色用户将无法提取他们的后混代币。

如果允许其他四个存款人提取隐私合约本身(这将覆盖存款),然后在 L1 上取出代币,这个问题就可以解决。然而,实际实施这样的机制需要隐私系统开发人员额外的努力。

还有其他解决隐私问题的方法,例如 Intmax 方法,它涉及在链上采用类似 Plasma 的操作员,该操作员在个别用户之间传递信息时携带一些字节。

Uniswap LP 头寸存在类似的问题:如果在 Uniswap 头寸中将 USDC 交换为 ETH,您可以尝试提取交易前的 USDC 和交易后的 ETH。如果与 Plasma 链操作员合谋,流动性提供者和其他用户将无法访问交易后的状态,因此他们将无法提取交易后的 USDC。需要特殊的逻辑来防止这种情况发生。

结论

到了 2023 年,Plasma 仍然是一个被低估的设计领域。Rollups 仍然是黄金标准,并具有无法匹敌的安全性能。从开发者的角度来看,特别是从简化应用程序开发人员无需考虑其应用程序中的所有权图和激励流的角度来看,没有什么能够匹敌它的简便性。

然而,Plasma 让我们完全绕过了数据可用性的问题,大大降低了交易费用。对于本来可能是 validium 的链来说,Plasma 可以是一个重要的安全升级。今年 ZK-EVM 终于开始实现,这使得重新探索这个设计领域成为一个绝佳的机会,可以提出更加有效的构想,以简化开发者的体验并保护用户的资金。

「原文链接」