作者:Vitalik;编译:松雪,金色财经
特别感谢 Karl Floersch、Georgios Konstantopoulos 和 Martin Koppelmann 的反馈、审查和讨论。
Plasma是一类区块链扩展解决方案,允许除了存款、提款和默克尔根之外的所有数据和计算都保留在链下。这为实现非常大的可扩展性提供了可能,而这种可扩展性不受链上数据可用性的限制。Plasma最初是在2017年创建的,在2018年经历了许多迭代,其中最值得注意的是Minimal Viable Plasma、Plasma Cash、Plasma Cashflow和Plasma Prime。不幸的是,由于(i)庞大的客户端数据存储成本和(ii)Plasma的基本限制,使其难以推广到支付以外的领域,Plasma在很大程度上已经被Rollup技术所取代。
有效性证明(也称为ZK-SNARKs)的出现使我们有理由重新思考这个决定。使Plasma在支付方面可行的最大挑战,即客户端数据存储,可以通过有效性证明进行高效地解决。此外,有效性证明提供了各种工具,使我们能够创建一个类似于运行以太坊虚拟机(EVM)的Plasma链。尽管 Plasma 的安全性保证不能涵盖所有用户,因为将 Plasma 式退出游戏扩展到许多复杂应用程序的根本原因仍然存在不可能性。然而,在实践中,仍然可以保护非常大比例的资产。
这篇文章描述了如何将 Plasma 的思想扩展以实现这样的目标。
一、概述:Plasma 的工作原理
Plasma Cash 的最简单版本是 Plasma Cash。Plasma Cash 的工作方式是将每个单独的代币视为一个独立的非同质代币(NFT),并为每个代币跟踪一个单独的历史。Plasma 链有一个运营者,负责创建并定期发布区块。每个区块中的交易以稀疏的 Merkle 树存储:如果一笔交易转移了代币 k 的所有权,则它出现在树的位置 k。当 Plasma 链的运营者创建一个新的区块时,他们将 Merkle 树的根哈希发布到链上,并直接将对应于用户所拥有的代币的 Merkle 分支发送给每个用户。
假设这是 Plasma Cash 链中的最后三个交易树。然后,假设所有先前的树都是有效的,我们可以知道 Eve 当前拥有代币 1,David 拥有代币 4,George 拥有代币 6。
任何 Plasma 系统中的主要风险是运营者的不当行为。这可以通过两种方式发生:
发布无效块(例如,运营者包括一笔交易,即使在那时 Fred 并不拥有代币 1,也将其发送给 Hermione)。
发布不可用的块(例如,运营者没有向 Bob 发送他某个块的 Merkle 分支,阻止他向他人证明他的代币仍然有效且未使用)。
如果运营者以与用户资产相关的方式产生不当行为,用户有责任立即退出(具体而言,必须在 7 天内退出)。当用户(“退出者”)退出时,他们提供一个 Merkle 分支,证明了将该代币从先前所有者转移到他们名下的交易。这启动了一个为期 7 天的挑战期,在此期间,其他人可以通过提供以下三者之一的 Merkle 证明来对该退出进行挑战:
非最新所有者:由退出者签署的将退出者的代币转移到其他人名下的后续交易;
双花:将代币从先前所有者转移到其他人名下的交易,该交易在将代币转移到退出者名下的交易之前已经被包含;
无效历史:在退出前(在过去的 7 天内)转移代币的交易,没有相应的支出。退出者可以通过提供相应的支出来进行回应;如果他们没有这样做,退出将失败。
根据这些规则,拥有代币 k 的任何人需要查看过去一周所有历史树中位置 k 的所有 Merkle 分支,以确保他们实际上拥有代币 k 并可以退出。他们需要存储包含资产转移的所有分支,以便能够回应挑战并安全地退出带有他们代币的状态。
推广到可互换代币
上面的设计适用于NFT。然而,比NFT更常见的是可互换代币,如ETH和USDC。将Plasma Cash应用于可互换代币的一种方法是简单地将每个代币的小面额(例如0.01 ETH)视为单独的NFT。然而,如果这样做,退出的Gas成本将会很高。
一种解决方案是通过将许多相邻的代币视为单个单元来进行优化,可以一次性转移或退出。有两种方法可以做到这一点:
几乎原封不动地使用Plasma Cash,但使用复杂的算法,如果许多相邻的对象相同,则可以非常快速地计算出非常大数量对象的Merkle树。这实际上并不那么难实现;你可以在这里找到一个Python实现。
使用Plasma Cashflow,它简单地将许多相邻的代币表示为一个单一的对象。
然而,这两种方法都会遇到碎片化的问题:如果你从数百人那里分别收到0.001 ETH(每人购买一杯咖啡),那么在Merkle树中将有许多地方都有0.001 ETH,因此实际退出这个ETH仍然需要提交许多单独的退出请求,这使得Gas费用变得不划算。已经开发了碎片整理协议,但实现起来比较棘手。
或者,我们可以重新设计系统,以考虑更传统的“未花费交易输出”(UTXO)模型。当你退出一枚代币时,你需要提供这些代币的过去一周的历史记录,任何人都可以通过证明这些历史代币已经退出来挑战您的退出。
对底部右侧的0.2 ETH UTXO的提取可以通过显示其历史记录中任何UTXO的提取来取消,如图中绿色所示。特别注意,中间左侧和底部左侧的UTXO是前代,但顶部左侧的UTXO不是。这种方法类似于 2013 年左右彩色硬币协议中基于顺序的着色想法。
有许多技术可以做到这一点。在所有情况下,目标是在历史的不同时间点跟踪什么是“同一枚代币”的概念,以防止“同一枚代币”被提取两次。
推广到 EVM 的挑战
不幸的是,将Plasma从支付推广到EVM要困难得多。一个关键挑战是EVM中的许多状态对象没有明确的“所有者”。 Plasma的安全性取决于每个对象都有一个所有者,该所有者有责任观察并确保链的数据可用,并在发生任何问题时退出该对象。然而,许多以太坊应用程序并不是这样工作的。例如,Uniswap流动性池没有单一所有者。
另一个挑战是EVM不会尝试限制依赖关系。在块N中的账户A中持有的ETH可能来自块N-1中的任何地方。为了退出一致的状态,EVM Plasma链需要有一个退出游戏,在极端情况下,希望使用块N的信息退出的人可能需要支付费用,在链上发布整个块N状态:Gas费用可能高达数百万美元。基于UTXO的Plasma方案没有这个问题:每个用户都可以从他们拥有数据的最新块退出他们的资产。
第三个挑战是EVM中无限制的依赖关系使得更难以使各方的激励与证明有效性保持一致。任何状态的有效性取决于其他所有事物,因此证明任何一件事都需要证明所有事物。在这种情况下解决故障通常无法使激励相容,因为存在数据可用性问题。一个特别让人讨厌的问题是,我们失去了在基于UTXO的系统中存在的一个保证,即对象的状态在没有所有者同意的情况下不能更改。这个保证非常有用,因为它意味着所有者始终知道他们资产的最新可证明状态,并简化了退出游戏。如果没有这个保证,创建退出游戏将变得更加困难。
二、有效性证明如何缓解其中许多问题
有效性证明能够在改进Plasma链设计方面发挥的最基本的作用就是在链上证明每个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上发送消息,强制运营商要么包含一个交易,要么使状态的特定分支可用。如果运营商未能执行此操作,链将开始回滚区块。只要有人发布了整个状态的完整副本,或者至少发布了用户标记为可能丢失的所有数据,链就会停止回滚。提取可能需要发布赏金,该赏金将支付该用户在发布如此大量数据的Gas份额。
这类方案的弱点在于,在正常情况下它们不允许即时提款,因为始终存在链需要回滚最新状态的可能性。
三、EVM plasma 方案的局限性
此类方案功能强大,但无法为所有用户提供全面的安全保证。 它们最明显崩溃的情况是特定国家对象没有明确的经济“所有者”的情况。
让我们考虑 CDP(债务抵押头寸)的情况,这是一种智能合约,用户拥有被锁定的代币,只有在用户偿还债务后才能释放。 假设用户有 1 ETH(截至撰写本文时约为 2000 美元)锁定在 CDP 中,债务为 1000 DAI。 现在,Plasma 链停止发布区块,用户拒绝退出。 用户永远无法退出。 现在,用户有一个免费的选择:如果 ETH 的价格跌破 1000 美元,他们就会走开并忘记 CDP,如果 ETH 的价格保持在 1000 美元以上,他们最终会认领它。 平均而言,此类恶意用户可以通过这样做来赚钱。
另一个例子是隐私系统,例如。 Tornado现金或隐私池。 考虑一个有五个存款人的隐私系统:
隐私系统中的 ZK-SNARK 隐藏了进入系统的代币所有者和出来的代币所有者之间的联系。
假设只有橙色退出,此时 Plasma 链运营商停止发布数据。 还假设我们使用具有先进先出规则的 UTXO 图方法,因此每个代币都会与其正下方的代币匹配。 然后,橙色可以提取预混合和后混合的代币,系统会将其视为两个单独的代币。 如果蓝色试图收回他们预先混合的代币,橙色的最新状态将取代它; 与此同时,蓝色将没有信息来撤回混合后的代币。
如果您允许其他四个存款人提取隐私合约本身(这将取代存款),然后在 L1 上取出代币,则可以解决此问题。 然而,实际实现这样的机制需要隐私系统开发人员付出额外的努力。
还有其他方法可以解决隐私问题,例如。 Intmax 方法,该方法涉及将几个字节以链式汇总方式与在各个用户之间传递信息的类似 Plasma 的运算符一起放置。
Uniswap LP 头寸也有类似的问题:如果您在 Uniswap 头寸中用 USDC 换取 ETH,您可以尝试提取交易前的 USDC 和交易后的 ETH。 如果您与 Plasma 链运营商勾结,流动性提供者和其他用户将无法访问交易后状态,因此他们将无法提取交易后的 USDC。 需要特殊的逻辑来防止此类情况的发生。
四、结论
2023 年,Plasma 是一个被低估的设计空间。 Rollup仍然是黄金标准,并且具有无法比拟的安全属性。 从开发人员体验的角度来看尤其如此:没有什么可以比得上应用程序开发人员的简单性,甚至不必考虑应用程序中的所有权图和激励流。
然而,Plasma 让我们完全回避了数据可用性问题,大大降低了交易费用。 Plasma 可以为链带来重大的安全升级,否则链将成为验证链。 ZK-EVM 今年终于实现,这为重新探索这个设计空间提供了绝佳的机会,并提出更有效的结构来简化开发者体验并保护用户资金。