星期一 , 七月 22 2019
首页 / 区块之心 / 玩转Plasma:实现 Plasma 的可替代性

玩转Plasma:实现 Plasma 的可替代性

前言
本文旨在介绍检查点、证明压缩以及默克尔树等概念。本文属于 Daniel Goldman 所撰写的关于 Plasma 的系列文章之一。更多关于 Plasma 理论基础,Plasma MVP 及 Plasma Cash 的内容请参见《玩转Plasma (1):零基础入门》和《玩转Plasma (2):谈谈Plasma Cash》。

在前面的文章中,我们开启了 Plasma 的研究之旅。我们希望寻求一种高吞吐量的支付系统,该系统不仅能够保留以太坊区块链的安全性,同时它只需偶尔进行恒定规模的链上交易。

我们姑且把视线离开 Plasma Cash 结构——在前文中,我们提到过这一结构实现了众多我们想要的功能,但它也带来了两个重大的缺陷:Plasma Cash 的“币”实际上是不可替代性代币 (限制了支付面额的灵活性) 以及它需要用户存储大量不断增长的数据集。

在本文中,我们将探索一些基于 Plasma Cash 并旨在规避——或者至少缓解——这些缺陷的其它功能和机制 (以及/或者重新思考 Plasma Cash)。

免责声明:事情将会变得越来越复杂。引用数学家 Peter Saran 的隐喻来说,这类研究就像是你试图压扁一块尺寸略大于它所在房间的地毯。每当你踩在这个地毯的一角,另一角就会意外地翘起。此外,本文即将开启关于Plasma的研究。正如我们将要看到的,一些问题仍然悬而未决。这里讨论的大部分内容仍处于探索中,仍有待不断发展和发现。

那么接下来,首先是:

减少客户端的数据量,策略1:检查点 (Checkpoints)

我们在(我们此后将称为)香草 Plasma Cash (Vanilla除了有香草之意,还有老式/普通的意思,此处有双关含义) 中看到,每个客户端需要存储的数据量随着时间的推移呈线性增长。

也就是说,对应每一个币,每个 Plasma 区块需要一个关于包含 (币被花费) 或未被包含 (币的所有权保持不变) 的默克尔证明。这个完整的历史是十分必要的,因为没有人知道用户在争议解决过程中需要哪部分证据。完整存储这些数据本身已经足够痛苦了,而在每一次付款时还要将所有这些数据都转移给下一个所有者,这无异于雪上加霜。

为了帮助减轻这种痛苦,我们不妨设想一种方案:比如每隔两周,或者每500个 Plasma 区块,Plasma 链就会官方地发生一些“链上事件”以确定某些 (或全部) Plasma Cash 币的所有权。

也就是说,一旦这个“链上事件”被最终敲定,那么它将成为一个历史检查点:未来一旦需要验证关于当前时刻的所有权证明时,只需要回到这一个点。这里面不再涉及任何关于先前历史的争议。因此,我们可以安全地抛弃掉关于先前区块的默克尔证明。与此同时,这个方案将为必需的客户端数据的大小限定一个具体的上限。完美!

要使这些检查点发挥作用,我们首先需要做的第一件事是确定 Plasma 运营者 (或其他参与者,但为了简单起见,我们姑且假设为运营者) 该如何证明某个特定的 Plasma 区块中的币的所有权的完整状态。

你可能已经猜到,这里面会涉及到一棵默克尔树:运营者构造出一棵树,这棵树负责将每一个币映射到它的所有者地址,然后将默克尔根发送到主链。每一位所有者分别都会收到相应的默克尔分支。如果在2周 (或者其他任意时间) 之后,这些数据都没有受到质疑,那么我们会认为这个检查点的状态已经得到官方认可 (这确实会要求每个用户都在线接收这些数据并对这条链进行监控。但请记住,Plasma 与其他 Layer 2 结构一样,都需要获得这种活性)。

就这样就可以了吗?唉,生活并非如此简单。很不幸,上述检查点机制引入了一个非常讨厌的边缘情况。

假设某个恶意/受损/无聊的运营者在广播了关于某个检查点的默克尔根以后,无法再与用户共享任何默克尔证明数据,那么我们该怎么办?

任何让用户强迫运营者提供这些数据的方法都会让我们陷入说者-听者这一错误等效区域,并 (通常会) 引入破坏向量及其他复杂情况。我们可以说,用户仍然可以安全地将资金撤回到主链上,这一点在技术上没有任何问题。但问题是,现在每个用户都必须疏散到主链上,并且由于我们刚刚介绍的检查点的存在,他们必须在某个有限的窗口 (即两周) 内这么做。我们在前面的文章中所提到的那个被巧妙地按下的地毯的“大规模退出”一角又翘起来了。

但这些数据都不会被丢失,我们可以通过“加密经济聚合签名”这一额外的工作形式来保存这些数据(我敢发誓真实情况没有听起来那么吓人)。实质上,我们稍微修改了一下所有权证明,从而让运营者要求获取检查点中的每一个币的所有者的签名。换句话说,运营者只能在获得币的所有者的明确同意下才能为币设置检查点。然后,运营者还会在链上发布一些额外的数据,以证明在该检查点中包含了哪些币 (想象每一个币都在二进制数字列表中表示,其中“1”表示同意/包含,而“0”表示不包含)。

这种方式虽然看似反直觉,但却足以解决问题!这里的关键是,每一个币都对应特定的有效的所有者,并且这些所有者很清楚自己的身份是什么。同理,他们也知道自己是否同意某个具体的检查点。

因此,这些所有者唯一需要担心的情况是,他们没有在检查点设立时对自己的币进行签名,但却在币的槽中看到了“1”。在这种情况下,他们只能提出质疑——他们清楚这个质疑是有理有据的——并使检查点作废。由此,我们避免了大规模退出的状况,检查点安全无恙。

Layer 2 纯粹主义者可能一下子就注意到,这里的链上要求并不是“严格的 Plasma”方案。位图数据的大小与币的数量线性相关。但实际上,这个成本应该相当小。尤其在大多数情况下,我们可以使用简单的位域压缩技术来极大地减少数据量。此外,检查点的存在对于其所公证的币而言十分有利。因此,链上交易的成本能够十分理想地在所有币的所有者中摊销。最后,检查点的设立是遵循自愿原则的,它最终 (可以说) 是一个非常具体的优化点。

减少客户端的数据量,策略2:证明压缩 (Proof Compression)

另一个更先进的用于降低存储需求的方案是将多个Plasma区块证明有效地压缩成单个证明。

我们不妨再次回想一下,对于香草 Plasma Cash 的币来说,每一个区块都需要一个关于是否被包含的默克尔证明。现有的想法,我们再添加一个关于包含的要求:我们不仅需要链上默克尔根和链下默克尔分支,我们还需要一个链上“ RSA 累加器 (即纯粹使用数论来证明成员资格)”和一个链下的“知识证明 (具体细节待会儿再解释,现在暂时先跳过)”。二者都需要对包含问题作出证明,但只有其中一方需要作出未被包含的证明。也就是说,一个币要么被包含在区块中,要么不包括在其中,没有其他可能性。(对于包含证明来说,)“A和B”的对立面就变成了“(对于未被包含证明来说) A或B”。

从更高的层面来看,这种结构基于这么一个事实,即未被包含这一事实本质上更加容易得到证明。而如果一个币被包含进区块中,那么我们需要更多的数据——至少需要新的接收方的地址。在未被包含的案例中,我们只需要说“这个币没有被包含”。显然,我们应该把这种不对称且更加简便的承诺方案应用到未被包含的案例中。

(前方高能:恐惧数学者勿入)

在进行大量简化以后,以下是具体的工作原理:跟往常的 Plasma Cash M.O. 一样,每一个币将获得一个自然数形式的 ID,但现在我们增加一个额外的要求,即所有这些 ID 必须都是素数。每一个Plasma区块提交的 RSA 累加器 (G) 本身只是一个数字,它随着 Plasma 区块根据币的转移情况进行自我更新。

实质上,在当前区块中,G 会随着被花费的币的 ID 呈幂次增长。例如,在第 101 个区块中,发生转移的币的 ID 为 5,7,17,53 和 83 (都是素数)。我们不妨假设第100个区块所提交的累加器的值为 G100 (这是一个大数),那么第 101 个区块的累加器的值计算如下:

这一新的 G101 的值将被递交给主链。在链下 Layer 2 的世界里,如果 Alice (假设她拥有ID为“17”的币) 想要确保自己的币已经被提交到累加器中,那么她只需要17的余子式,即 5 * 7 * 53 * 83 (153965)。她获取 G101,并且 G101 在主链上,由此验证:

这证实了她的币 ID,即 17 已经被累加器接受不了。与此同时,她也得到了通常的默克尔分支的提交信息。一旦她确认了这一点,那就没有问题了。现在,我们不妨考虑一下 ID 为11的币的所有者 Bob。需要注意的是,这个币没有在第 101 个区块中发生转移。为了得到这个币没有被包含进区块的证明,Bob只需要一个余子式来表明,11 并不是 153965 的因子。也就是说,Bob 本质上只需要一个数字。一旦 Bob 得到了这个数字,基于上述要求的“任一/或”性质,Bob 就无需操心任何跟未被包含证明相关的默克尔分支业务了。

最后,最关键的一点是:考虑到取幂和素数分解的性质,上述过程可应用于多个任意编号的区块中。也就是说,这个过程可以基于多个不连续的区块来完成。换句话说,第 100 个区块和第 101 个区块之间的未被包含证明与第 100 个区块和第 100 万个区块之间的未被包含证明看起来完全相同。二者都只需要 Bob 存储一个数字。

(数学结束)

如果再进一步思考,我们几乎肯定,在特定的币的生命周期中,这个币很可能只是偶尔发生转移。对于绝大多数的 Plasma 区块来说,这个币可能从未发生过变动。通过我们刚刚介绍的机制,币的转移过程之间的间隔现在只需要恒定规模的数据 (即一两个数字)。所以,现在客户端的数据存储只会随着每一次币的转移而增加。这一点非常重要。

请注意,上面方案简化得有点过火了:依照上述规则,G 的值很快就会变得非常庞大。我们做了一些细节的处理,就是让这个值在某个模 M 处具有上限。这个模数允许我们限制累加器的值的增长,同时仍然保留我们需要的所有素因子的信息。然而,即使有了这个上限,如果 Alice 和 Bob 想要去执行验证步骤,他们还需要进行一些非常繁重的算术运算。然而,事实证明,这个问题是可以克服的:我们可以使用几种压缩证明方案。这意味着,Alice 和 Bob 可以只验证他们所关心的结果,而无需经常进行完整且繁琐的计算。

然而,还有一个极度复杂的问题需要解决。我很抱歉地告诉你,目前为止还没有一个简洁的解决方案。简单、轻量级的证明验证确实是一个好东西,但我们不要忘记这些证明首先需要一部分“幸运儿” (即运营者) 来生成这些证明。例如,对于消费级笔记本来说,计算大量复合指数的计算成本实在非常高。

因此,我们至少需要要求运营者拥有精良的服务器端设备。有的人希望我们可以找到一些方法来让这些操作实现并行化,或者将这些工作的一部分外包给多个运营者,甚至整条 Plasma 链的用户群。此外,在机缘巧合之下,其他无关的以太坊生态系统研究引起了 Plasma 研究者对可验证延迟函数 ASICS 的兴趣。可验证延迟函数 ASICS 恰好也需要计算大量的指数栈,因此可能会对此有所帮助。最后,其他方法与 RSA 累加器结构差不多,只不过具有不同的数学/密码学细节——包括向量提交信息和不同的 ZK-SNARK/STARK 方案。我们仍在探索中。然而,这些研究最终是否能够在某种程度上在经济方面克服计算瓶颈,仍有待观察。

可替代性支付:从数字范围的角度来思考

最后,我们不妨做一些改变,比如降低 Plasma Cash 的基本限制,即其资产的不可替代性。如果我们创建一个价值 5 个以太币的 Plasma Cash 币,那么这个币无法被拆分或合并——终其一生,它都是一个价值 5 个以太币的币。

要解决这个问题,我们首先重新思考我们对 Plasma Cash 的看法,而不是实际改变它的任何功能 (至少暂时是这样!)。

我们不妨设想一条 Plasma Cash 链,其中每一个币代表一个固定面额的单一资产,这些资产在主链上是可替代的 (比如以太币)。在此之前,我们谈到将每一个币视为具有唯一ID的不可替换性代币。Alice 的 ID 为 2342 的币可能价值 20 个以太币。我们去做一个等效的思维变换,想象一下这条 Plasma 链中的所有以太币都依照数字线段的形式有序排列。如果链条上总共有 5000 个以太币,那么这条线段将从 0 延伸到 5000。Alice 那 20 个以太币不再由某个独特的 (虽然是任意的) 币 ID 表示,而是用数字线段上的某一段 (即“从 520 到 540 的以太币”) 来表示。为了保证每个人的以太币的所有权的合法性,合约必须强制执行以下功能:无论何时创建出新的“范围”,旧的数字段都存在于先前未被其他范围所占据的间隔中。只要我们能够保证这一点,那么我们就能够构建出与旧的 Plasma Cash 同构的新模型。

到目前为止,一切进展顺利。现在,我们再做进一步升级:假设 Alice 正在花费她的“币”,这意味着现在我们要将她的“数字范围”的所有权转让给另一方。如果在转让的过程中,Alice 不仅可以将这个范围分配给新的所有者,同时还能够改变范围的端点的话,那么会怎么样呢?如果这个功能能够实现,那么Alice就可以自由地向 Bob 支付不多于 20 个以太币的面额,比如“只有从 520 到 523 的以太币”。

为了适配这种情况,我们需要把 Plasma Cash 的结构做一点点改动:我们将保留“币”的概念,同时每个币将代表我们想要支持的数字线段的最小单位 (假设是0.00001个以太币)。现在,这些“币”只是作为一种抽象的存在。从字面意义上说,它们并不构成 Plasma 区块的内容。相反,每一个区块现在都是一棵交易树,每一笔交易都花费在给定范围以内的币。如果某个特定范围内的“币”被其他非支出方(所有者)所拥有,那么真正的所有者可以发出质疑。这时,我们将使用大家熟悉的香草 Plasma Cash 里面的加密经济质疑游戏来解决问题。

所以现在,新的难题变成了:Alice 该如何简洁地向 Bob 证明她正在交易的所有的币都归自己所有,并且不存在其他交易的范围与之重叠或“溢出”到自己的范围内呢?如果是在之前,那么每一笔交易都会被包含在某个币中,但现在,我们需要某种证明以某种方式来传达有关区块中的其他交易的信息。

为了实现这一目标,我们将引入另一种版本的默克尔树!我们将这种新的数据结构称为默克尔索引树。树的叶子是交易本身,每一笔交易代表某个范围内的币的转移。默克尔索引树的新功能是,现在树中的每一个节点都会获得一个分配给它的数字。其规则如下:

(1) 树的底部的叶子的范围必须连续排列(即每个范围的结束点必须小于下一个范围的起始点),并且

(2) 每个父节点的数值等于其两个子节点的较小值 (如果其子节点是范围,那么我们则使用每个范围的起始值作为参考)。

只要某个范围的接收者验证上述规则成立,那么默克尔证明就足以让他们相信当中不存在范围重叠问题。这样的结构很难被攻击。因此,上述结构让 Alice 只需发送其所拥有的某个范围的子部分。这在某种意义上就是对她的以太币进行了“拆分”。接下来,我们希望用户能够“合并”他们的以太币。假设 Bob 总共有 12 个以太币,他从Alice处收到了“从 520 到 523 ”以及“从 1001 到 1010”范围内的以太币。我们希望 Bob 能够将这 12 个以太币作为单个整体原子支付给他人。

经过一些巧妙的转换,我们可以实现这一功能:网络中不存在任何阻碍来阻止单笔交易同时指定多个范围用作支付。如果其中任意一个范围显示无效,那么所有范围的支付请求都会被取消。这里面的问题是,现在接收者需要追溯上述两个范围的历史。当然,如果他们将所有这些范围外加一部分额外的范围都发送给另一方,那么接收方需要所有相关范围的历史记录。因此,我们逐渐开始靠近需要所有参与方来验证整条链的终点站。这块地毯的“证明大小”一角已经翘起来了。

为了解决这个问题,当历史记录的大小开始接近某个棘手的水平时,各参与方可以对其范围进行“碎片整理”。他们只需要与其他参与方 (等值地) 交换范围,以便使范围尽可能地开始整合。人们可以认为这类似于支付通道网络中的通道再平衡策略。拥有整个网络全局视图的运营者显然可以帮助实现这一目标。我们已经讨论过几种用于实现这一目标的加密经济机制和碎片整理算法,但具体哪种方法的效果最好,则需要在实践中验证。

(请注意:另一个结构家族,即混合通道/Plasma 模型,也可以为我们提供更大的支付可替代性。这一部分内容在后续文章中会继续讨论)。

结论

恭喜你,你已经实现了 Plasma 的可替代性了!那么接下来我们应该怎么办?Plasma 的难题是不是已经被我们破解啦?很难说,上述方案不太像是一个杀手级解决方案,我始终感觉还有哪里不太满意。与此同时,这个工具包中的各种技术也许最终足以实现真正的 Plasma 链。时间会告知答案。

不管怎样,关于 Plasma 的研究和开发仍在以惊人的速度向前发展。所以当你读到这篇文章的时候,你会发现还有更多事情等待你去考虑(实在抱歉)。我们下回再见。

感谢 Ben Rose,Dan Robinson 和 Georgios Konstantopolous 的讨论和反馈

参考链接:https://www.theblockcrypto.com/2019/03/20/understanding-plasma-part-2-make-plasma-fungible-again/

关于 冯先生失眠中

冯先生失眠中
卷而怀之

检查

大算力矿机争夺战

币价上涨,丰水来临,随着算力难 …

发表评论

电子邮件地址不会被公开。 必填项已用*标注