Vitalik 在一年多之前(2017/08)提出了 Plasma 这个概念以解决 Ethereum 交易速度及成本的问题,不过提出的内容太概念性,没什么人知道该怎么实做,在今年初 Vitalik 提出了 Plasma MVP(Minimal Viable Plasma),最小可行性的 Plasma,而目前你们也是遵循这个规范来实做。html
Plasma 属于 layer 2 的 solution,就是在主链以外作运做(也就是链下交易)。Plasma简单来讲就是链中链,每个链均可以有本身的链,本身的链还能够再有链,就像是 tree同样的概念。举例来讲,日后交易所就能够创造本身的链,在本身链内交易,速度快并且无手续费。而目前 MVP 的设计是在主链外多一层而已,尚未多层的概念。上个月的 COSCUP 有 Ethereum Foundation 负责 Plasma 的开发者的分享,影片连接在此(是中文,你们不用惧怕 : ) )。数据库
在每一个Plasma chain 会有一个 operator,operator 负责产块(能够想象是中心化的管理者),以目前来讲,operator 实做成 Restful API server,而产块能够想做是在数据库 insert 一笔纪录,跟咱们以往中心化的系统同样。而你要进入到这个 Plasma chain 须要先在主链上的 smart contract 做存款(deposit)才能进入。而后 Plasma chain 每产一个块,就必须跟主链做回报(回报 Merkle
root),这样 Plasma chain 这边的块才算被 confirm。每一个 Plasma chain 是独立的,因此不能跨链交易,必须先转回到主链。api
那安全问题呢? operator 是中央式的,若是被攻击或是本来就是恶意的呢?接续上面的例子,其实要把筹码换成新台币,没有这么简单。首先,要七天后才能领出(取出),这段期间就是挑战期(challenge period),在这段期间内,若是有人提出你在赌场内造假的证据,提交到法院(也就是主链)并被且被法院认证是造假,那你的钱就不能提领了。安全
接着回到,若是 operator 跟某个帐号串通,假造 balance 的数目怎么办勒?Plasma 会依照 transaction 的顺序处理,从最旧的到最新的逐一验证。举例来讲,less
A存了5块存进赌场(A: 5颗筹码)post
B存了20块进入赌场(B: 20颗筹码)(此时赌场共有25颗筹码)设计
接着B给 A 3颗筹码(A: 8颗, B:17颗),cdn
operator 从桌底下偷偷拿拿本身带的 1000 颗筹码给了Cserver
这个时候,你们发现赌场诈赌,就会开始想离开,把筹码换回新台币,这个时候就会照 1,2,3,4 顺序来验证交易,验证到到第 3 步,A 有 8 块能够提领,B 有 17 块能够提领,AB领完后,赌场就没钱了,因此 C 想领假造的 1000 块也没钱能够领了。更细节的部分,能够参考 Karl.tech 对于 Plasma 的介绍。htm
简单来讲,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: ethresear.ch/t/plasma-xt…
简单来讲,就是 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 验证…以此类推,解决了一次太大量的问题。
原文连接: kimiwublog.blogspot.com/2018/09/eth…
做者: Kimi Wu
稿源:以太坊爱好者(ethfans.org/posts/simpl…)