第五章:Layer2 实现方式之 Plasma
Plasma 作为以太坊的二层扩容框架,自从 2017 年被 Joseph Poon(Lightning Network 创始人)和 Vitalik Buterin (Ethereum 创始人)提出以来,一直是区块链从业人员关注的焦点, 首先要明确的是,plasma是一个框架,用于激励和强制执行智能合约,可扩展到每秒大量的状态更新(可能是数十亿),使区块链能够代表世界范围内大量分散的金融应用程序。这些智能契约被激励通过网络事务费用自主地继续运行,这最终依赖于底层区块链(例如Ethereum)来强制事务状态转换。
一 为什么我们需要 Plasma
在我们试图解释什么是 Plasma 之前,我们应该首先了解为什么存在 Plasma。这将是一个相对较高级别的概述,并会尽量避免涉及很多细节,但它应该为本网站的其余部分奠定基础。基本上,它归结为一个事实,即当前的区块链系统按照现代标准相当缓慢。为了处理任何广泛容量的简单支付,区块链需要每秒处理数千笔交易。以太坊目前最多只能支持每秒 20-30 笔交易,具体取决于网络状况
这种已经存在和需要存在的差异通常被称为“区块链可扩展性”问题,这不是一个容易解决的问题!我们想扩展区块链系统,但我们也想确保我们以一种保持安全性和去中心化的方式进行扩展。毕竟,这就是我们首先开始构建区块链的原因。
项目正在以许多不同的方式解决可扩展性问题。其中一些项目正试图通过升级区块链本身来使区块链更具可扩展性。我们经常将其称为“第 1 层”缩放,因为我们正在修改基础层。其他项目正试图在现有系统之上构建东西。我们通常将此称为“第 2 层”扩展,因为我们正在添加一个新层而不是更改底层系统。
Plasma 适合第二类“第 2 层”扩展项目。了解第 2 层项目的工作原理以及它们试图完成的工作非常重要。许多第 2 层设计来自于这样的观察:每个人都没有必要了解网络上发生的每笔交易。
我们可以通过将资产锁定在主链(或“根链”)上并在侧链上再次“创建”它们来从一条链中获取资产并将它们转移到另一条链(称为“侧链”) . 当你想回去的时候,你只需要“销毁”侧链上的资产并在根链上解锁它们。
这听起来很简单,但有一个大问题——必须有人同意在侧链上“创建”这些资产。那么谁来“创造”资产呢?嗯,基本上是共识机制。这里的想法是,如果侧链共识机制运行正常,那么你的资产就是安全的。不幸的是,侧链通常远不如根链安全。如果有人设法“凭空”创造了与锁定在根链上的资产不对应的货币,他们可以“摧毁”这些资产(他们以欺诈手段创造的)并窃取大量资金。
显然这并不理想。只要侧链是安全的,你的资产就是安全的。但是,如果侧链发生故障,那么您的资产可能会被盗!这是我们介绍等离子的地方。Plasma 最初是为了获得侧链的一些好处而开发的,同时确保存储在侧链上的资产始终是安全的(只要根链是安全的)。我们并没有获得侧链的所有效用,但我们保留了一些最重要的东西(比如能够廉价地进行交易),同时也保持了安全性。Plasma 的基本原理是,如果侧链发生安全故障,所有用户资产始终可以“回退”到根链。
二. Plasma 简介
总的来说,Plasma 就是以太坊生态所谓 “Layer 2” 解决方案之一。是一种二层网络扩容方式,它的基本原则是,如果侧链发生安全故障,所有用户资产都可以“回退”到根链;Plasma 就是一种在不牺牲安全性的同时又能大幅提高交易处理效率的去中心化应用构建方式。
三. Plasma 的实现细节
1. 存款
Plasma 的主要思想就是将大部分计算过程都转移到链下进行,用户只有在进入和退出 Plasma Chain 的时候需要跟主链上的智能合约交互,这也是所有 Plasma 应用的标准流程。
用户在将主链的资产(如以太币或者其它 ERC20 合约发布的 token)转移到 Plasma Chain 的过程称为存款(Deposit),具体做法是直接向主链上的 Plasma 合约发送以太币或 token。Plasma 合约收到 Deposit 交易后会在子链上创建跟 Deposit 数额一致的交易,并将其打包进区块中,作为存款确认的证明。这个过程如下图所示
当用户看到子链上自己之前存款的交易被确认后,就可以在子链上使用这笔资产(给子链上的其他用户发送交易或者退出子链等)。
2.链下执行
Plasma 应用程序在“根链”(例如以太坊)之外完成大部分工作。根链往往速度缓慢且成本高昂,因为它们需要非常安全。如果一个应用程序可以在根区块链之外做任何工作,它应该。
例如,在Plasma MVP中,几乎每笔交易都发生在以太坊之外。智能合约只处理存款和取款,即进入和退出点。这是等离子应用的标准工作流程。任何不需要资产/数据进出智能合约的东西都可以在链下处理。
3. 状态确认
当大部分都转移到链下进行时,需要某种机制确保链下状态的更新得到确认,这样才能保证当有恶意行为发生时,主链可以保证用户不会受到损失。这就是为什么需要状态确认(State Commitment),即子链周期性地将状态更新情况提交到主链进行共识。
然而,将子链中的所有交易都同步到主链显然违反了 Plasma 的初衷,在 Plasma 中,实际向主链提交的是 Merkle Tree 的根哈希。因此子链中的实际交易情况被隐藏,在主链上只能看到子链区块的哈希值。
当有恶意行为发生时,子链网络中的所有用户都可以向主链提交防伪证明,证明成立后,含有恶意交易的区块将被回滚。
4.防伪证明(Fraud Proof)
Plasma 的一个关键设计之一就是允许用户构造防伪证明(Fraud Proof)。防伪证明的意义在于只要发布区块的节点构造了含有恶意交易的区块,那么就要承担被惩罚的风险。每当新的区块被提交到主链上时,会留出一段时间给用户提交防伪证明,如果在这段时间内没有证明被提交,则认为新的区块被验证合法。如果有防伪证明检测到区块中存在恶意交易,则该区块将被舍弃,回滚到上一个被验证合法的区块。Plasma 中的防伪证明主要有以下(但不限于)几种:
- 资产可花费证明
- 交易签名有效性证明
- 存取款证明
至于每种防伪证明的具体形式,则依赖于实际 Plasma 应用的实现细则。
如下图所示,子链中每个节点都存有 1-4 个区块的数据。假设区块 1-3 已经被验证合法,而区块 4 中存在恶意交易,那么每个节点都可以使用 1-4 个区块中的数据构造防伪证明提交到主链,主链验证后将子链中的状态回滚到区块 1-3。
防伪证明还可以使用零知识证明(zk-SNARKs 或者 STARKs)来构造,但由于目前通过零知识证明生成证明的时间和空间还有待优化,目前设计的 Plasma 并不依赖零知识证明。零知识证明在 Plasma 中的应用是一个很有前景的研究方向
5.取款(Withdrawal)
取款(Withdrawal),顾名思义,就是从子链中的资产取回到主链上,因此取款也被称为退出(Exit)。取款操作可以说是 Plasma 框架中最重要的一步,因为它确保用户可以安全地将子链上的资产转移到主链上。之前的存款以及状态确认步骤已经产生了一些交易数据,并在主链上得到同步,用户可以利用这些数据构造资产证明,之后执行简单取款(Simple Withdrawal)操作退出子链。当有扣留(Withholding)攻击发生(即子链上的矿工恶意扣留区块,意图双花攻击等)时,用户可能无法成功获取数据构造资产证明,这时需要执行批量取款(Mass Withdrawal)操作退出子链。
需要注意的是,当子链中有取款操作发生时,跟这个取款操作相关的账号或者交易都将被禁止。
5.1. 简单取款(Simple Withdrawal)
执行简单取款的条件是所要取回的资产已经在主链和子链上确认。
一个简单取款的执行主要有以下几个步骤:
向主链上的 Plasma 智能合约发送已签名的取款交易。取款的数额可以包含多个输出(UTXO模型),但所有输出必须在同一个子链当中,而且每个输出的余额必须全部取出,不能只取出一部分。取款数额的一部分还需要被当作押金,作为恶意行为的惩罚。
当取款请求发送后,需要等待一段“争议期(Challenge Period)”,这期间其它节点可以构造证据证明该取款中的部分或全部数额已经被花费。如果争议期内有节点提供证明成功,那么取款被取消,而且押金被扣除。
接下来可能还要等待一段时间,直到所有区块高度较低的取款操作都完成。这是为了保证所有取款操作按照“先来后到”的顺序执行。
当争议期结束后,如果没有争议被提出,则认为取款操作成立,取款者将子链资产成功取回到主链。
5.2.快速取款(Fast Withdrawal)
快速取款(Fast Withdrawal)跟简单取款相比的差别主要是引入一个中间人,白皮书上称为 Liquidity Provider,这里简称为 LP。如果一个用户不想等待很长的争议期(目前的实现至少要一周),那么它可以选择从 LP 这里直接取款,只需要消耗一个交易确认的时间,代价是需要支付给 LP 一定的费用。由于 Plasma 白皮书上关于快速取款的描述太过晦涩,这里主要参考 kfichter 提出的 Simple Fast Withdrawal[3] 来介绍快速取款是如何实现的。
为了实现快速取款,取款方和 LP 可以利用一个流动合约(liquidity contract)。假设取款方是 Alice,她想要执行快速取款将 10 以太币从子链转移到主链。她首先向流动合约发送 10 以太币,注意这里的交易是在子链上进行的。当这个交易被子链打包成区块后,Alice 可以调用合约中的某个退出函数,这时 Alice 将获取一个代表她这笔资产的 token。Bob 作为 LP,他检查了子链上数据之后证明 Alice 的取款没有问题之后愿意以 9 以太币的价格购买这个 token。Alice 将 token 卖给 Bob,获得了 9 以太币,Bob 赚取了 1 以太币。
需要注意的是,实现快速取款的前提条件是没有拜占庭行为发生,即没有扣留区块攻击发生,因为 LP 需要验证取款方的交易历史。
5.3. 批量取款(Mass Withdrawal)
当子链中有拜占庭行为(例如,区块扣留攻击)发生时,将会影响以后生成防伪证明,因此网络中的每个用户都有责任快速退出子链。虽然批量取款(Mass Withdrawal)操作不是必要选择,但当大量用户执行取款时很可能会造成主链拥塞,也会消耗更多的 gas,因此批量取款是当子链受到攻击时更好的选择。
批量取款操作由于所采用的模型(UTXO 模型或者账户模型)不同会有较大的差别。
当子链中有拜占庭行为发生时,用户之间可以共同协作执行批量取款。这时会有一个节点扮演取款处理人(Exit Processor)的角色,简称为 EP,负责当前某个批量操作(可以同时有多个批量取款操作发生,但同一个取款申请不能存在于多个批量取款),并且可以收取服务费作为报酬。EP 将构造一个位图(bitmap,即一串0/1)记录哪些资产要执行取款。之后 EP 将利用现有的区块数据检查每个取款是否合法,之后将构造一个批量退出初始化交易(Mass Exit Initiation Transaction,MEIT),并将其发送到主链上。在 MEIT 被主链确认之前,每个用户都可以对这个交易提出异议。当争议期结束,MEIT 被主链确认,批量取款成功。
四. Plasma 的优缺点
1. 优点
等离子链块根的行为有点像区块链中的“保存点”。请记住,侧链的主要缺点之一是侧链共识机制可以停止生产区块并永远锁定每个人的资金。由于用户可以使用区块根来表明他们在 Plasma 链上收到了资金,因此 Plasma 不存在这个问题!如果等离子链共识机制停止创建块,用户可以使用块根向以太坊提出索赔(“我声称我在等离子链上有 10 个 ETH,我想提取它。”)。
实际上,这意味着等离子链在设计上比侧链更安全。只有当以太坊失败时,你的资金才会面临风险,但你可能会遇到更大的问题。简单地说,等离子链与主链共识机制一样安全,而侧链仅与它自己的共识机制一样安全。这种方便的特性也意味着等离子链可以使用非常简单的共识机制(就像一个单一的权威!)并且仍然是安全的。
2. 缺点
所以等离子链为我们提供了与主区块链一样安全的廉价交易。但是有什么问题呢?
好吧,当我们使用侧链时,我们必须信任侧链共识机制。如果该机制失败,无论如何我们都不走运。这种信任使得做真正复杂的事情成为可能,因为我们也隐含地相信侧链会在未来出现。
在等离子链上,我们通过不做出这种假设来保证资金的安全。我们总是不得不假设等离子链共识机制可能随时失败,需要围绕它进行设计。这对等离子链上可能发生的事情增加了额外的限制。
举个例子,一个很长的(比如说 1 年)时间锁合同。如果您相信侧链将在一年内出现,您绝对可以将该合约放在侧链上。但是由于我们不相信等离子链会在一年内出现(即使它是完全相同的共识机制!),我们需要跳出框框思考一下。我们基本上需要确保如果共识机制失败,我们有办法将整个时间锁合约移回以太坊。幸运的是,这并不难,但它比在侧链上更复杂。
当等离子链上的东西如何重新回到以太坊时,事情变得非常复杂。仅持有您的资金的时间锁定合约是有意义的,因为您应该能够移动合约似乎很明显。但是,如果我们谈论的是同时为 100 人持有资金的时间锁定合约呢?现在已经不是那么清楚了。
简而言之,等离子链的主要缺点是您无法真正执行与侧链相同的复杂操作。但重要的是,您不能做这些复杂事情的原因是您采取了更多预防措施以确保您的资金安全。
五. Plasma MVP
Plasma MVP是针对极其简单的基于UTXO的 Plasma 链的设计。基本的 Plasma MVP 规范支持高吞吐量支付交易,但不支持更复杂的结构,如脚本或智能合约。在本页中,我们将介绍 Plasma MVP 背后的设计过程。您将准确了解 Plasma MVP 的工作原理,以及它为何如此构建。我们还提供了详细的规范,因此您可以构建自己的 Plasma MVP 实现!
整个 Plasma MVP 的生命周期可以通过下面这幅图表现出来:
1.Plasma 合约
首先需要将 Plasma 合约部署到主链(以太坊)上作为主链和子链沟通的媒介。Plasma 合约会处理由子链提交的区块,并且将区块的哈希值存在主链上。除此之外,还会处理用户的存款(deposit)、取款(withdrawal/exit)以及争议(challenge)操作。
Plasma 合约中主要包括的数据结构有:
- Owner:合约的拥有者(即部署合约交易的发送者)的地址,即部署合约交易的发送者;
- Plasma 区块列表:每个 Plasma 区块中存储了(1)区块的 Merkle root(2)区块提交的时间;
- Plasma 区块或许叫区块记录更准确,因为它是指在合约的区块记录。
退出列表:即提交了退出申请的列表,每个退出申请存储了(1)申请者的地址(2)申请退出的 UTXO 的位置。 Plasma 合约中主要包括的函数有:
- submitBlock(bytes32 root):向主链提交一个区块,仅仅提交区块中所有交易的 Merkle root;
- deposit():生成一个只包含一个交易的区块,这个交易中包含与 msg.value 值相等的 UTXO;
- startExit():执行给定 UTXO 的退出操作;
- challengeExit():向某个正在执行的退出提出争议。
2.Operator
在前面的文章中我们已经知道 Plasma 子链是一个独立的区块链,那么也就有独立的共识机制。在 Plasma MVP 中采用的共识机制就是 PoA(Proof of Authority),即参与共识的只有唯一一个矿工,称为 Operator。Operator 负责处理所有子链上发生的交易,将其打包成区块存储在子链上,并且周期性地向 Plasma 合约提交区块,将子链上的状态(区块的哈希值)提交到主链共识。那么,既然 Operator 是唯一的矿工,这不就意味着 Plasma 违背了去中心化的初衷了吗?其实,这是去中心化向执行效率的妥协。在之前的文章中也提到过,Plasma 的安全基础依赖于底层的区块链,只要底层的区块链能够保证安全,那么在 Plasma 子链上发生的最差结果也只是迫使用户退出子链,而不会造成资产损失。
Operator 可以采用最简单的 REST API 方式实现,子链中的用户可以通过调用简单的 API 获取到子链中区块的数据。
3.存款(deposit)
用户 Alice 通过存款(deposit)操作向 Plasma 合约发送带有一定数额的以太币或 ERC20 token 加入 Plasma Chain,这时 Plasma 合约会执行 deposit() 函数,生成一个只包含一个交易的区块,这个交易的 UTXO 记录了 Alice 从主链转移到子链的数额。当这个区块被主链确认后,Alice 就可以使用新生成的 UTXO 向其它用户发送交易了。
4.交易(transaction)
在 Plasma MVP 中,所有用户发送的交易都是直接发送给 Operator,当积累了一定数量的交易后,由 Operator 将交易打包成区块。这里需要注意的是,由于 Plasma MVP 采用的是 UTXO 模型,所以即使交易的收款方不存在,交易也是成立的。
在子链上 Alice 向 Bob 发送一个交易的流程如下:
- Alice 首先需要得到 Bob 在子链上的地址;
- Alice 将一个或多个 UTXO 作为输入构造交易发送到 Bob 的地址,并对交易签名;
- 等待该交易被打包到区块中;
- Alice 向 Bob 发送确认消息,并且使用相同的私钥签名。
5.生成 Plasma 区块
在 Plasma MVP 中,一个 Plasma 区块 产生的情况只有两种:一种是 Operator 打包生成区块,向Plasma合约提交;另外一种是当用户执行 deposit 操作时,由 Plasma 合约直接生成一个只包含一个交易的 Plasma区块。
Plasma 区块 含义参考前面 Plasma 合约包含的数据结构。
6.监视子链
为了保证子链上资产的安全,用户需要周期性地检查子链上的数据,保证没有恶意交易产生。用户需要运行一种自动化的软件(例如钱包),每隔一段时间下载子链中的区块数据,检查每个区块中的交易,如果有恶意交易产生,立即退出子链。
7.取款/退出(withdrawal/exit)
当 Alice 想要退出子链时,需要向 Plasma 合约发送一个 exit 交易,申请中需要包含: (1)所要退出的 UTXO 的位置,包括区块号(blknum)、区块内交易号(txindex)以及交易内输出号(outindex) (2)包含该 UTXO 的交易 (3)该交易的 Merkle proof (4)用于生成该 UTXO 所涉及的之前一系列交易的确认签名。除此之外,exit 交易中还要包含“退出押金(exit bond)”。如果这个 exit 被 challenge 成功,那么取款的操作将被取消,而且退出押金将被发送给提出 challenge 的用户。
之后这个申请会被放入一个优先队列中,通过这个公式计算优先级:
Priority = blknum 1000000000 + txindex 10000 + oindex
之所以采用这种优先队列的方式处理取款顺序的原因是保证旧的 UTXO 总能优先于新的 UTXO 被取出。也就是说,当有恶意交易(例如双花等)产生时,所有在恶意交易发生之前的交易都可以被优先取出。那么如何解决在恶意交易之后被确认的交易的取款问题呢?Plasma MVP 采用了“确认签名(Confirmation Signatures)”的机制,在下一小节我们将介绍这一机制是如何工作的。
8.确认签名(Confirmation Signatures)
在 Plasma MVP 中,用户的退出顺序以所要退出的 UTXO 所在的交易的位置为准。假如 operator 作恶,在一个合法的交易之前插入一个非法的交易,那么当用户执行取款时,由于非法交易可以先被取出,因此当执行到该用户的交易时,可能 Plasma 合约中的资产已经被取空。为了解决这个问题,Plasma MVP 采用了“确认签名”机制,例如当 Alice 产生一个交易时,她首先会对交易签名。当该交易被打包入区块后,Alice 还需要对该交易进行一次签名,即“确认签名”。
引入确认签名机制后,当 Alice 发现在一个区块中自己的合法交易之前存在非法交易时,可以拒绝对自己的交易进行“确认签名”,同时申请取款。这样可以使得当前的交易失效,保证自己之前“确认签名”后的交易可以优先于非法交易之前取出。
这种确认签名机制极大地破坏了用户体验,用户每产生一个交易都要经历签名->等待确认->确认签名。而且由于确认签名也需要占据 Plasma 区块的空间,因此也降低了子链的可扩展性。为了解决这个问题,Plasma 的研究人员提出了扩展版本 More Viable Plasma 移除了确认签名的要求
9.争议(Challenge)
每个取款操作都会经历一个争议期。例如在 Alice 的某个 UTXO 退出子链的过程中,如果 Bob 在争议期内发现有恶意行为发生,他可以提出一个争议(challenge)。一个争议需要给出针对的 UTXO 的位置,以及该 UTXO 被花费的证明,即该 UTXO 已经存在于某个交易中,且这个交易已经被打包到区块。
合约通过调用 challengeExit() 函数执行一个争议,争议成功后会取消正在执行的取款操作,并将提交取款申请所冻结的押金发送给 Bob。
10. 攻击场景
在 Plasma 子链中主要存在两种攻击场景:
Alice 试图忽视在子链中转移给 Bob 的资产,使用最初加入 Plasma 子链时的交易证明向主链提出取款申请。 Operator 生成一个恶意交易,占有其他用户的资产,并且尝试退出子链。 下面对这两个攻击场景进行分析,观察 Plasma MVP 如何保证资产的安全性:
攻击场景1:
- Alice 使用最初加入子链时生成的交易作为证据向主链提出取款申请;
- Bob(或者其他任意用户)拥有 Alice 申请退出的 UTXO 被花费的交易证明,并将此作为证据向主链提出一个争议;
- 争议生效,Alice 的退出申请被驳回,同时将 Alice 申请退出的押金发送给 Bob;
- Alice 的攻击失效。
攻击场景2:
- Operator 创建了一个非法交易,并且将其打包生成区块之后在主链得到确认;
- Operator 提交取款申请,打算将 Alice 的资产取走;
- 在争议期内,Alice 发现了 Operator 的恶意行为,立即提出取款申请,退出子链;
- 由于 Alice 的申请优先级较高,因此会在 Operator 之前退出;
- Operator 的攻击失效。
11. 相关Plasma MVP 实现项目
Talk is cheap, show me your code.
目前已经有许多机构和公司已经实现了 Plasma MVP,但实现的语言和细节有所不同:
- FourthState Lab
- Omisego
- Kyokan
12. 总结
本文介绍了 Plasma 的最小实现版本 Plasma MVP,虽然采用最简单的 UTXO 模型,但已经足够体现出 Plasma 的核心思想。在 Plasma MVP 中,用户资产的安全主要依赖于用户及时发现恶意行为,并退出子链。接下来的文章将会介绍另外一个稍微复杂一点的项目,Plasma Cash。
13. 一些有用的链接
- https://ethresear.ch/t/minimal-viable-plasma/426
- https://ethresear.ch/t/more-viable-plasma/2160
- https://github.com/fourthstate
- https://github.com/omisego/plasma-mvp
- https://github.com/kyokan/plasma
六. Plasma Cash
Plasma Cash是一种 Plasma 设计,主要用于存储和转移不可替代的代币。Plasma Cash 最初旨在解决 Plasma MVP 中的大规模退出问题。
1. 共识
Plasma Cash 链和 Plasma MVP 链一样,需要一个共识机制。这种机制可以是任何东西,从单个运营商(Proof-of-Authority)到大量验证器(Proof-of-Stake)。Plasma Cash 的设计确保用户资金始终是安全的,即使共识机制出现问题。
2. 存款
用户可以通过将资产存入链的智能合约来开始使用 Plasma Cash 链。然而,与 Plasma MVP 不同的是,每个 Plasma Cash 资产都由一个不可替代的代币表示。例如,如果用户将 10 ETH 存入合约,该用户将收到价值 10 ETH 的代币。每个令牌都有一个唯一的标识符。
3. 块
Plasma Cash 块与 Plasma MVP 块有很大不同。每个 Plasma Cash 块都有一个用于存在的每个代币的插槽。每当使用令牌时,该交易的记录都会放置在相应的插槽中。这是具有四个代币的 Plasma Cash 链的样子。
在此示例中,令牌#4是从用户A发送给用户B的。请注意#1、#2和#3没有被花费,所以我们没有在这些插槽中放置任何东西!这种特殊的结构给了我们一些非常酷的东西。除了能够显示代币已在特定区块中花费外,我们还可以显示代币在该区块中没有易手。
因此,Plasma MVP 块形成标准的Merkle 树,而 Plasma Cash 块形成稀疏的Merkle 树。标准的 Merkle 树并没有给我们提供一个很好的方法来证明某物不是特定块的一部分,但是稀疏的 Merkle 树可以!
最酷的是用户实际上不需要跟踪每个令牌!一个代币的交易永远不能放入另一个代币的槽中。用户只需要跟踪他们自己的代币——其他插槽中的内容甚至都无关紧要。
4. 交易
由于用户只跟踪他们自己的代币,他们不知道谁拥有任何其他代币。当用户想要将他们的代币发送给另一个用户时,他们需要证明他们确实拥有该代币!该证明包括代币的完整交易历史 - 自首次创建代币以来的每笔交易。如果历史记录是正确的,那么它应该显示以发件人结尾的所有者列表。
为了证明历史实际上是正确的,用户需要提供额外的证据证明历史中的每笔交易都正确地包含在一个块中。此外,为了证明没有任何丢失的交易,用户还需要提供代币没有在任何其他区块中花费的证明。让我们通过几个 Plasma Cash 块来证明这一点。
在这四个区块结束时,G拥有代币#2,C拥有代币#4。那么G如何证明他们实际上拥有#2呢?简单的!G只需要证明#2没有在区块#1 和#3 中花费,并且它在区块#2 中从E转移到F ,在区块#4 中从F转移到G。G可以通过对每个块的简单 Merkle 证明来做到这一点(利用特殊的稀疏 Merkle 树结构)。
类似地,C可以通过证明代币没有在 2 和 4 块中花费,并证明它是从A发送到B然后从B发送到C来证明他们拥有#4。
5. 提款
由于 Plasma Cash 的区块结构与 Plasma MVP 有很大不同,因此提取资金的过程也不同。
6.开始退出
当用户想要提取代币时,他们需要提交代币历史中最近的两次交易。例如,如果C想要提取代币#4 ,他们需要提供从B到C的“子”(最近)交易,以及从A到B的“父”交易。用户还需要提交 Merkle 证明,证明两笔交易都包含在区块链中。
7.挑战出口
我们需要支持三种类型的挑战,以确保只有代币的真正所有者才能撤回该代币。如果有人证明提款用户后来确实花费了代币,则可以立即阻止提款。如果有人显示父子交易之间存在交易,也可以立即阻止提款,这意味着提款用户提供了无效的父母。
有人还可以通过提供代币历史记录中的一些其他交易来挑战提款。这种类型的挑战不会立即阻止退出。相反,取款用户被迫用提供的交易之后的交易做出响应。
8.优点和缺点
Plasma Cash 具有高度可扩展性,因为用户只需要跟踪他们自己的代币。但是,在可扩展性和灵活性之间需要进行权衡。代币总是有一个固定的面额——(目前)没有好方法可以在不进入 Plasma Debit(我们将在下一节中讨论)之类的情况下花费一小部分代币。这使得 Plasma Cash 不适合需要少量代币的用例,例如交易所。
此外,需要与每笔交易一起发送的证明可以很快增长。这些证明需要一直追溯到存放代币的区块。一旦等离子链运行了一段时间,这些证明可能会变得异常庞大。
让我们快速计算一下:
想象一下,我们有一个带有(非常)保守的 1000 个代币的 Plasma Cash 链。这导致了一个具有十个级别的稀疏 Merkle 树,这意味着每个 Merkle 证明需要提供十个兄弟哈希。每个兄弟哈希是 32 字节,所以每个 Merkle 证明是 32 * 10 = 320 字节!
现在让我们假设这条链每 15 秒产生一个区块(当前的以太坊区块时间)。即每年 4 60 24 * 365 = 2102400 个区块。
我们知道发送单个令牌的证明每个块增加 320 字节。一年后,该证明将增长到 320 * 2102400 = 672768000 字节,即0.67 GB!这已经太多了,甚至无法在合理的时间内通过家庭网络进行传输。
Plasma Cash 仍然适用于某些事情。对不可替代代币的支持使 Plasma Cash 非常适合供应链物流甚至纸牌游戏!
9. 一些有用的链接
- https://ethresear.ch/t/plasma-cash-plasma-with-much-less-per-user-data-checking/1298
- https://en.wikipedia.org/wiki/Non-fungible_token
- http://erc721.org/
- https://github.com/ethsociety/learn-plasma
- https://medium.com/@kelvinfichter/whats-a-sparse-merkle-tree-acda70aeb837
- https://karl.tech/plasma-cash-simple-spec/
- https://github.com/loomnetwork/plasma-paper/blob/master/plasma_cash.pdf
- https://github.com/loomnetwork/plasma-cash
- https://github.com/omisego/plasma-cash
- https://github.com/wolkdb/deepblockchains/tree/master/Plasmacash
- https://github.com/luciditytech/lucidity-plasma-cash