Renaissance Labs

Posted on Feb 10, 2022Read on Mirror.xyz

Layer2 | Plasma 框架

在上一篇文章中,我们介绍了解决扩展性问题的第一个 Layer2  解决方案,即状态通道。接下来,本篇将会为大家揭开另一个称为 Plasma 的链下交易技术,而该技术则是由 Vitalik Buterin 和 Joseph Poon 在 2017 年,含金量十足。

Plasma

Plasma 是一个链下交易的技术,由 Vitalik Buterin 和 Joseph Poon 在 2017 年提出,它相当于贡献了一条子链,可以让你在主链上质押资产,然后在子链上产生资产,而且它提供一个服务器,不需要点对点的交互,在服务器上就可以进行交互。

Plasma 子链可以更快地操作,且交易费用更低,因为它的操作不需要在整个以太坊区块链存留副本

它的基本流程和状态流程也比较相似。

  • 主链上抵押资产

  • 在子链上交易

  • 提现退出

不过状态通道更多的是针对你想交易的那几个点,是两个人之间的交互,而它想要在一个大的库里面进行复杂的操作是一个很困难的事情。而 Plasma 可以在子链上进行各种形式的交易,调动智能合约,转账给多个人等等,非常灵活,不像 State Channel 一样,只有打开通道的人能用,任何人都可以随时进来。

Plasma 是一个大的框架,细分有好几种不同的实现方式。

首先,让我来详细介绍一下整个过程,来帮助你理解 Plasma 的整个框架,如下图所示。  

https://raw.githubusercontent.com/gitferry/mastering-ethereum/master/Plasma-in-depth/images/Blockchains-of-blockchain.png

我们在以太坊上创建一套智能合约,作为 Plasma 的 Root Chain,而 Root Chain 包含了子链的状态交易规则,记录子链的哈希值,并且其作为一个桥梁,让用户在以太坊主链和子链之间转移资产。

然后我们创建子链,子链可以拥有它们自己的共识算法,假设这里我们使用 POA ( Proof of authority )共识机制。

这个是一个依赖可信区块生产者的共识机制,每个验证者都必须都是通过身份验证的可信人。打个简单的比方,以前交易需要一群互不认识的人来比拼算力,艰难计算一道复杂的数学题,但是现在我们有一个可信的人做担保,所以便可以快速通过交易,要是这个人使坏,其他的人可以把他踢出网络。

假设游戏公司是唯一一个创建区块的实体,这个实体运行着几个节点,而这些节点被当作子链的块生产者。

而子链一旦创建开始工作,块生产者将定期向根合同做出声明,这个将被记录在 Plasma 的链上,作为子链发生计算的证据。而用户要玩游戏的时候,他们得先在主链上抵押资产获得在子链上的资产,然后在子链上交互。因为不需要与主链交互,而且只有少数几个节点必须处理交易,所以交易费会很低,而且操作会很快。我们结束游戏之后,可以选择提现退出。

下面我将通过几个问题,帮你更加深入理解 Plasma 的细节,包括周期性提交和安全退出机制。

当你在子链上宣布要退出,你有 100 个以太要提现时,由于主链不一定知道子链的情况,它是不能相信你拥有这笔资产的。此时你就得提交证明,像默克尔树证明,而默克尔树证明是要证明到一个默克尔树的根哈希的,你也得证明你上传的根哈希是真实的。

这个就要求 Plasma 的子链周期性的把它的状态(默克尔数的根哈希) Commit 到主链上,让主链清楚子链根哈希的状态。这就是周期性提交

不过这样会存在问题。

如果记账节点放出来的信息是假的呢,他提交的根哈希和这条链实际产生的根哈希是不对应的,因为主链其实也不清楚,这个时候怎么办?

我们就需要提供一个数学证明,证明它在同一个区块高度签名的数据都是一样的,比方说 Validator 如果在这个区块高度发出的信息是 A ,而 Commit 到主链上的区块信息是 B ,我能通过这种数学形式发现记账节点是作恶了的,这样就可以罚没它主链上的押金。

但是如果子链压根就不公布区块信息,这样就没有作恶证明提交到主链上,这个时候怎么办?

这个时候 Plasma 提供了一种 Safe Exit 的机制。

每一个在子链上的节点,如果意识到子链有可能作恶,而且他自己没办法证明子链作恶的时候,这个机制能够允许参与者退出。参与者提交他最后的一个的可信证明,有多少余额,就把这个余额提现到主链上,保证资金的安全

这个是 Plasma 的核心理念,Plasma 不会为了速度牺牲安全。你可以在子链上自由交易,并且在子链作恶之前,把币提走。

MVP ( Minimal Viable Plasma )

这个是 Plasma 最小实现,它采了取一条 UTXO-Based 的链作为子链,由于它需要子链不是概率确认的链,所以它一般采用的是 PoA 共识算法(或者 BFT)

所有的 Plasma 的核心都是在退出和挑战的机制上,我们这里也着重强调一下它的退出和挑战机制。

我们从图可以很清楚的看到,用户在主链上抵押了 Fungible Token 之后,在子链上获得了未花费的 UTXO。

假设这个用户花费掉了这笔 UTXO,分成了四笔输出,然后决定要退出,要把这个钱提交到主链上,发起了一个 Start Exit。 同时他提交我拥有这个 UTXO 的证明,这个证明在默克尔树的根哈希中,这个是由记账节点定期的 Commit 到主链上的。这两个数值就可以证明这个用户拥有这个 UTXO。

但是这样就需要一个 Challenge 的过程,因为用户提交的证明只能保证他在当前的区块是拥有这个 UTXO 的,它并不能保证用户之后不会花费这个 UTXO。

所以这里有一个比较长的挑战期( Challenge Period),即一定的出块时间,让别人去提交他作恶的证明 。假设用户在发起提现之后又给一个人转了一笔账,那么挑战者是可以将这个转账交易记录和这个默克尔树哈希发送到主链上来证明用户 Exit 是无效的,以此来罚没用户在主链上的押金,这个时候挑战者就可以拿到这笔押金。

这里我们细化谈谈它的作恶和退出机制。如果现在有一个密码学证明,证明这个东西属于张三。因为这个交易打包在区块里,这个区块的默克尔树哈希放在这个主链上。

但是如果一条线都是作恶的,出块节点是作恶的,出块节点做一个假的交易,做了一个假的区块和一个假的默克尔树哈希,放到了根链上,这个时候根链实际是无法判断的,如果我不把这个区块公布出来,它是不知道我作恶的证据的。

这个时候用户如果需要退出,怎么才能保证用户能够正常退出呢?假设我作为一个作恶节点,知道你们要退出,我可以先生成一批金额特别大的交易,优先你们退出,假设你要提现 100 个以太,我就可以伪造一个 101 以太的提现交易,这个等于说拿着你的钱就跑了。

因此 MVP 设置了一个优先级的设计。每一笔进入 Plasma 的交易都会有一个优先的序号,高位是区块高度,然后是交易在区块里面的次序和这个 Output UTXO 在这个交易中的次序。这样就形成了一个全局唯一的序号,所有人按照这个序号退出。

如果某一个时刻大家开始发现节点开始作恶,要退出,一定是早期交易的区块先退出,后期作恶的区块后退出,我作恶区块的意义不大。

但是这里还有一种作恶的方法。

如果诚实的交易被矿工打包到了作恶交易的后面,因为矿工是可以选择打包次序的。在这个错误的块里面,诚实的交易打包到错误的交易后面,导致诚实交易的退出优先级低于作恶交易的优先级。

1 个大户把 1000 个以太打入到 Plasma 链上,作恶矿工在存入的这个区块里优先造了一个假交易,然后放到区块里面,先把 1000个 以太提走了,大户是没有办法的

这里的解决办法是对每个存款( Deposit )都做二次确认,第一次是存进去,确认这笔交易被打包在 Plasma 的区块里,第二次是在用户把币存进去,确认存进去的区块以及之前的区块都是真实、合法的情况下,再发一笔交易,去确认这个交易是正确的。

在做了两次确认,证明交易都是真实之后,用户再去退出就能够安全退出了。

More Viable PlasmA

不过 MVP 每一笔存储交易多了一次签名之后,对系统来说还是开销很大的,所以有人提出了 More Viable Plasma。

它退出的次序不是以打包的次序为准,而是以退出的时候提交的 UTXO 的证据,UTXO 输入最早的一个 Input( Input 可能有四五个),哪个早就哪个先退出。

这个的好处在于,早的 Input 一定是已经被打包到交易区块里面了,如果这个 Input 是假的,那么在 Input 发生的那一刻就已经有人开始做退出了,这个是不可能的。

因此这个时候我可以假设这个 Input 是真实的,越早的 Input 它的真实性就越高,我退出的时候就按照 Youngest 的 Input 退出,它的保障性最高, 这个是 More VP。

Plasma Cash

Plasma 还有一个实现叫做 Plasma Cash。

MVP 的缺点是,每一个人,不光是矿工,都要时刻紧盯着这条链,如果有人作恶,就赶紧退出。而且一旦出现问题,退出还需要提供相应的数学证明。数学证明还得从本地同步的区块中获取,因为别人同步的可能都是假的,这就要求你还要同步区块。

这一系列的过程对用户是很不友好的。这个时候有人就提出了 Plasma Cash,它最大的特点是用户只需要关注自己的数据就好了。

它采用的是 Non-Fungible Token 的存储机制,它的 Deposit 进来之后是不分割的,每一笔存款,比方说 1号是 10 个以太,2 号是一只猫,它们被打包成一个 Non-Fungible Token 放进来,系统给每一个打包的包裹一个序号,如图所示,这个系统现在是有八个存款,每一个存款都是一个包裹。  

假设三号包裹原来的持有人是 A,他把这个包裹转给了 B,在这个区块里,它就包含了一个 A 到 B 的交易来指向三号包裹,六号包裹是 D 到 B,把所有权转向了 B,剩下的包裹没有动作。

而用户只需要关心和自己有关的数据,像图中的 A ,他只需要关注 3 号和 5 号包裹,不需要关注其他人,因为所有人的钱是自成体系的,不是像 Fungible Token 捆在一起的,所以像 6、7、8 该退就退,因为不是 A 的东西。

不过这里有一个问题,比如说 Bob 拥有 7 号包裹,要转给 A,但是由于 A之前没有和 7 号包裹交易,他只关注自己,他是不了解 7 的历史的,所以Bob 给 A 转账的时候其实 A 是不确定对方是否拥有 7 号包裹的所有权的。

而 Bob 要证明拥有 7 号包裹的所有权,就必须把 7 号资产从创生到现在所有的资产、每一个默克尔树和默克尔树哈希都给 A,来证明这个块是真实属于 Bob 的。

所以 Plasma Cash 转账的时候数据量是很大的。

Plasma Cash 要求退出的时候,需要把最后关于这个 Token 的两笔交易上传,比方说 A 转给 B,B转给 G,而G要退出,那么 G 就把这两笔交易提交到子链上退出,退出其实不复杂,复杂的是 Challenge,其 Challenge 主要有三种。

  • 假设 A 退出之后又花费了资产

A 提出申请之后又把这个钱转给了别人,这个时候 Challenger 可以把这个这个交易提交给主链,让 A 退出失败

  • 双花交易

A 和矿工串通同时转给 G 和 F,Challenger 可以采取和 1 相同的方式,让 A 失败。

  • 历史的证明

因为退出的时候只提供最后的两笔交易,而它们可能都是假的,这个时候 Challenger 可以任意指定一个块,要求对方证明是怎么到这个状态的,以保证系统安全性。

Plasma Cash 的挑战很复杂,转账证明也很复杂,优点是无需关心别人的状态,只需要关心自己。

Plasma Debt

Plasma Debt 和 Plasma Cash 比较像,转账、证明和挑战都很类似,其区别是 Plasma Cash 里每一个包是一个 Non—Fungible 的资产,而在 Debt 里每一个包是一个状态通道,这意味着和状态通道的交互可以不按整个包来交互。

比如说我有 100 个以太,在 Plasma Cash 中,这 100 个以太我只能一起转给张三或者一起转给李四,但是在 Debt 里面,这100个以太,我可以转一部分给张三,转一部分给李四,不用全转。

每一个 Token 都是使用者和 Plasma 链的运营者的一个小型状态通道,这个状态通道也可以按照 Plasma Cash 的方式进行流转,这样可以让用户可以不需要把资产当成 Non-Fungible Token,还可以进行比较高效的运转。

不过状态通道按照 Cash 方式进行流转还是会和 Cash 面临一样的问题,转账证明很复杂,因为它依旧需要所有的历史交易。

Plasma Leap

Plasma Leap 是在 MVP 的基础上做的,MVP 是一个类似比特币的一个 UXTO 链,在比特币里面是有一个解锁脚本来做智能合约的,Plasma Leap 就把这种类似比特币的智能合约的理念带到了 Plasma 里,引入了 P2SH 加锁脚本,对于存储结构进行了提升。

在每一个交易里面是可以加一个 EVM 的二进制代码作解锁脚本的,这个代码是对应一个智能合约,由智能合约来进行解锁。

不过这个智能合约不像以太坊上的智能合约,那么完整完善,它做的事情很简单,就是证明用户能不能花费这个 UTXO,就像比特币一样,用户能不能花费它,什么时候花费它,它不能做更复杂的智能合约。

 

延伸阅读:

Layer2 | 区块链发展新思潮 Layer2 | 状态通道 State Channel  Layer2 | Plasma 框架  Layer2 | 链下计算  Layer2 | 链间通信 

  1. https://plasma.io/
  2. https://ethresear.ch/c/plasma
  3. https://medium.com/l4-media/making-sense-of-web-3-c1a9e74dcae
  4. https://blog.ethereum.org/2018/01/02/ethereum-scalability-research-development-subsidy-programs/
  5. https://github.com/ethereum/wiki/wiki/Sharding-FAQs
  6. https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4
  7. https://medium.com/@argongroup/ethereum-plasma-explained-608720d3c60e
  8. https://www.cnblogs.com/tinyxiong/p/9828460.html