深刻理解Plasma(2):Plasma 细节剖析

image

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操做细节,安全性讨论以及将来研究方向等。本篇文章主要对 Plasma 一些关键操做的细节进行剖析。安全

上一篇文章中咱们已经理解了什么是 Plasma 框架以及它是如何运行的,这一篇文章将对其运行过程当中的一些关键部分,包括 Plasma 提交区块的过程,当有恶意行为发生时如何构建防伪证实以及如何退出 Plasma 子链等进行剖析。须要注意的是,因为 Plasma 是一套框架,所以本文只剖析 Plasma 项目的共性,每一部分的实现细则仍是须要参考实际的项目,例如 Plasma MVP(Minimal-Viable-Plasma)和 Plasma Cash 等。网络

1

存款(Deposit)

Plasma 的主要思想就是将大部分计算过程都转移到链下进行,用户只有在进入和退出 Plasma Chain 的时候须要跟主链上的智能合约交互,这也是全部 Plasma 应用的标准流程。框架

用户在将主链的资产(如以太币或者其它 ERC20 合约发布的 token)转移到 Plasma Chain 的过程称为存款(Deposit),具体作法是直接向主链上的 Plasma 合约发送以太币或 token。Plasma 合约收到 Deposit 交易后会在子链上建立跟 Deposit 数额一致的交易,并将其打包进区块中,做为存款确认的证实。这个过程以下图所示(来源自[1])。ide

image

当用户看到子链上本身以前存款的交易被确认后,就能够在子链上使用这笔资产(给子链上的其余用户发送交易或者退出子链等)。函数

2

状态确认(State Commitment)

当大部分都转移到链下进行时,须要某种机制确保链下状态的更新获得确认,这样才能保证当有恶意行为发生时,主链能够保证用户不会受到损失。这就是为何须要状态确认(State Commitment),即子链周期性地将状态更新状况提交到主链进行共识。优化

然而,将子链中的全部交易都同步到主链显然违反了 Plasma 的初衷,在 Plasma 中,实际向主链提交的是 Merkle Tree 的根哈希。所以子链中的实际交易状况被隐藏,在主链上只能看到子链区块的哈希值。ui

当有恶意行为发生时,子链网络中的全部用户均可以向主链提交防伪证实,证实成立后,含有恶意交易的区块将被回滚。设计

3

防伪证实(Fraud Proof)

Plasma 的一个关键设计之一就是容许用户构造防伪证实(Fraud Proof)。防伪证实的意义在于只要发布区块的节点构造了含有恶意交易的区块,那么就要承担被惩罚的风险。每当新的区块被提交到主链上时,会留出一段时间给用户提交防伪证实,若是在这段时间内没有证实被提交,则认为新的区块被验证合法。若是有防伪证实检测到区块中存在恶意交易,则该区块将被舍弃,回滚到上一个被验证合法的区块。Plasma 中的防伪证实主要有如下(但不限于)几种:token

  • 资产可花费证实资源

  • 交易签名有效性证实

  • 存取款证实

至于每种防伪证实的具体形式,则依赖于实际 Plasma 应用的实现细则。

以下图所示(来源自[1]),子链中每一个节点都存有 1-4 个区块的数据。假设区块 1-3 已经被验证合法,而区块 4 中存在恶意交易,那么每一个节点均可以使用 1-4 个区块中的数据构造防伪证实提交到主链,主链验证后将子链中的状态回滚到区块 1-3。

image

防伪证实还可使用零知识证实(zk-SNARKs 或者 STARKs)来构造,但因为目前经过零知识证实生成证实的时间和空间还有待优化,目前设计的 Plasma 并不依赖零知识证实。零知识证实在 Plasma 中的应用是一个颇有前景的研究方向,感兴趣的读者能够参考以太坊研究团队关于这方面的研究[2])。

4

取款(Withdrawal)

取款(Withdrawal),顾名思义,就是从子链中的资产取回到主链上,所以取款也被称为退出(Exit)。取款操做能够说是 Plasma 框架中最重要的一步,由于它确保用户能够安全地将子链上的资产转移到主链上。以前的存款以及状态确认步骤已经产生了一些交易数据,并在主链上获得同步,用户能够利用这些数据构造资产证实,以后执行简单取款(Simple Withdrawal)操做退出子链。当有扣留(Withholding)攻击发生(即子链上的矿工恶意扣留区块,意图双花攻击等)时,用户可能没法成功获取数据构造资产证实,这时须要执行批量取款(Mass Withdrawal)操做退出子链。

须要注意的是,当子链中有取款操做发生时,跟这个取款操做相关的帐号或者交易都将被禁止。

简单取款(Simple Withdrawal)

执行简单取款的条件是所要取回的资产已经在主链和子链上确认。

一个简单取款的执行主要有如下几个步骤:

  • 向主链上的 Plasma 智能合约发送已签名的取款交易。取款的数额能够包含多个输出(UTXO模型),但全部输出必须在同一个子链当中,并且每一个输出的余额必须所有取出,不能只取出一部分。取款数额的一部分还须要被看成押金,做为恶意行为的惩罚。

  • 当取款请求发送后,须要等待一段“争议期(Challenge Period)”,这期间其它节点能够构造证据证实该取款中的部分或所有数额已经被花费。若是争议期内有节点提供证实成功,那么取款被取消,并且押金被扣除。

  • 接下来可能还要等待一段时间,直到全部区块高度较低的取款操做都完成。这是为了保证全部取款操做按照“先来后到”的顺序执行。

  • 当争议期结束后,若是没有争议被提出,则认为取款操做成立,取款者将子链资产成功取回到主链。

快速取款(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 须要验证取款方的交易历史。

批量取款(Mass Withdrawal)

当子链中有拜占庭行为(例如,区块扣留攻击)发生时,将会影响之后生成防伪证实,所以网络中的每一个用户都有责任快速退出子链。虽然批量取款(Mass Withdrawal)操做不是必要选择,但当大量用户执行取款时极可能会形成主链拥塞,也会消耗更多的 gas,所以批量取款是当子链受到攻击时更好的选择。

批量取款操做因为所采用的模型(UTXO 模型或者帐户模型)不一样会有较大的差异,并且目前关于批量取款的操做细节也正在研讨当中,所以这里只对批量取款作简单介绍,想要了解目前研究状态能够参考[4]。

当子链中有拜占庭行为发生时,用户之间能够共同协做执行批量取款。这时会有一个节点扮演取款处理人(Exit Processor)的角色,简称为 EP,负责当前某个批量操做(能够同时有多个批量取款操做发生,但同一个取款申请不能存在于多个批量取款),而且能够收取服务费做为报酬。EP 将构造一个位图(bitmap,即一串0/1)记录哪些资产要执行取款。以后 EP 将利用现有的区块数据检查每一个取款是否合法,以后将构造一个批量退出初始化交易(Mass Exit Initiation Transaction,MEIT),并将其发送到主链上。在 MEIT 被主链确认以前,每一个用户均可以对这个交易提出异议。当争议期结束,MEIT 被主链确认,批量取款成功。

5

总结

本文主要对 Plasma 框架中一些关键操做进行了比较详细的介绍,但若是不依托于某个实际的 Plasma 项目,对一些细节仍是很难理解。所以在后面的文章中将会介绍 Plasma MVP 以及 Plasma Cash。

6

相关资源

相关资源

内容来源:知乎 原文做者:盖盖

image

相关文章
相关标签/搜索