为什么在 Plasma 上难以运行 EVM

感谢 Dan Robinson 对相关话题的讨论,令我获益良多。

从根本上来说,Plasma 目前仅利用非常简单的 UTXO 或非同质代币来完成大部分工作。很多人想知道是否有可能创建一条允许用户部署 EVM 智能合约的 Plasma 链。遗憾的是,要实现这一点比想象中复杂得多,如果你在 Plasma 上下的功夫不多,可能捉摸不透原因所在。我写本文的目的是快速概述一下 Plasma 为何难以完全支持 EVM 的运行,继而就如何创建一条能够运行更多类型的智能合约的 Plasma 链提出一些建议。

为何创建支持 EVM 的 Plasma 链如此之难?在我们开始揭秘之前,不妨再多聊一下 Plasma 。Plasma 的基本特性之一是 Plasma 链上的状态一定要能够撤回到根链上(例如以太坊),以确保状态的完整性。Plasma 链上的资产一定要能够自由转移到根链上,反之亦然。这一功能非常重要,当 Plasma 的共识机制受到腐化时,用户必须将他们在 Plasma 链上的资产撤回根链。

要切实理解这一点,请想象一条简单的 Plasma 链,其用户可以通过账户转移或接收资金。如果你是这条 Plasma 链上的用户之一,想要撤回资金。你该怎么做?你可以告诉以太坊上的合约说你在 Plasma 链上有一笔资金,你想要撤回这笔资金。当然这里有个条件——你不能谎报账户中的余额。这就是为什么我们要引入“挑战期”机制,在此期间可以将无效退款锁定。

现在,我们把这一概念扩展到一类耳熟能详的 EVM 智能合约上,以简单的多重签名账户为例。如果这个账户目前位于 Plasma 链上,我们需要提供某个方法将钱包撤回到根链上。然而,我们不想把资金从多重签名账户中取出——而是想将整个智能合约撤回到根链上。要知道每个EVM 合约都是由状态、余额和代码组成的。因此,我们实际上是将这个多重签名合约的状态、余额和代码从 Plasma 链上转移到根链上。转移过后,这个合约理应能够在根链上正常运行。

那么,实际是谁决定将 Plasma 链上的东西转移到根链上的呢?如果我们谈论的是简单的账户,账户所有人理应能够随时撤回余额。如果我们谈论的是多重签名账户,那我们可以设计一些不同的机制来决定何时将多重签名账户转移到根链上。可能要求多重签名账户上的每位用户签名,或是 n/m 位用户签名,或是一位用户签名即可。上述这些机制都可能有效——需由多重签名账户的设计者决定哪种机制最合适。

不过问题来了—— 并非每次都能确定是哪些人想将合约从 Plasma 链上转移至根链上。想象一下,我们(在某条 Plasma 链上)运行了一个关于虚拟猫的智能合约。假设共识机制受到腐化,每个人都需要离开这条 Plasma 链以确保资金的安全。我们要怎么处理这个虚拟猫合约?正如上文讨论过的那样,我们需要将这个合约撤回到根链上。遗憾的是,如果我们允许所有人都撤回合约,用户就会一哄而上,尽可能多地撤回合约,导致这条 Plasma 链作废。因此,我们必须想出一个更好的机制。

我们能想出一些机制,只是这些机制不是中心化程度太高就是成本太高。利用投票机制来决定何时可以撤回合约看似可行。其问题在于,如果合法的投票者的人数较少,合约控制权的中心化程度就过高;而合法投票者人数越多,投票机制的成本就越高。

再说回从 Plasma 链上撤回事物的过程。别忘了,一旦我们发现某个要撤回的状态是无效的,我们就可以阻止它退出。假设我们的虚拟猫合约上注明了我是猫咪 123 的所有者,现在我们想撤回这个合约,需要注明这个合约的当前状态。当前状态中有一条记录是“Kelvin 拥有猫咪 123 ”。如果我在该合约的挑战期内将猫咪 123 的所有权转移给了另外一个人,会出现什么情况呢?“真正的”状态变成了“用户 X 拥有猫咪 123 ”。这时,要撤离 Plsama 的状态无效了(因此可以被挑战成功)。我们迎来了第二个大难题—— 如果任何人都能修改合约的状态,那么任何人都能阻止退出(校对注:即每一个用户的权限都变成了一票否决权)。

至此引出了我们的终极问题——我们需要验证被挑战的状态变更是否为有效变更,然而在EVM 中很难验证 EVM 的状态变更(validating EVM state changes inside the EVM is hard)。对于像账户这样基础的合约来说,一次有效的状态变更只需要账户所有人的签名,而且在 EVM 中很容易检查。然而,对于复杂的 EVM 合约来说,情况就要复杂得多。一种验证 EVM 执行的方法是使用 TrueBit 之类的项目。虽然这可能是最简单的选择,但是会让 Plasma 过于依赖外部系统,进而从根本上扼杀其安全性。在理想情况下,如果我们想要通过无需信任的方式验证某个 EVM 的步骤,就要在这个 EVM 中再运行一个 EVM ? 。基于这方面的考虑已经有时日,Vitalik 甚至为此提出了一则以太坊改进计划。真心推荐大家看一下这个以太坊改进计划,看完就懂了(在 gas 限制中再设 gas 限制,呃……)。

这就是为什么 Plasma 链无法像以太坊那样运行这么多合约的原因。最后再快速回顾一下:

  1. 并非每次都能确定是哪些人想将合约从 Plasma 链上转移至根链上。
  2. 如果任何人都能修改合约的状态,那么任何人都能锁定撤回物。
  3. 在EVM 中很难验证 EVM 的状态变更。

那么,我们将何去何从?幸运的是,我们已经开始提出一些概念,主要通过分解典型的几类智能合约来弱化这些问题。同样以虚拟猫合约为例,如果每位用户要转移的是自己虚拟猫而非整个合约的话,要确定是哪些人在将 Plasma 上的事物转移到根链上会容易得多。我们可以用迷你智能合约来代表每个猫咪,而且只有猫咪的所有者才有权修改合约。只要简单地改变下设计,前两个问题就迎刃而解。

关于如何修改设计并使之更适用于开发者,我已与 Dan Robinson 进行过讨论,之后我会将一些初步的想法发布出来。其要点在于,我们发现最简单的方法或许是使用交易虚拟机(TXVM)之类的东西和可以撰写并自动分解 EVM 智能合约的高级语言。我们称之为 “Plasma VM”,因为这种方法是可行的,而且向后兼容 MVP。

如有任何反馈/问题/评论,欢迎之至。如果仍有不解之处,烦请告知,我会加以改进!

原文链接: https://medium.com/@kelvinfichter/why-is-evm-on-plasma-hard-bf2d99c48df7
作者: Kelvin Fichter
翻译&校对: 闵敏 & 阿剑

你可能还会喜欢:

引介 | 什么是 Plasma,Plasma Cash?
PPT | Plasma 最小实现版
观点 | Vitalik:去中心化的意涵

评论