深入理解Plasma(2):Plasma 细节剖析 爱心头像图片

首页 > 儿童文学 > 文章

深入理解Plasma(2):Plasma 细节剖析 爱心头像图片

内容来源:知乎原文作者:盖盖这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。 本篇文章主要对Plasma一些关键操作的细节进行剖析。 在我们已经理解了什么是Plasma框架以及它是如何运行的,这一篇文章将对其运行过程中的一些关键部分,包括Plasma提交区块的过程,当有恶意行为发生时如何构建防伪证明以及如何退出Plasma子链等进行剖析。

需要注意的是,由于Plasma是一套框架,因此本文只剖析Plasma项目的共性,每一部分的实现细则还是需要参考实际的项目,例如PlasmaMVP(Minimal-Viable-Plasma)和PlasmaCash等。 1存款(Deposit)Plasma的主要思想就是将大部分计算过程都转移到链下进行,用户只有在进入和退出PlasmaChain的时候需要跟主链上的智能合约交互,这也是所有Plasma应用的标准流程。 用户在将主链的资产(如以太币或者其它ERC20合约发布的token)转移到PlasmaChain的过程称为存款(Deposit),具体做法是直接向主链上的Plasma合约发送以太币或token。

Plasma合约收到Deposit交易后会在子链上创建跟Deposit数额一致的交易,并将其打包进区块中,作为存款确认的证明。 这个过程如下图所示(来源自[1])。 当用户看到子链上自己之前存款的交易被确认后,就可以在子链上使用这笔资产(给子链上的其他用户发送交易或者退出子链等)。

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

然而,将子链中的所有交易都同步到主链显然违反了Plasma的初衷,在Plasma中,实际向主链提交的是MerkleTree的根哈希。

因此子链中的实际交易情况被隐藏,在主链上只能看到子链区块的哈希值。 当有恶意行为发生时,子链网络中的所有用户都可以向主链提交防伪证明,证明成立后,含有恶意交易的区块将被回滚。

3防伪证明(FraudProof)Plasma的一个关键设计之一就是允许用户构造防伪证明(FraudProof)。 防伪证明的意义在于只要发布区块的节点构造了含有恶意交易的区块,那么就要承担被惩罚的风险。 每当新的区块被提交到主链上时,会留出一段时间给用户提交防伪证明,如果在这段时间内没有证明被提交,则认为新的区块被验证合法。

如果有防伪证明检测到区块中存在恶意交易,则该区块将被舍弃,回滚到上一个被验证合法的区块。

Plasma中的防伪证明主要有以下(但不限于)几种:至于每种防伪证明的具体形式,则依赖于实际Plasma应用的实现细则。

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

防伪证明还可以使用零知识证明(zk-SNARKs或者STARKs)来构造,但由于目前通过零知识证明生成证明的时间和空间还有待优化,目前设计的Plasma并不依赖零知识证明。

零知识证明在Plasma中的应用是一个很有前景的研究方向,感兴趣的读者可以参考以太坊研究团队关于这方面的研究[2])。

4取款(Withdrawal)取款(Withdrawal),顾名思义,就是从子链中的资产取回到主链上,因此取款也被称为退出(Exit)。

取款操作可以说是Plasma框架中最重要的一步,因为它确保用户可以安全地将子链上的资产转移到主链上。 之前的存款以及状态确认步骤已经产生了一些交易数据,并在主链上得到同步,用户可以利用这些数据构造资产证明,之后执行简单取款(SimpleWithdrawal)操作退出子链。

当有扣留(Withholding)攻击发生(即子链上的矿工恶意扣留区块,意图双花攻击等)时,用户可能无法成功获取数据构造资产证明,这时需要执行批量取款(MassWithdrawal)操作退出子链。

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

简单取款(SimpleWithdrawal)执行简单取款的条件是所要取回的资产已经在主链和子链上确认。 一个简单取款的执行主要有以下几个步骤:快速取款(FastWithdrawal)快速取款(FastWithdrawal)跟简单取款相比的差别主要是引入一个中间人,白皮书上称为LiquidityProvider,这里简称为LP。

如果一个用户不想等待很长的争议期(目前的实现至少要一周),那么它可以选择从LP这里直接取款,只需要消耗一个交易确认的时间,代价是需要支付给LP一定的费用。 由于Plasma白皮书上关于快速取款的描述太过晦涩,这里主要参考kfichter提出的SimpleFastWithdrawal[3]来介绍快速取款是如何实现的。 为了实现快速取款,取款方和LP可以利用一个流动合约(liquiditycontract)。

假设取款方是Alice,她想要执行快速取款将10以太币从子链转移到主链。

她首先向流动合约发送10以太币,注意这里的交易是在子链上进行的。 当这个交易被子链打包成区块后,Alice可以调用合约中的某个退出函数,这时Alice将获取一个代表她这笔资产的token。

Bob作为LP,他检查了子链上数据之后证明Alice的取款没有问题之后愿意以9以太币的价格购买这个token。 Alice将token卖给Bob,获得了9以太币,Bob赚取了1以太币。

需要注意的是,实现快速取款的前提条件是没有拜占庭行为发生,即没有扣留区块攻击发生,因为LP需要验证取款方的交易历史。 批量取款(MassWithdrawal)当子链中有拜占庭行为(例如,区块扣留攻击)发生时,将会影响以后生成防伪证明,因此网络中的每个用户都有责任快速退出子链。 虽然批量取款(MassWithdrawal)操作不是必要选择,但当大量用户执行取款时很可能会造成主链拥塞,也会消耗更多的gas,因此批量取款是当子链受到攻击时更好的选择。 批量取款操作由于所采用的模型(UTXO模型或者账户模型)不同会有较大的差别,而且目前关于批量取款的操作细节也正在研讨当中,因此这里只对批量取款做简单介绍,想要了解目前研究状态可以参考[4]。

当子链中有拜占庭行为发生时,用户之间可以共同协作执行批量取款。 这时会有一个节点扮演取款处理人(ExitProcessor)的角色,简称为EP,负责当前某个批量操作(可以同时有多个批量取款操作发生,但同一个取款申请不能存在于多个批量取款),并且可以收取服务费作为报酬。 EP将构造一个位图(bitmap,即一串0/1)记录哪些资产要执行取款。 之后EP将利用现有的区块数据检查每个取款是否合法,之后将构造一个批量退出初始化交易(MassExitInitiationTransaction,MEIT),并将其发送到主链上。 在MEIT被主链确认之前,每个用户都可以对这个交易提出异议。 当争议期结束,MEIT被主链确认,批量取款成功。 5总结本文主要对Plasma框架中一些关键操作进行了比较详细的介绍,但如果不依托于某个实际的Plasma项目,对一些细节还是很难理解。 因此在后面的文章中将会介绍PlasmaMVP以及PlasmaCash。 6相关资源相关资源。