内容简介:上一篇分析了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是用来存储和转移 非同质(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。
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
或关注飞久微信公众号:以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 每秒解析千兆字节的 JSON 解析器开源,秒杀一大波解析器!
- 注册中心 Eureka 源码解析 —— EndPoint 与 解析器
- 新一代Json解析库Moshi源码解析
- mybatis源码配置文件解析之三:解析typeAliases标签
- MySQL内核源码解读-SQL解析之解析器浅析
- Laravel 核心——IoC 服务容器源码解析(服务器解析)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Numerical Methods and Methods of Approximation in Science and En
Karan Surana / CRC Press / 2018-10-31
ABOUT THIS BOOK Numerical Methods and Methods of Approximation in Science and Engineering prepares students and other readers for advanced studies involving applied numerical and computational anal......一起来看看 《Numerical Methods and Methods of Approximation in Science and En》 这本书的介绍吧!