玩转 Plasma:浅谈 Plasma Cash

上一篇文章《玩转 Plasma (1): 零基础入门》中,我们主要谈到了 (1) Plasma的理论基础和 (2) 最小可行Plasma (MVP) 的工作原理。在进入本文正题之前,我们不妨再稍微探讨一下关于 MVP 的一些改进思路。

我们回到 MVP 的强制大规模退出漏洞:从某种意义上来说,“问题”的根源在于文中所讨论的资产的可替代性。比方说,我们说 Bob“欠了”5个以太币。由于以太币是一种可替代资产,因此谈论 Bob 欠的是“哪几个特定的以太币”是没有意义的。为此,在我们的“悲惨情形(即运营者作恶的案例)”中,当运营者企图携带超过其自身的份额退出时,我们无法清晰地确定“他偷的以太币是谁家的”。以太币就是以太币,所以运营者窃取的其实就是集体的Plasma以太币池子里的资金。因此,从某种意义上说,其他用户都必须把资金从该Plasma链中撤出。

那么,有没有一种方法能够指定某“块”特定的以太币的所有者呢?相比起将Plasma合约中的总以太币余额表示为一个 (非常大的) 数字,我们能不能认为余额就是一大堆不可分割的“以太硬币 (没错,就是一个个独立的哐当响的硬币)”的面额的总和呢?这可以解决我们的问题吗 (或者可能引入新的问题吗)?

Plasma Cash 登场!

Plasma Cash 是 Plasma 结构的一种变体,其诞生以后便成为了Plasma社区大部分研究的基础。它采用与 MVP 类似的“最小可行”方法,但从一开始就增加了一个新的限制:在 Plasma Cash 链上的所有资产都是不可替代代币。一个NFT(我们称之为“币”)可以代表任何东西:固定的以太币面额、一个 ERC-20 代币、一捆 ERC-20 代币、一窝谜恋猫,或者成为能够在 Plasma 链条上连续创建 100 个区块的 Plasma 运营者的权利 (免责声明:我不知道这么做会有什么后果,建议不要随意模仿) 等。唯一的要求是,上述被代表物可以表示为 ERC-721 资产。也就是说,这东西不可拆分或合并,并且是唯一的。

Plasma Cash 抛弃了 MVP 中比特币式的 UTXO 交易模型。对于不可替代币来说,创建新的交易输出这一概念不再适用。相反,在每一个 Plasma 区块中,每一个币都需要进行记账:某个币的存在表明这个币在该 Plasma 区块中的所有者发生改变 (即,Alice将其发送给了 Bob);而币的缺席 (即不出现在区块中) 则表示这个币的所有者仍然与前一个区块中的所有者相同。因此,一个币的完整历史可以通过其在每个 Plasma 区块中是否存在来进行描述——我们只需从当前区块一路遍历回这个币首次存入的区块。

正如我们即将展示的那样,一个币的完整历史能够充分保护其持有者的所有权。并且更棒的是,在这个模型里面,这个历史不需要包含每个 Plasma 区块中的所有数据:如果 Bob 想要证明他的币存在于某个区块中,那么他只需要提供交易的默克尔路径。然而,想要证明这个币没有在某个区块中转移,Bob 需要能够证明数据的缺席。这一点是我们所熟知和喜爱的默克尔树不支持的功能。

因此,为了实现这种“缺席证明”功能,Plasma Cash 使用我们称为稀疏默克尔树 (SMT) 的加强版默克尔树结构。SMT 是具有额外的特殊功能的默克尔树:树的每一片叶子 (在本文例子中,是币) 都被赋予一个唯一的识别号,以用于确定它们所在的树的位置。本质上而言,我们就是对这些叶子进行分类排序,每一个币只能位于分配给自己的“槽”中。这意味着,如果这个币缺席的话,那么我们一定能够知道它所存在的位置;相反,如果这个币出现了的话,那么我们就能够通过证明“槽是‘空’的 (即等于某个null值,比如0或者“未定义”,等等)”默克尔分支来证明这个币已经易主了。

因此,既然我们可以在每个区块中证明币是否存在,我们就可以追踪币的完整历史,这段历史看起来可能会是这样的:

玩转 Plasma:浅谈 Plasma Cash

依此类推。关键的一点是,证明这一历史所需的数据仅为每个区块中那一丢丢微不足道的默克尔证明,而不是 MVP 所要求的完整 Plasma 区块。哎,Plasma 轻客户端有着落了!

现在我们再来推敲一下关于默克尔证明序列足以让币的当前所有者保护自有资金的说法。换句话说,只要 Steve 拥有他的币的完整历史 (以上述形式存在),那么他就得到客观保证:

1)如果/当他试图提现,那么他将能够对任何质疑作出适当的响应。

2)如果/当其他参与者试图撤出他的币时,那么他将能够发起质疑并成功推翻他人的撤回请求。

在上述例子中,截至第 505 个区块时,Steve 都是该币的正当所有者。这里要强调的一个要点是,如果 Steve 想要确认自己的收款 (在这个案例中,就是在第 504 个区块时从 Bill 处收到的付款) 是否已经最终敲定,他首先必须接收并验证这个币的完整历史 (即验证先前每个区块中的默克尔证明)。然后,并且只有在那时,他才能真正拥有这个币的所有权。

现在,我们不妨来推演所有可能发生的事情,以及 Steve 该如何作出响应 (其中一些解决方案与 MVP 拥有熟悉的配方):

由于 Steve 在第 504 个区块确立对这个币的所有权,因此,作恶者有两种方式可以偷取 Steve 的币,即在先前或后续的区块中声称拥有这个币。

比方说,Alice 在第 501 个区块中通过广播她的“存在证明”来试图窃取这个币。在这时,Alice理直气壮地声明在第 501 个区块中发生的转账是最新且有效的币交易。也就是说,她之后再也没有花费这个币。Steve 的响应行为基本上与Bob在MVP的“令人发指”的案例中的表现相同。他指出,Alice 在第 502 个区块中已经转账给了 Bill (注意,Steve 不能伪造这个证据,因为这笔交易需要包含Alice的签名)。Alice被捉个正着,她的退出请求被撤销了。再一次,由于 Steve 拥有这个币的完整历史,他清楚自己能够随时准备应对任何类似的欺诈性退出意图。

现在,假设 Alice 尝试在第 506 个区块 (即在 Steve 确立对这个币的所有权之后) 中撤出她的币。需要注意的是,如果Alice的默克尔包含证明能够被智能合约接受 (即 Alice 手眼通天),那么运营者可能将不得不在第 506 个区块中恶意且欺诈地包含这笔无效支付。像往常一样,我们假设任意一个运营者都可能是恶意的。

在这种情况下,Steve 通过提供其在第 504 个区块中所发生的交易来作出响应。这时,他表明自己不仅在该区块拥有这个币,并且还可以理直气壮地声明自那以后自己再没有花费这个币。现在,Alice 有责任提供 Steve 将这个币发送给另一方的交易,但 Steve 知道她无法这么做,因为他知道自己实际上根本没有花费这个币 (并且他一直在用生命来保护着宝贵的私钥)。再一次,Alice 的退出请求被撤销了。

尽管上述示例隐藏了一些很棘手的边缘案例 (你可以把这些边缘案例作为家庭作业私下思考),但这些退出博弈足以概括 Plasma Cash 执行规则的要点。

等一等,还漏了一件事情!我们回忆一下之前提到过的 MVP 悲惨案例:运营者停止提供区块数据,然后继续尝试无效的提现。那么这一次,在 Plasma Cash 中,这个提现过程将只包含一个币。因此,在作恶案例中,只有有争议的币的实际所有者需要采取行动。由于不可替代性的限制,提现资金“溢出”到其他用户的链上资产馅饼的风险将不复存在。这将使得强制提现的风险与通道中心的风险对等。如果 Plasma 链无法操作,那么用户最终 (可能) 会退出。但这种退出不会带来任何恐慌、时间敏感性以及强制大规模退出失败的结果。

再进一步

最后,我们花一点时间来实现我们收获的想法:我们已经升级了 MVP Plasma 结构,现在用户可以运行轻客户端,并且基本上消除了丑陋的大规模退出漏洞。

这是否意味着我们已经找到了我们孜孜以求的 Plasma 银弹?

不完全是。首先,尽管我们已经最大限度地减少了每个用户需要处理的数据量,但事实上,这个数据量仍然十分庞大。我们可以做一些速算,当一个币在 Plasma 链中停留的时间足够长时,每个 Plasma 区块中的每一个币的单个默克尔证明的大小就会变得很大。此外,请记住,每一次支付都意味着用户需要将相关的完整历史转移给收款方。

但是,我们不要忘记我们在 Plasma Cash 中实施的初始限制:不可替代性。这可能会为某些应用程序提供足够的功能——比如NFT市场——但最终,我们希望 Plasma 资产能够给予用户真实的钱一样的感受和功用。能够以任意面额来花费个人资金是非常重要的。如果缺乏这一特性,那么 Plasma Cash 链上的支付网络的用户体验可能就像在一个只能支付现金的餐厅中,你没有零钱,你只能把支票撕开一样。

在后续文章中,我们将继续 Plasma 之旅,并讨论基于 Plasma Cash 的方案,以最大限度地减少历史数据的膨胀问题。最重要的是,挽救支付的可替代性,同时仍旧保留Plasma Cash 的优势。

关于作者:Daniel Goldman 是一名软件工程师,技术顾问和独立作家。他主要在纽约布鲁克林工作。

感谢 Georgios Konstantopoulos 的宝贵意见。

参考链接:

https://www.theblockcrypto.com/2019/02/07/understanding-plasma-part-1-the-basics/

作者 | Daniel Goldman

来源 | Contributor Network

编译 | 喏呗尔


分享到:


相關文章: