这一系列文章将围绕以太坊的二层扩容框架 Plasma,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。

在上一篇: Plasma MVP 文章中我们已经理解了 Plasma 的最小实现 Plasma MVP 如何使用 UTXO 模型实现 Plasma 链下扩容的核心思想。但由于 Plasma MVP 本身过于简单,并不能用于实际的生产环境中。2018 年 3 月,在巴黎举行的以太坊开发者大会上,Vitalik 发布了 Plasma Cash 模型 [1],可以视为对 Plasma MVP 的改进。Plasma Cash 与 Plasma MVP 的主要区别是每次存款操作都会产生一个唯一的 coin ID 对应转移到侧链上的资产,并使用一种称为稀疏梅克尔树(Sparse Merkle Tree)的数据结构存储交易历史。由此带来的好处是用户不需要关注子链上的每个动态,只需要关注跟自己的 token 有关的动态。在下文中将介绍具体细节。

存款(Deposits)

Plasma Cash 中的每次存款操作都会对应产生一个 NFT(non-fungible token)[2]。NFT 可以简单理解为 “不可互换的 token”,即每个 token 都是独一无二的,由唯一的 ID 标记。以太坊官方为 NFT 提供了 ERC721 标准 [3],在之前火爆到阻塞以太坊的 CryptoKitties 就是由 ERC721 合约实现的。

在 Plasma Cash 中,当用户向 Plasma 合约发送存款交易时,合约会生成一个与存款等值的 token,并给这个 token 分配一个唯一的 ID。如果一个用户分别执行两次存款操作,且每次存款都是 5 ETH,那么他将得到相等价值的两个完全不同的 token。和 Plasma MVP 一样,每次存款操作都会使得 Plasma 合约产生一个只包含这个存款交易的区块。

这里的区块及下文的区块指的是子链区块对应在主链合约中的记录。

Plasma Cash 区块

Plasma Cash 中的每个 token 都被分配唯一的 ID,因此可以按 ID 的顺序存储每个 token 的交易历史。Plasma Cash 的区块按 token ID 的顺序给每个 token 分配了一个插槽(slot),每个插槽会记录这个 token 是否被交易的信息。例如在下图(来源 [4])的区块中,包含 4 个 token,id 分别是 #1,#2,#3,#4。其中 #1,#2,#3 被标记为没有被花费,而 #4 由用户 A 发送给用户 B。

从上面这个例子中我们可以看到,每个插槽记录了其所对应的 token 在当前区块中的交易状态,所有存储了某个 token 的交易状态的区块按时间顺序连在一起就构成了这个 token 的全部交易历史。每当一个 token 被分配了一个 id,之后的所有交易状态都会被保存在每个区块相同的插槽中,也不会被其它 token 取代。因此,用户只需要关注每个区块中存储属于自己的 token 的状态,完全不用关心别的插槽存储的内容。

交易与验证

由于 Plasma Cash 中的节点只追踪属于自己的 token 的交易历史,因此当有交易发生时,token 的发送者要向接收者提供关于这个 token 所有的交易历史(从存款交易开始)以便接收者验证。从下图(来源 [4])的例子中可以看到 4 个区块中所记录的 4 个 token 的交易历史。

截止到区块 #4,可以看到 token #1 和 token #3 始终没有被交易。token #2 在区块 #2 被 E 发送给了 F,在区块 #4 被 F 发送给了 G,在其它区块没有发生交易,token #2 的最终所有权归 G。token #4 在区块 #1 被 A 发送给了 B,在区块 #3 被 B 发送给了 C,在其它区块没有发生交易,token #4 的最终所有权归 C。F 为了向 G 证明 token #2 的合法性,需要向 G 提供 token #2 在前 4 个区块中的所有交易历史,也就是说不仅需要包括区块 #2 中 E => F 的交易证明、区块 #4 中 F => G 的交易证明,还要包括在区块 #1 和 #3 中没有被交易的证明。到这里可能感觉有点奇怪,为什么还要包括没有被交易的证明?这是为了防止双花,因为 G 并不知道在区块 #1 和 #3 中 token #2 是否被交易给了其它人。假如 F 在区块 #3 中将 token #2 发送给了 H,并且对 G 隐瞒了这个交易,那么发生在区块 #4 中的 F => G 就是非法(双花)的。因此,在 Plasma Cash 中,完整且合法的交易历史是一个 token 被安全交易的前提。

稀疏梅克尔树(Sparse Merkle Tree)

在上文中我们已经了解到一个交易的成功的前提是需要发送方提供关于一个 token 的完整交易历史。完整的交易历史既包括这个 token 在哪些区块被交易的信息,也包括这个 token 在哪些区块没有被交易的信息。我们都知道,在区块链中,使用梅克尔树(Merkle Tree,MT)构造梅克尔证明(Merkel Proof, MP)可以在 O (logN) 的时间复杂度验证一个交易是否存在一个区块中。但想要证明一个交易没有存在一个区块中,使用标准的梅克尔树却没那么容易。因此,Plasma Cash 中使用了一种称为稀疏梅克尔树(Sparse Merkle Tree,SMT)的数据结构存储交易数据,能够在 O (logN) 的时间复杂度验证一个交易不存在。

SMT 实际上一点都不复杂,它的叶子节点是按数据集中的元素序号顺序排列的。如果某个叶子节点对应的元素为空,那么该叶子节点将存储一个特定的值(例如 0 的哈希值)。一个简单的 SMT 示例如下图(来源 [5])所示。

扩展到 Plasma Cash 中,SMT 的叶子节点对应了区块中给每个 token 分配的插槽,按照每个 token 的 ID 排序。每个叶子节点存储对应的 token 的交易信息,如果 token 在这个区块中没有被交易,则相应的叶子节点存储的值为 null

以上图为例,如果需要证明交易 A 存在,就像在标准的 MT 中一样,需要构造 MP:H (null) 和 H (H (null) + H (D))。如果需要证明 B 不存在,同样很简单,我们已经知道 B 的位置是第二个叶子节点,如果 B 不存在,那么该节点存储的值应该为 null。因此就像在标准的 MT 中证明存在的 MP 一样,只不过需要加上 H (null) 作为 MP 的一部分,即 MP:H (null)、H (A) 和 H (H (null)+H (D))。

取款 / 退出(Withdrawl/Exit)

Plasma Cash 中的取款操作在流程上跟 Plasma MVP 大体相同,都要从提交取款申请开始,经历争议期之后才能完成。由于 Plasma Cash 中采用的数据结构不同,在取款时需要提交的 token 所有权证明不同,因此当争议发生时需要提交的争议证明也不同。

提交取款申请

在向 Plasma 合约提交关于某个 token 的取款申请时,需要提供关于这个 token 最近的两次交易证明。例如,在上图中,假如 G 想要取走 token #2 到主链,那么他需要提交关于 F => G 以及 E => F 的 Merkle Proof。

提交争议

取款者在提交了取款申请之后同样需要支付一定的保证金,并等待一段时间的争议期。在这期间如果有其它节点提交了有效的争议证明,那么取款者不但无法完成取款操作,也会损失全部或部分的保证金。

目前 Plasma Cash 支持三种争议证明,分别应对三种不同的攻击场景(具体会在后文分析):

  1. 已花费证明。如果能证明正在取款的 token 已经被花费,那么取款立即被取消;
  2. 双花证明。如果能证明取款申请中提供的两次交易证明中间还有别的交易,即发生了双花,那么取款立即被取消;
  3. 非法交易历史证明。用户还可以对正在取款的 token 的其它交易历史提出争议。这种争议不会立刻阻断取款,而是强制取款者提交其它交易证明来反驳争议,如果没有在规定时间内反驳,则取款被取消。

攻击场景

在这一节将讨论已有的 3 种攻击场景以及如何构造争议分别应对这些攻击 [6]。在这里假设 Plasma Cash 中存在不可信的 operator 接收所有的交易并构造区块。

发送交易后立即退出

如下图(来源 [7])所示,假设攻击者 Alice 向 Bob 发送了一个 token A,且 Bob 已经验证了 A 的交易历史没有问题,交易在区块 N+X 得到确认。在这之后,Alice 立即提交取款申请,企图将 token A 取回主链,并提交 A 在区块 N 以及之前的交易证明。为了应对这种情况,Bob 必须及时发现 Alice 的取款行为,并且在争议期结束前提交在区块 N+X 中 token A 被 Alice 发送给 Bob 的证明。这里需要注意的是,如果 Bob 在区块 N+Y 将 token A 发送给 Charlie 的交易是不能被当做争议证明的,只有最接近被争议的交易的下一个交易证明有效。

双花攻击

双花攻击需要 operator 配合,将含有已经被花费的 token 的交易打包入下一个区块中。如下图所示(来源 [7]),攻击者 Alice 和 Charlie 是同谋,Alice 向 Bob 发送一个 token A 在区块 N+X 被确认,之后 Alice 又将 token A 发送给 Charlie,并在区块 N+Y 被确认。这时在主链看来,Bob 和 Charlie 都是 token A 的合法拥有者。接下来,Charlie 立即提交取款申请,企图取走 token A。Bob 为了防止自己的 token 被盗,可以在争议期内提交在区块 N+X 被确认的交易,表明自己在 Charlie 之前已经拥有了 token A。

取款包含非法交易历史

这种攻击需要联合比较多的同谋者。如下图所示,Alice 在区块 N 拥有 token A。Bob 联合 operator、Charlie 以及 Dylan 企图盗走 Alice 的 token。首先,operator 伪造 Alice 将 token A 发送给 Bob 的交易,并在区块 N+X 得到确认,之后 Bob 将 token 发送给 Charlie,在区块 N+Y 确认。同样地,Charlie 接着将 token 发送给 Dylan,在区块 N+Z 确认。这是,Dylan 提出取款申请,企图取走 token A。Dylan 用于取款申请的两个交易证明 Charlie => Dylan 和 Bob => Charlie 都是合法的,但 token A 的交易历史中有一部分是伪造的。Alice 为了证明自己是 token A 的最新合法拥有者,可以提出争议,要求 Dylan 提供 Alice => Bob 的交易证明,同时 Alice 需要提交一部分保证金(否则任何人都可以随便提出争议)。Dylan 必须在一定的时间内提供合法的交易证明,否则取款失效。

相关项目

Talk is cheap, show me your code.

目前已经有许多机构和公司已经实现了 Plasma Cash,但实现的语言和细节有所不同:

  • Loom Network [8]
  • Omisego [9]
  • Wolk [10]
  • Lucidity [11]

总结

本篇介绍了 Plasma 框架下的基于 NFT 的项目 Plasma Cash。Plasma Cash 给每个新转移的 token 分配一个唯一的 token ID,并且用稀疏梅克尔树存储交易,使得用户可以只关注跟自己的 token 有关的动态,而不需要关注其它 token。Plasma Cash 可以被看作 Plasma 逐渐迈向成熟的一步,已经有很多公司使用 Plasma Cash 搭建自己的平台和应用,例如 Loomnetwork 公司搭建了自己的 Plasma Cash 子链并且编写了 SDK 支撑开发者在上面开发新的应用。然而 Plasma Cash 本身仍然存在较多的问题,例如 token 无法被分隔合并、需要提交的证明过长等。在接下来的文章中还会继续跟进 Plasma 最新的进展。

相关资源

  1. https://ethresear.ch/t/plasma-cash-plasma-with-much-less-per-user-data-checking/1298
  2. https://en.wikipedia.org/wiki/Non-fungible_token
  3. http://erc721.org/
  4. https://github.com/ethsociety/learn-plasma
  5. https://medium.com/@kelvinfichter/whats-a-sparse-merkle-tree-acda70aeb837
  6. https://karl.tech/plasma-cash-simple-spec/
  7. https://github.com/loomnetwork/plasma-paper/blob/master/plasma_cash.pdf
  8. https://github.com/loomnetwork/plasma-cash
  9. https://github.com/omisego/plasma-cash
  10. https://github.com/wolkdb/deepblockchains/tree/master/Plasmacash
  11. https://github.com/luciditytech/lucidity-plasma-cash

深入理解 Plasma(四)Plasma Cash相关推荐

  1. (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)

    目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三) ...

  2. 红黑树理解(四) 左旋

    红黑树理解 (一) 从2-3树到红黑树 红黑树理解(二)插入过程图解 红黑树理解(三)变色 红黑树理解(四)左旋 红黑树理解(五)右旋 左旋的目的是什么? 称以旋转节点为根节点的红黑树为T,左旋的目的 ...

  3. 本质安全设备标准(IEC60079-11)的理解(四)

    本质安全设备标准(IEC60079-11)的理解(四) 对于标准中"Separation"的理解 IEC60079-11使用了较长的篇幅来说明设计中需要考虑到的各种间距, 这也从一 ...

  4. mysql隔离级别底层实现_1、深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)...

    一.ACID特性 持久性,我们就不讲了,易懂. 1.原子性 在同一个事务内部的一组操作必须全部执行成功(或者全部失败). 为了保证事务操作的原子性,必须实现基于日志的REDO/UNDO机制:将所有对数 ...

  5. 【深度学习】深度学习中模型计算量(FLOPs)和参数量(Params)等的理解以及四种在python应用的计算方法总结

    接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...

  6. 数据分析师如何构建数据指标体系?理解以下四个模型就够了!

    点击上方 蓝字 关注我们 我的新书<数据分析之道--用数据思维指导业务实战>正式出版了,本书以数据分析思维为主题,主要介绍对比思维.分群思维以及相关思维三大数据分析思维. 今天的内容节选自 ...

  7. 深入理解 wpa_supplicant(四)

    本文为<深入理解Android Wi-Fi.NFC和GPS卷>读书笔记,Android源码为Android 5.1 android-5.1/external/wpa_supplicant_ ...

  8. 点云网络的论文理解(四)-点云网络的优化 PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

    目录 0.Abstract 0.1逐句翻译 0.2总结 1.Introduction 1.1逐句翻译 1.2总结 2.Problem Statement 2.1翻译 2.2总结 3.Method 3. ...

  9. Java中Map集合如何理解(四)——精简

    目录 引言 概念 Map集合实现类 HashMap LinkedHashMap TreeMap 默认排序 自定义排序方式 常用API 遍历Map集合 键找值 键值对 Lambda表达式 结束语 引言 ...

  10. python super 理解(四)

    原文链接 super()单继承可以为做什么呢? 像其他面向对象的语言一样,它允许您在子类中调用超类的方法.这种方法的主要用例是扩展继承方法的功能. #长方形定义 class Rectangle:def ...

最新文章

  1. caioj 1063 动态规划入门(一维一边推1:美元和马克)
  2. JavaScript实现将位转换为浮点数bitsToFloat算法(附完整源码)
  3. ruby 连接mysql数据库
  4. 前端学习(2183):tabber--基本架构的构建
  5. 《微信小程序开发》学习情况大调查!
  6. 【Python】Python库之Web信息提取
  7. 2016CCF-CCSP竞赛:第1题-虚拟机设计(共3题)
  8. Python科学计算——Numpy知识点
  9. 深信服短信认证云信通短信配置说明
  10. 30款硬盘有问题 细看希捷固件门事件.
  11. laravel 框架使用hdjs 实现单图上传功能
  12. 信息孤岛的形成与治理
  13. 什么是python语言的解释性?
  14. Java计算当前时间,结合时区
  15. PTA——21级数据结构与算法实验3——栈和队列(参考答案)
  16. 如何进行 360 评估
  17. JDK1.8u162以及JDK1.8所有历史版本官网下载地址
  18. 【遗传编程/基因规划】Genetic Programming
  19. 街机游戏-FC游戏的hack修改rom
  20. 浏览器跳出HTML编码,浏览器如何解析HTML字符编码

热门文章

  1. python期末考试是怎么考的_python期末考试复习
  2. React中setState的怪异行为 ——setState没有即时生效
  3. 【风宇冲】动画系统Mecanim
  4. surface surfaceTexture
  5. 解决VAX 2210 不能识别 VS2017的问题
  6. 计算机桌面蓝字,教你电脑桌面图标有蓝色阴影怎么去掉
  7. jmeter+PerfMon Metrics Collector监控(ServerAgent)
  8. select 选择框里最多可是多选的情况
  9. Xcode10适配之libstdc++.6.0.9.tdb
  10. 使用pandoc 生成带中文的pdf