为什么在 Plasma 上难以运行 EVM
枪手本色戮
发表于 2022-11-28 18:40:12
100
0
0
为何创建支持EVM的Plasma链如此之难?在我们开始揭秘之前,不妨再多聊一下Plasma。Plasma的基本特性之一是Plasma链上的状态一定要能够撤回到根链上(例如以太坊),以确保状态的完整性。Plasma链上的资产一定要能够自由转移到根链上,反之亦然。这一功能非常重要,当Plasma的共识机制受到腐化时,用户必须将他们在Plasma链上的资产撤回根链。9 f& l7 Q5 W# f2 R) e" J' D
要切实理解这一点,请想象一条简单的Plasma链,其用户可以通过账户转移或接收资金。如果你是这条Plasma链上的用户之一,想要撤回资金。你该怎么做?你可以告诉以太坊上的合约说你在Plasma链上有一笔资金,你想要撤回这笔资金。当然这里有个条件——你不能谎报账户中的余额。这就是为什么我们要引入“挑战期”机制,在此期间可以将无效退款锁定。
现在,我们把这一概念扩展到一类耳熟能详的EVM智能合约上,以简单的多重签名账户为例。如果这个账户目前位于Plasma链上,我们需要提供某个方法将钱包撤回到根链上。然而,我们不想把资金从多重签名账户中取出——而是想将整个智能合约撤回到根链上。要知道每个EVM合约都是由状态、余额和代码组成的。因此,我们实际上是将这个多重签名合约的状态、余额和代码从Plasma链上转移到根链上。转移过后,这个合约理应能够在根链上正常运行。4 |& y& u' i: ?$ N$ Q% p9 w
4 \5 z1 E: L$ G) H+ x$ Q5 w/ a
那么,实际是谁决定将Plasma链上的东西转移到根链上的呢?如果我们谈论的是简单的账户,账户所有人理应能够随时撤回余额。如果我们谈论的是多重签名账户,那我们可以设计一些不同的机制来决定何时将多重签名账户转移到根链上。可能要求多重签名账户上的每位用户签名,或是n/m位用户签名,或是一位用户签名即可。上述这些机制都可能有效——需由多重签名账户的设计者决定哪种机制最合适。! c5 P- R& s8 | t# N/ d4 I
* ^3 J9 f, E* }$ P; x
不过问题来了——并非每次都能确定是哪些人想将合约从Plasma链上转移至根链上。想象一下,我们(在某条Plasma链上)运行了一个关于虚拟猫的智能合约。假设共识机制受到腐化,每个人都需要离开这条Plasma链以确保资金的安全。我们要怎么处理这个虚拟猫合约?正如上文讨论过的那样,我们需要将这个合约撤回到根链上。遗憾的是,如果我们允许所有人都撤回合约,用户就会一哄而上,尽可能多地撤回合约,导致这条Plasma链作废。因此,我们必须想出一个更好的机制。% P9 s8 I' v& w
) E3 |; H: A3 M% T9 z
我们能想出一些机制,只是这些机制不是中心化程度太高就是成本太高。利用投票机制来决定何时可以撤回合约看似可行。其问题在于,如果合法的投票者的人数较少,合约控制权的中心化程度就过高;而合法投票者人数越多,投票机制的成本就越高。0 v: c) K7 Y& {' H' s6 }
再说回从Plasma链上撤回事物的过程。别忘了,一旦我们发现某个要撤回的状态是无效的,我们就可以阻止它退出。假设我们的虚拟猫合约上注明了我是猫咪123的所有者,现在我们想撤回这个合约,需要注明这个合约的当前状态。当前状态中有一条记录是“Kelvin拥有猫咪123”。如果我在该合约的挑战期内将猫咪123的所有权转移给了另外一个人,会出现什么情况呢?“真正的”状态变成了“用户X拥有猫咪123”。这时,要撤离Plsama的状态无效了(因此可以被挑战成功)。我们迎来了第二个大难题——如果任何人都能修改合约的状态,那么任何人都能阻止退出(校对注:即每一个用户的权限都变成了一票否决权)。5 u' ~+ Y K8 @: {9 Y3 r( h
至此引出了我们的终极问题——我们需要验证被挑战的状态变更是否为有效变更,然而在EVM中很难验证EVM的状态变更(validatingEVMstatechangesinsidetheEVMishard)。对于像账户这样基础的合约来说,一次有效的状态变更只需要账户所有人的签名,而且在EVM中很容易检查。然而,对于复杂的EVM合约来说,情况就要复杂得多。一种验证EVM执行的方法是使用TrueBit之类的项目。虽然这可能是最简单的选择,但是会让Plasma过于依赖外部系统,进而从根本上扼杀其安全性。在理想情况下,如果我们想要通过无需信任的方式验证某个EVM的步骤,就要在这个EVM中再运行一个EVM
成为第一个吐槽的人