介绍Plasma MVP 与Plasma Cash_链圈子

Vitalik大约在一年前(2017/08)提出了Plasma这个概念以解决Ethereum交易速度及成本的问题,不过提出的内容太概念性,没什么人知道该怎么实作,在今年初Vitalik提出了Plasma MVP (Minimal Viable Plasma),最小可行性的Plasma,而目前大家也是遵循这个规范来实作。

Plasma属于layer 2的solution,就是在主链之外做运作(也就是离线交易)。Plasma简单来说就是链中链,每个链都可以有自己的链,自己的链还可以再有链,就像是tree一样的概念。举例来说,往后交易所就可以创造自己的链,在自己链内交易,速度快而且无手续费。而目前MVP的设计是在主链外多一层而已,还没有多层的概念。

Plasma MVP

在每个Plasma chain会有一个operator,operator负责产块(可以想像是中心化的管理者),以目前来说,operator实作成Restful API server,而产块可以想作是在DB insert一笔纪录,跟我们以往中心化的系统一样。而你要进入到这个Plasma chain需要先在主链上的smart contract作存款(deposit)才能进入。然后Plasma chain每产一个块,就必须跟主链作回报(回报Merkle root),这样Plasma chain这边的块才算被confirm。每个Plasma chain是独立的,所以不能跨链交易,必须先转回到主链。

  介绍Plasma MVP 与Plasma Cash_链圈子

可以这样想像,一个Plasma chain是一间赌场,你要进入一间赌场要先去把人民币换成赌场的筹码(deposit),接着你就可以在这间赌场做任何交易,那如果你要去隔壁赌场下注呢? 你要先换成人民币,然后再换成隔壁赌场的筹码。而在赌场的每一笔交易,都会被记载在赌场的帐本上(可以想像是Excel表格),而这个帐本要定期地跟政府报备,报备通过了,在帐本上的交易纪录,才会被承认。Plasma chain的概念大概就像这样。

那安全问题呢? operator是中央式的,如果被攻击或是原本就是恶意的呢?接续上面的例子,其实要把筹码换成人民币,没有这么简单。首先,要七天后才能领出,这段期间就是挑战期,在这段期间内,如果有人提出你在赌场内造假的证据,提交到法院(也就是主链)并被且被法院认证是造假,那你的钱就不能提领了。

接着回到,如果operator跟某个帐号串通,假造balance的数目怎么办勒?Plasma会依照transaction的顺序处理,从最旧的到最新的逐一验证。举例来说,
1.) A存了5块存进赌场(A: 5颗筹码)
2.) B存了20块进入赌场(B: 20颗筹码)(此时赌场共有25颗筹码)
3. )接着B给A 3颗筹码(A:8颗, B:17颗),
4.) operator从桌底下偷偷拿拿自己带的1000颗筹码给了C

这个时候,大家发现赌场诈赌,就会开始想离开,把筹码换回人民币,这个时候就会照1,2,3,4顺序来验证交易,验证到到第3步,A有8块可以提领,B有17块可以提领,AB领完后,赌场就没钱了,所以C想领假造的1000块也没钱可以领了。更

Plasma Cash

简单来说,Plasma Cash做了两个修改
1.)每一笔存入Plasma contract的钱,都给一个unique 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有一个时间做验证,例如0–99做N block做验证,100–199在N+1 block验证…以此类推,解决了一次太大量的问题。

Plasma的介绍大概就到这,若有错误欢迎指正!说不清楚的部分,也欢迎提问!

原创文章,作者:惊蛰财经,如若转载,请注明出处:http://www.xmlm.net/bi/31822.html