Layer2 | Plasma 框架

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

Plasma

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

Plasma 子链能够更快地操做,且交易费用更低,由于它的操做不须要在整个以太坊区块链存留副本

它的基本流程和状态流程也比较类似。
安全

  • 主链上抵押资产
  • 在子链上交易
  • 提现退出

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

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

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

服务器



咱们在以太坊上建立一套智能合约,做为 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 的区块里,第二次是在用户把币存进去,确认存进去的区块以及以前的区块都是真实、合法的状况下,再发一笔交易,去确认这个交易是正确的。

在作了两次确认,证实交易都是真实以后,用户再去退出就可以安全退出了。
post

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 捆在一块儿的,因此像 六、七、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 主要有三种。
cdn

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

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

  • 双花交易

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 | 状态通道 State Channel

Layer2 | Plasma 框架

Layer2 | 链下计算

Layer2 | 链间通讯

相关文章
相关标签/搜索