Plasma Cash完全解析

栏目: 数据库 · 发布时间: 5年前

内容简介:上一篇分析了Plasma MVP的原理和实现,这一篇介绍一下Plasma的另外一个实现版本:Plasma Cash。Plasma Cash是用来存储和转移

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

1.和MVP的区别

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

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

Plasma Cash完全解析

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交易,之后就可以在侧链上自由交易这个新资产了。

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

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

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

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

Plasma Cash完全解析

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进行了双花,挑战立即成功:

Plasma Cash完全解析

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

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

Plasma Cash完全解析

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

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

Plasma Cash完全解析

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

或关注飞久微信公众号: Plasma Cash完全解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

python 3标准库

python 3标准库

道格·赫尔曼 / 机械工业出版社 / 2018-10 / 199

在本书中,你会看到用来处理文本、数据类型、算法、数学计算、文件系统、网络通信、Internet、XML、Email、加密、并发性、运行时和语言服务等各个方面的实用代码和解决方案。在内容安排上,每一节都会全面介绍一个模块,并提供一些很有价值的补充资源链接,这使得本书成为一本理想的Python标准库参考手册。一起来看看 《python 3标准库》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具