Vitalik 在一年多以前(2017/08)提出了 Plasma 这个概念以解决 Ethereum 交易速度及成本的问题,不过提出的内容太概念性,没什么人知道该怎么实作,在今年初 Vitalik 提出了Plasma MVP(Minimal Viable Plasma),最小可行性的 Plasma,而目前大家也是遵循这个规范来实作。
Plasma 属于 layer 2 的 solution,就是在主链之外做运作(也就是链下交易)。Plasma简单来说就是链中链,每个链都可以有自己的链,自己的链还可以再有链,就像是 tree一样的概念。举例来说,往后交易所就可以创造自己的链,在自己链内交易,速度快而且无手续费。而目前 MVP 的设计是在主链外多一层而已,还没有多层的概念。上个月的 COSCUP 有 Ethereum Foundation 负责 Plasma 的开发者的分享,影片链接在此(是中文,大家不用害怕 : ) )。
Plasma MVP
在每个Plasma chain 会有一个 operator,operator 负责产块(可以想象是中心化的管理者),以目前来说,operator 实作成 Restful API server,而产块可以想作是在数据库 insert 一笔纪录,跟我们以往中心化的系统一样。而你要进入到这个 Plasma chain 需要先在主链上的 smart contract 作存款(deposit)才能进入。然后Plasma chain 每产一个块,就必须跟主链作回报(回报 Merkle
root),这样 Plasma chain 这边的块才算被 confirm
。每个 Plasma chain 是独立的,所以不能跨链交易,必须先转回到主链。
那安全问题呢? operator 是中央式的,如果被攻击或是原本就是恶意的呢?接续上面的例子,其实要把筹码换成新台币,没有这么简单。首先,要七天后才能领出(取出),这段期间就是挑战期(challenge period),在这段期间内,如果有人提出你在赌场内造假的证据,提交到法院(也就是主链)并被且被法院认证是造假,那你的钱就不能提领了。
接着回到,如果 operator 跟某个账号串通,假造 balance 的数目怎么办勒?Plasma 会依照 transaction 的顺序处理,从最旧的到最新的逐一验证。举例来说,
A存了5块存进赌场(A: 5颗筹码)
B存了20块进入赌场(B: 20颗筹码)(此时赌场共有25颗筹码)
接着B给 A 3颗筹码(A: 8颗, B:17颗),
operator 从桌底下偷偷拿拿自己带的 1000 颗筹码给了C
这个时候,大家发现赌场诈赌,就会开始想离开,把筹码换回新台币,这个时候就会照 1,2,3,4 顺序来验证交易,验证到到第 3 步,A 有 8 块可以提领,B 有 17 块可以提领,AB领完后,赌场就没钱了,所以 C 想领假造的 1000 块也没钱可以领了。更细节的部分,可以参考Karl.tech 对于 Plasma 的介绍。
Plasma Cash
简单来说,Plasma Cash做了两个修改: 1)每一笔存入 Plasma contract 的钱,都给一个unique token ID(专有的 Token ID);2)Merkle tree 的 index 存 token ID,内容存这个 token ID 的交易纪录。
这样有什么好处呢? 你每一笔存入的钱都有一个 ID,可以想作是进了 Plasma chain,你的 Eth 就变成了 ERC20 token,所以当有人要偷钱的时候,就必须一个一个 token 地偷,对恶意的攻击者来说,变得很不方便。不过相对的坏处就是,你存进去两笔钱,要分开来用,不能合并一起,比较不方便。第二点,可以想象成,你的 token 有一个自己的帐户,所有的交易都在这个帐户里,要找纪录, 证明交易都很方便,重点是寻找起来很快速,只要是关于这个 token 的交易但不在这个账户的,都是无效的。
但是每一笔钱都有一个 ID,可想象的是 Merkle tree 会长得很大,Ethereum Research 上有个简单的算术:
Assuming we have a (very) small Plasma Cash chain with only 2¹⁶ (= 65536) coins, then the Merkle proof of either existence or non-existence for a given coin will be at least 32 bytes * 16 siblings = 512 bytes per block. If we assume that Plasma block is created once every 15 seconds, then we’ll end up with 31557600 / 15 = 2103840 blocks per year. 2103840 blocks per year * 512 bytes per block = 1077166080 bytes per year = ~1.077 gigabytes per year. 1 gigabyte per coin, per year!
source:https://ethresear.ch/t/plasma-xt-plasma-cash-with-much-less-per-user-data-checking/1926
简单来说,就是 65536 种 token(也就是 63356 次存款),每年大概会多 1GB 的数据量。如果 Plasma 被大量使用,这个量会相当惊人。后来又有提出Plasma XT,是基于Plasma Cash之上做改进。资料会这么大,是为了要有历史纪录用于查证,而Plasma
XT 提出了 check point 的概念,定期做验证,也就不需要全部历史纪录了。
Check point 的概念听起来很简单,就定期检查就好,但是 operator 并不是实际的一个链,只是一个 api server,所以假如 operator 不提供交易纪录只提供 Merkle root 那用户要怎么确认? 假使有方法可以确认了,那 token 数量这么多,大家都同时确认,是不是会超过 gas limit 的上限?目前解决方案,第一个问题,就是用使用者的签名验证,如果 operator 擅自在某个 check point finalize 你的状态,那你就很容易地知道这个 operator 作弊,因为你没有在这个 check point 签名过。第二个问题使用了checkpoint zone,也就是每个 token ID 有一个时间做验证(即一次只验证一部分 Token 的历史),例如 ID 号为 0~99 的在 N block 做验证,100~199 的在 N+1 block 验证…以此类推,解决了一次太大量的问题。
原文链接:http://kimiwublog.blogspot.com/2018/09/ethereum-plasma-mvp-and-plasma-cash.html
作者:Kimi Wu
稿源:以太坊爱好者(https://ethfans.org/posts/simplest-introduction-to-ethereum-plasma-mvp-and-plasma-cash)