Plasma Cash完全解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TurkeyCock/article/details/84565741

上一篇分析了Plasma MVP的原理和实现,这一篇介绍一下Plasma的另外一个实现版本:Plasma Cash。

1.和MVP的区别

Plasma Cash和MVP最大的不同在于使用稀疏Merkle树代替了标准Merkle树。我们都知道,Merkle树的好处在于可以利用很少的数据来证明某笔交易“存在”于某个区块中,那么稀疏Merkle树有什么好处呢?除了可以证明某笔交易“存在”于某个区块中以外,它还可以证明某笔交易“不存在”于某个区块中!

怎么做到的呢?其实也很简单:计算区块Merkle根时使用一个固定高度(257层)的Merkle树,每个uid对应一个叶子节点(忽略哈希碰撞概率)。如果该区块中包含某个uid的交易,则在对应的叶子节点处放置该交易,其他叶子节点都为0。这样一来,如果我们需要证明区块中不存在针对某个uid的交易,只需要提供0的哈希值和对应的merkle proof就可以了!
在这里插入图片描述

2.充值

Plasma Cash是用来存储和转移非同质(non-fungible)代币的。所谓非同质代币,是指这些代币不可分割、不可互相替代。这一点在游戏领域比较容易理解:某个代币可能代表一把剑,另一个代币可能代表一个盾牌,这两个装备的价值是不同的,另外你也不可能把剑或者盾牌拆成一小块一小块地卖给别人。举个具体的例子:你充值10ETH,会生成一个代币,然后你再充值100ETH,又会生成另外一个代币。这两个代币的价值显然是不相同的,无法互相替代,同时你跟别人交易时只能更改代币的所有权,不能把它们分割成一小份一小份地花掉。以Omisego的实现为例,主链上会生成两个funds对象,并为它们各自分配一个uid,最后发送Deposit事件:

uint uid = uint256(keccak256(currency, msg.sender, depositCount));
wallet[uid] = funds({
    hasValue: true,
    isConfirmed: false,
    amount: amount,
    depositor: msg.sender
});
depositCount += 1;
emit Deposit(msg.sender, amount, uid);

operator监听到这个Deposit事件,在侧链上为这个uid生成一笔deposit交易,之后就可以在侧链上自由交易这个新资产了。

3.交易

之前提到过,资产是不可分割的,交易只能转让所有权。

在Omisego的实现中,每笔交易中包含下面几个字段:

  • uid:资产唯一标识
  • amount:和uid关联的充值金额(用于验证)
  • new_owner:资产的新主人
  • sig:交易签名
  • prev_block:上一笔交易所在的区块高度
  • spent:新主人是否又把资产花出去了

重点在于后面两个参数的验证:首先在prev_block中查找该uid对应的交易,如果有并且spent为false,则说明当前这笔交易是有效的,并且把prev_block中的那笔交易的spent设置为true。
在这里插入图片描述

4.退出 & 挑战

用户想从侧链上退出时,需要提供要退出的交易和它上一笔交易的merkle proof用于验证,我们看一下startExit()的函数原型:

    function startExit(
        bytes prevTx,
        bytes prevTxProof,
        uint prevTxBlkNum,
        bytes tx,
        bytes txProof,
        uint txBlkNum
    )

也就是说,要证明有人把钱转给了你,还要证明一下他的钱是从哪里来的。

如果用户发现了一笔非法退出请求,则需要对其发起挑战。我们把要退出的交易称为child,它的上一笔交易称为parent,则可以分为3种情况:

1.child交易的后面有人把钱花掉了

如下图所示,说明C对uid 100进行了双花,挑战立即成功:
在这里插入图片描述

2.parent和child交易之间还有关于这笔资产的交易

如下图所示,说明parent并非child的上一笔交易,挑战立即成功(B有可能对uid 100进行了双花):
在这里插入图片描述

3.parent之前有疑似双花的交易

如下图所示,A有可能对uid 100进行了双花。此时挑战不会立即成功,但会加入挑战列表。被挑战的人必须响应该次挑战,证明在这两笔冲突的交易之间,uid 100又被重新转给了A(紫色交易),否则无法完成提现:
在这里插入图片描述

5.优点和缺点

Plasma Cash具有非常高的可扩展性,由于使用了稀疏Merkle树,用户只需要关心他们自己的代币的流向。

当然,缺点也是很明显的,它只能支持非同质代币的交易,适用范围非常局限。后面会有一个叫Plasma Debit的项目来解决这一问题。另外,有人诟病验证代币所有权时需要比较大的数据量的问题,有一个叫做Plasma XT的项目正在试图使用checkpoint的手段消除这一缺陷的影响。

参考:

https://github.com/omisego/plasma-cash

https://medium.com/@kelvinfichter/whats-a-sparse-merkle-tree-acda70aeb837

https://www.learnplasma.org/en/learn/cash.html

更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock
或关注飞久微信公众号:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/TurkeyCock/article/details/84565741