文章探讨了在Plasma链上实现EVM智能合约的复杂性,详细解释了将EVM合约从Plasma链撤回根链时面临的三大主要问题:合约所有权不明确、状态修改可能导致退出被阻止、以及EVM状态变更的验证困难。
感谢 Dan Robinson 进行非常有用的讨论。
目前关于 Plasma 的大部分工作基本上只是利用非常简单的 UTXOs 或非同质化代币。许多人想知道是否可以创建一个允许用户部署 EVM 智能合约的 Plasma 链。不幸的是,这比看起来要复杂得多,如果你没有花很多时间在 Plasma 上工作,原因可能并不明显。我写下这些内容,迅速概述为什么在 Plasma 上完全支持 EVM 不是一件简单的事情,然后给出一些建议,以便创建一个能够运行更一般智能合约的 Plasma 链。
在深入澄清为什么支持 EVM 的 Plasma 链构建起来困难之前,让我们多聊聊 Plasma。一项 Plasma 的基本属性是,在 Plasma 链上表示的状态必须能够以维护该状态完整性的方式撤回到根链(例如以太坊)。你应该能够在 Plasma 链和根链之间自由移动资产,反之亦然。这种功能在 Plasma 共识机制出现“问题”时尤为重要,用户被迫从 Plasma 链中撤回他们的资产。
为了理解这在实际中的含义,让我们想象一个简单的 Plasma 链,其中用户有账户,可以转移或接收资金。你是这个 Plasma 链上的用户之一,你希望撤回你的资金。你怎么做呢?嗯,你实际上是告诉以太坊上的合约,你在 Plasma 链上有一些资金,并且你希望撤回这些资金。当然,还有一个条件——你不应该能够谎报你的账户中有多少。这就是我们引入“挑战期”的原因,在此期间,可以阻止无效的撤回。
现在让我们扩展这个想法到你可能熟悉的 EVM 智能合约类型,例如一个简单的多签账户。如果该账户当前位于 Plasma 链上,那么我们需要提供某种方式将钱包“撤回”到根链。不过,我们仍然希望将资金保留在多签中——我们实际上希望将整个智能合约移动回根链。请记住,每个 EVM 合约都有状态、余额和代码。所以我们真正要做的是将这个多签合约的状态、余额和代码从 Plasma 链转移到根链上。然后,合约应该能够正常在根链上操作。
那么,实际上谁来决定将东西从 Plasma 链移动到根链呢?如果我们讨论的是一个简单的账户,那么说账户的拥有者应该能够随时撤回余额是非常有道理的。如果我们讨论的是一个多签账户,那么我们可以设计几种不同的机制来确定何时将多签移动到根链。也许每个多签用户都需要签署,或者也许 n-of-m 个用户需要签署,或者可能只有一个用户需要签署。所有这些都是潜在有效的机制——我们开始看到多签的设计者决定哪个机制最合适是合情理的。
但问题是——谁能够决定从 Plasma 链移动合约到根链并不是总是明确的。想象一下我们有一个智能合约(在某个 Plasma 链上)代表着很多虚拟小猫。假设共识机制出现“问题”,每个人都需要离开 Plasma 链以保护他们的资金。我们该怎么办我们的虚拟小猫合约?正如我们刚才讨论的,我们需要将合约移回根链。不幸的是,如果我们允许任何人撤回该合约,那么(粗鲁的)用户几乎肯定会尽可能多地撤回合约,使 Plasma 链变得无法使用。我们必须想出一个更好的机制。
我们可能会想出几个机制,但它们可能过于集中或费用过高。一种看似明显的机制可能是一种投票机制,决定何时可以撤回合约。一小部分合格选民会高度集中对合约的控制。然而,合格投票的用户越多,投票机制的成本就越高。
让我们迅速回到从 Plasma 链撤回东西的过程。记住,如果我们表明被撤回的状态在某种程度上无效,那么我们可以阻止退出。想象我们的虚拟小猫合约上说我拥有小猫 123。现在我们想要撤回合约,因此需要指定合约的当前状态。当前状态的一部分是“Kelvin 拥有小猫 123。”如果我在合约的挑战期间正好把其他人设为小猫的拥有者,会发生什么?现在“真实”的状态是“用户 X 拥有小猫 123。”被撤回的状态现在无效(因此可以被挑战)。这是我们的第二个大问题——如果任何人都可以修改合约的状态,那么任何人都可以阻止退出。
这导致了我们的最后一个问题——我们需要验证在挑战中提出的状态更改实际上是否是有效的状态更改,并且在 EVM 内部验证 EVM 状态更改是困难的。对于像账户这样的基本合约,有效的状态更改只需要账户拥有者的签名,且足够简单,可以在 EVM 内检查。然而,对于复杂的 EVM 合约来说,问题就复杂得多。验证 EVM 执行的一种方法是使用类似 TrueBit 的东西。这可能是最简单的选择,但它基本上通过使 Plasma 依赖于外部系统来杀死安全属性。理想情况下,如果我们想要以无信任的方式验证单个 EVM 步骤,我们需要在 EVM 内部实现 EVM 🤯。人们对这个问题思考了很久,Vitalik 甚至创建了一个 EIP 来开始讨论这个。我真的推荐查看 这个 EIP,以理解为什么它如此困难(在气体限制内的气体限制,嗯……)。
所有这一切说明了创建一个 Plasma 链,像今天的以太坊那样操作是多么困难。让我们快速回顾一下:
那么,我们接下来该怎么办呢?幸运的是,我们已经开始想出一些概念,基本上涉及将典型智能合约分解到一个这些问题不那么重要的层面。为了说明这一点,让我们回到我们的虚拟小猫合约。如果每个人都在移动自己的小猫,而不是移动整个合约,可能更清楚谁负责将东西移动到根链。如果我们将每只小猫表示为只能由小猫的拥有者修改的自己的迷你智能合约,我们就可以做到这一点。这种设计的简单转变使得前两个问题几乎完全无关紧要。
我将发布一些最初的想法,这些想法来自于与 Dan Robinson 关于这种设计的讨论,以及如何让它对开发者可用。大意是,使用像 TXVM 这样的东西和一种感觉像是编写 EVM 智能合约但自动将问题分解的高级语言可能是最简单的。我们称之为“Plasma VM”,因为它有道理,而且它还是 MVP 的倒写。
当然,欢迎任何反馈/问题/评论。如果有什么仍然令人困惑,请告诉我,我会尽量让其更清晰!
- 原文链接: medium.com/@kelvinfichte...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!