原文来自 Unitimes,全文阅读大概需要 10 分钟。
玩转 Plasma (1):零基础入门
扩展以太坊是一项前所未有的挑战,而 Plasma 正是一个旨在提高交易吞吐量的 Layer 2 扩展框架。
什么是 Plasma?它的原理是什么,以及它的技术研究现状如何?
简介
2017 年 8 月,Vitalik Buterin 和 Joseph Poon 发布了 Plasma 白皮书,向全世界展示了一种全新且颇有前景的方案。该方案旨在提高加密货币交易的吞吐量,并解决困扰用户已久的拥堵问题。仿佛一夜之间,Plasma 成为了以太坊生态系统中最受欢迎的 Layer 2 扩展框架。最终,Plasma 基本上成为了一个连续的笑话。
当然,这依旧是一件非常棒且十分令人兴奋的事情。但不幸的是,Plasma 的快节奏演变及其技术复杂性,使得那些没有直接参与研究和开发的人难以掌握其要点。对于外部参与人员来说,你可能会拥有更多的疑问,而不是具体的答案:现实而言,Plasma 链具有什么样的能力?在见证 Plasma 落地并有效运作之前,我们还面临哪些阻碍?Plasma 的权衡是什么?它的工作原理是什么?
本系列的第一部分内容将涵盖:
1. Plasma 作为 Layer 2 技术的理论基础
2. 关于第一个具体的 Plasma 规范「最小可行 Plasma (MVP)」的内部工作原理的解释
背景概述:Layer 2
我们称之为「Plasma」的协议族实际上是关于区块链可扩展问题的 Layer 2 解决方案的一个子集。这里面的「可扩展问题」是指公开且无需准入许可的区块链所面临的交易容量有限问题。Layer 2 试图通过让(某些特定的)交易在不必触及区块链本身来达到最终化的方式来绕过这个瓶颈。
如果你愿意,你可以将 Layer 2 交易视为一种支票。这种支票的账户里面的资金可以直接得到验证,而不必将其实际存入你的银行账户。这种支票可以有效地作为纸币处理,并直接交付给另一方作为付款——前提是接收支票的下一方也有能力自我验证账户资金的有效性(只是大概打个比方,求不怼)。
Layer 2 系统的大致模式是:一开始,一定数量的资金被锁定在区块链的基础层(假设为以太坊,下同)上。紧接着,其他参与方(并不一定是进行存款的同一方)可以借助被锁定的资金通过上层系统进行链下交易,并且只偶尔与主链进行交互(如果有的话)。在任意时刻,任何资本的所有者都能够将他们拥有的所有资金撤出。
将 Layer 2(因为我们正在使用这个术语)与其它链下支付系统区分开来的定义属性是:尽管避免了进行持续的基础层交互,但 Layer 2 交易仍然保留了我们期望的 Layer 1 所拥有的去中心化和无需信任的安全保证。通过妥善保管个人私钥,以及运行必需的软件,你可以保证:无论交易对手是否作恶,个人资金始终一定保管在自己手上,并且它在主链上是安全的——这里的「交易对手」可以是个体、机构、共识机制或其它任何你无法控制的因素。即使在一个噩梦般、充满阴谋诡诈的「楚门的世界」中,整个系统的所有其他用户都暗中串谋试图窃取你的资金,他们也会失败。
为什么把这种技术叫做 Plasma?
在过去几年的 Layer 2 研发中,逐渐出现了一种分类方式。我们依照这种分类方式巧妙地将 Layer 2 机制分为两类:“Plasma”和“通道技术”(比如“状态通道”或者“支付通道”)。
第一种区分这两种类别的方式是,判断它们所需的最小链上交易数:在通道技术中,通道交易的最终敲定不必与主链进行任何交互;而对于 Plasma 交易,其必须与主链进行一次交互(由 Plasma 运营者而不是用户进行广播,这部分内容下文会进行介绍)。
Plasma 之所以被界定为 Layer 2 可扩展性方案(尽管需要进行定期的链上交易),是因为在 Plasma 中,每一笔 Layer 1 交易都可以一举有效地完成多笔交易。你可以想象一下,将一堆 Layer 2 交易压缩成一笔交易。尽管如此,这似乎就是通道技术的放大版。无需链上区块确认意味着(几乎)即时敲定,而尽可能少的链上交互通常是一件好事。
另一方面,通道技术要求所有通道参与者完全同意任意通道范围的状态更新,这意味着拥有多个政党的单一通道在实际中难以实施。当你需要与没有跟你共享同一通道的参与方进行交易时,你需要通过你的通道合作伙伴来“转发”交易。因此,你的金融活动将被局限在你可以通过通道网络图找到相应的流动性路径的人群范围内。
然而,在 Plasma 中,只有交易的发送方需要表态是否同意。除此以外,所有相关参与方都不需要执行流动性锁定/限制来进入、退出和自由交易(事实证明,“谁需要同意状态更新”也是区分“通道技术”和“Plasma”的等效方式)。
因此,片面而言,我们可以说通道技术更适用于依赖即时敲定特性,以及拥有相对固定的会进行交互的参与者集合的应用,而 Plasma 更适用于涉及多方参与者、强调高交易吞吐量并且即时敲定特性重要性相对较低的场景。
最小可行 Plasma
尽管最初的白皮书仅介绍了 Plasma 的总体概念,但它的理念十分宽泛,并且雄心勃勃(老实说,还特别长)。白皮书中所提及的一些想法——比如嵌套的 Plasma 链树——仍旧超出了目前的 Plasma 研究的范围内,甚至有可能无法实现。
因此,获得实际工作代码的第一个重要的步骤———是一种被称为最小可行Plasma(MVP)的规范。最小可行Plasma,顾名思义,其目标就是要过滤掉所有天马行空的功能,并将所有事物提炼为最简单的可行实现。这里的“可行”意味着它必须简单地满足上述定义的Layer 2 Plasma系统的基本要求,并且只拥有最少的功能,即从A到B的可替换资产(假定为以太币,但对于其它符合ERC20标准的代币来说也是可行的)。
正如我们之前提到的,Plasma的关键属性是多笔交易被压缩且被最终敲定,并且只有一笔交易与主链交互。在MVP中,“压缩”是通过默克尔树完成的:交易被组合在一起并通过默克尔化得到一个根,然而这个根被放置在Layer 1。交易本身遵循比特币式的UTXO模型。也就是说,交易花费的是经过发送者证明其所有权的输入,并创建受到新的所有者的公共地址影响的输出。这就是说:一条Plasma链本身就是一条区块链!通过使用必要的链下Plasma区块数据和链上默克尔根数据,用户可以验证自身的合法权利,并依靠以太坊的链上智能合约来执行规则且解决所有争议。
我们将负责执行上述过程(即默克尔化交易、广播根,并与用户共享数据)的实体——Plasma“区块创建者”——称为Plasma运营者。值得注意的是,Plasma机制本身完全不知道运营者的存在形式:它可以是一个单一的“中心化”实体,一条联盟侧链以及一个基于权益证明的区块认证系统等。Plasma结构的根本目标是,一切基金管理都无需托管。并且在Plasma的实现中,无论谁负责创建区块,这个因素都应该保持不变。更“去中心化”的机制可能会带来与分布式对等系统相关的其他好处,比如抗审查性、容错等——但无需托管的性质不会改变。因此,为了简单起见,我们不妨假设运营者只是一个单独的实体,从而更加明确地推导Plasma机制。
首先,Alice 通过向合约发送一笔链上以太币交易,将以太币存入 Plasma 链中,运营者将该笔交易包含在 Plasma 区块中。这些以太币最初以 UTXO 的形式归属于 Alice。像往常一样,Alice想要给Bob付款,(需要注意的是,Bob 不一定需要进行链上存款,或许他永远都不需要在链上存款)为此,她创建了一笔花费她的 UTXO, 并为 Bob 创建一个新的 UTXO 的交易,并将此交易发送给Plasma运营者。运营者将这笔交易与其它(可能不相关的)交易组合成一个 Plasma 区块,并对它们“默克尔化”得到一个默克尔根,然后(并且只)将这个根发送到主链。
接着,运营者将此 Plasma 区块发送给所有用户(包括 Alice 和 Bob)。在收到最新的区块后,Alice 和 Bob 各自对其进行验证。这一验证过程旨在确保交易本身有效,并且区块与区块链上默克尔根相对应。如果一切顺利,那么 Alice,Bob 和其他用户就可以继续幸福快乐地生活了。
然而,如果这时Alice感觉她自己已经受够了这个疯狂的Plasma业务——她想把资金撤回到以太坊链上——她可以通过发送一笔链上交易来启动“提现请求”(请注意:这一提现请求不需要运营者的许可)。在这笔交易中,她需要包括她想要提现的Plasma链的UTXO,以及该UTXO所属的Plasma区块编号和证明包含过程的默克尔路径。现在,在她获得资金之前,她必须等待一个“争议期”(假设它时一周)才能通过。在此期间,如果其他用户检测到请求犯规,那么这些用户可以对Alice的退出行为提出质疑。
这可能会导致两种情况:
(1) 皆大欢喜:每个参与者都是诚实的。
在 Alice 开始退出时,其他用户会浏览各自的Plasma链副本以检查并确认 Alice 试图退出的 UTXO 实际上仍然属于她。他们还会以其它方式验证所有区块的有效性。Plasma 的用户现在可以放心:Alice 只能带着属于她自己的钱离开,其他用户的资金是安全的。
(2) 令人发指:Alice 是坏人
现在,我们不妨替换前一个场景的结局:Alice 的退出意图“足够正确”,以致于一开始被智能合约接受了。也就是说,它是一笔有效的交易,默克尔证明确实与旧的默克尔根相对应——但它实际上是双重花费。这意味着,Alice 试图用她早先发送给 Bob 的相同 UTXO 来进行退出。
但这都不要紧!Bob(或者任何其他用户)有一周的时间采取行动。他会对照自己的Plasma链副本来检查 Alice 的 UTXO,并注意到这是一笔双重花费。为了证明 Alice 的罪行,他提交了一个“欺诈证明”。这个证明包含了 Alice 以前花费相关的 UTXO 的旧交易,以及这笔花费交易被包含在 Plasma 区块中的默克尔证明。由于 Bob 给出了 Alice 已经花费这笔资金的加密证明,因此 Alice 被逮个正着,她提现这笔资金的请求被取消了。
关于“惩罚”的说明
在这时,我们可能想要通过某种方式来进一步惩罚Alice的犯罪未遂:为她创造一个可信的威胁,给她带来更大的损失,从而理想地将这类行为扼杀在摇篮里。这些惩罚机制在通道结构中十分典型。比如,在 Poon-Dryja 支付通道(目前在比特币的闪电网络中使用的支付通道结构)中,试图兑现过期交易并被抓获将会导致你所有的通道资金都被转移给交易对手。虽然这种惩罚在 Plasma 或通道技术中都不是绝对必要的,但可以说,Plasma 对这种惩罚措施有更强的需求。如果缺乏惩罚的概念,那么Alice可能会反复尝试不正当的提现,从而迫使 Bob(或其他参与者)每次都要花费gas费用来进行响应。然而,讽刺的是,如何在 Plasma 中实施这种惩罚并非如此容易。为了削减Alice 在 Plasma 链中的资金,我们需要确定哪些资金属于 Alice,这需要一个声明/争议窗口机制——我们不妨深入这个充满挑战的兔子洞。
因此,Plasma 结构通常要求 Alice 在尝试提现时进行“退出抵押”。从本质上讲,Alice 的抵押表示“我想要取出5个以太币。如果你发现我的退出证明带有欺诈性的话,那么你可以从我这里拿走1个以太币作为罚款。”我们可以自由设定合约条款,即所需的抵押规模,以及对特定违规行为的响应情形(比如将押金交给质疑成功的参与者作为赏金,或者将其削减为零,或者仅仅涵盖质疑者的 gas 成本等),并根据个人喜好来调整其宽松/严酷程度。
悲惨情况:邪恶的运营者
到目前为止,事情的发展相对顺利。这很大程度上是因为我们做出了极其简化的假设,即运营者将所有人的最佳利益都放在心上。现在是时候来考虑一下我们不愿想象的情形了:如果运营者是一个彻头彻尾的骗子和小偷,那么我们该怎么办?
比方说,Alice 和 Bob 正在开展他们的业务。有一天,他们发现运营者向他们发送了一个区块。这个区块的默克尔根已经在链上进行过认证,其中包括一个赤裸裸的无效交易,比如花费 Plasma 链上90%的以太币。回想一下,运营者全权负责创建区块,因此其理论上可以随意包含任意他想要的东西。更糟糕的是,接下来,运营者要求使用这笔无效交易来进行链上提现。
与 Alice 在上述案例中的欺诈行为不同,因为那只是 Alice 试图进行双重花费,而这笔交易花费的是一个甚至都不存在的“UTXO”。因此,我们无法使用先前的质疑和取消提现的方案。
可能大家很容易就认为我们可以构建一种不同类型的欺诈证明来处理这种不同的作恶行为,即“如果我们要求运营者证明该输入 UTXO 的存在行不行?并且,如果这个 UTXO 是“凭空产生”的,那么我们可以要求证明这个 UTXO 的合法性吗?”
在这种情况下,欺诈证明会很复杂,甚至有可能是不可实现的。但即使探索这条路线也毫无意义,并且徒劳无功,因为它最终会遇到更大的问题。由于我们假定存在一个邪恶的运营者,我们不妨全力以赴——运营者不仅创建了一笔无效的交易并尝试提现,与此同时,他甚至从未与他的用户共享无效的Plasma区块。Alice,Bob和其他参与者现在看到的是一个包含天量资金且极度可疑的退出请求,但他们对于其中的细节一无所知。
那么现在怎么办?我们如何确保我们的运营者不会带着不属于他的资金逃之夭夭?在这种可怕的情况下,我们转向 MVP 的核按钮:鉴于我们不能直接阻止运营者退出,我们可以允许其他参与者先退出:由智能合约负责强制执行一个退出队列,并确保先前的 UTXO 优先退出。因此,只要每个人——没错,确实是每个人——使用Plasma链在运营者的大规模提现完成之前撤回各自的资金,那么运营者想要偷走的以太币将被排空,由此他的恶意企图最终只能无功而返。
从理论上讲,这种方案有效的。无论其他参与方是否作恶,用户始终保管着自己的资金——这就是我们的目标。但坦率地说:恶意运营者(或者更可能是被黑客入侵/被攻陷的运营者)使用不超过一笔交易来迫使所有用户在一定时间内撤回主链的状况远非理想。事实上,在真正最糟糕的情况下,如果主链区块拥堵的时间足够长,那么用户可能无法及时退出,因此实际上可能会失去他们的资金。理论上,我们可以通过更先进的退出策略来减少大规模退出所需的交易数量——比如通过签名聚合来将众多交易批量合并——但这仍然是一个尚有待解决的研究问题。即使这是一个有效的解决方案,它也需要用户之间的协调与合作,因此仍然是次优的。
但 MVP 结构中还有另一个(可以说是)更严重的缺陷。即使在皆大欢喜的情形中,我们也要求所有用户完全验证整条 Plasma 链。这使我们处于可用性Catch-22。Plasma 在扩展以太坊的交易吞吐量上是十分有用的,但 Plasma 链提供的每秒交易吞吐量越高,客户端在带宽和内存方面的负担就会越重。回想一下,Plasma结构的一个关键优势是它可以轻松地支持许多用户,将其用户范围限制在只能运行大型应用程序的人群范围中将会严重削弱其价值主张。
玩转 Plasma (2):浅谈 Plasma Cash
我们回到 MVP 的强制大规模退出漏洞:从某种意义上来说,“问题”的根源在于文中所讨论的资产的可替代性。比方说,我们说 Bob“欠了”5个以太币。由于以太币是一种可替代资产,因此谈论 Bob 欠的是“哪几个特定的以太币”是没有意义的。为此,在我们的“悲惨情形(即运营者作恶的案例)”中,当运营者企图携带超过其自身的份额退出时,我们无法清晰地确定“他偷的以太币是谁家的”。以太币就是以太币,所以运营者窃取的其实就是集体的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或者“未定义”,等等)”默克尔分支来证明这个币已经易主了。
因此,既然我们可以在每个区块中证明币是否存在,我们就可以追踪币的完整历史,这段历史看起来可能会是这样的:
依此类推。关键的一点是,证明这一历史所需的数据仅为每个区块中那一丢丢微不足道的默克尔证明,而不是 MVP 所要求的完整 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 链上的支付网络的用户体验可能就像在一个只能支付现金的餐厅中,你没有零钱,你只能把支票撕开一样。
点击查看原文
欢迎加入律动 BlockBeats 官方社群:
Telegram 订阅群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方账号:https://twitter.com/BlockBeatsAsia