zoukankan      html  css  js  c++  java
  • Plasma Debit原理分析

    回顾一下,在Plasma Cash中,每次充值会产生一个uid作为唯一标识,并记录充值的金额amount。注意,这个amount是不可更改的,这就是代币无法分割的关键所在。Plasma Debit把这个​​amount扩充套件成了两个值v和a:

    • v表示从主链上充值的ETH数量,正常情况下是不变的
    • a表示在侧链上该代币的owner可用的额度,会随交易发生变化

    举个例子:使用者从主链上充值了5 ETH,则v=a=5。然后他在侧链上拿出其中价值2 ETH的份额转给了别人,那么此时v=5,a=3。注意,还是同一个uid,只是包含两个属性,用程式码可能更容易解释:

    <span style="color:#444444"><code><strong><span style="color:#c678dd">struct</span></strong> <strong><span style="color:#e6c07b">Balance</span></strong> {
        uint256 bonded; <em><span style="color:#888888">//v</span></em>
        uint256 withdrawable; <em><span style="color:#888888">//a</span></em>
    }
    mapping (uint256 => Balance) <strong><span style="color:#c678dd">public</span></strong> balances;
    </code></span>

    那么这个v - a的部分归谁呢?归operator。
    在这里插入图片描述
    也就是说,所有人的交易都是通过operator作为中介的,举个例子:A手里有一个代币#1(v=a=5),B手里有一个代币#2(v=5 , a=3),此时operator手中持有代币#2的价值2 ETH的份额。如果A想给B转让价值2 ETH的额度,会发生什么?交易完成后,A手中持有代币#1(v=5, a=3),B手中持有代币#2(v=a=5),此时operator手中持有代币#1的价值2 ETH的份额。可以看到,A和B手中持有的代币没变,operator持有的代币价值也没变,但是A和B完成了交易,这就是Plasma Debit的神奇之处。
    在这里插入图片描述
    不过,这里有一个大问题:刚开始的时候,所有人充值以后v都是等于a的,v又不能变,没办法互相转账啊?这时候,使用者需要呼叫主链合约的operatorTopUp()函式,请求operator提高自己的v。operator会在主链上充值额外数量的ETH,并在侧链上修改对应代币的v值。

    举个例子:刚开始的时候代币#1的v=a=5,修改完后v=7,a=5,相当于充值的时候operator帮你多充了2 ETH,然后在侧链上你又把价值2 ETH的额度转让给了operator。所以,其实是operator掏出钱来为整个系统提供了流动性。从这个意义上来说,operator是贷方(Credit),而使用者是借方(Debit),相必这就是Plasma Debit名字的由来~至于operator的钱怎么充,文章里没有提,个人猜测可能operator会在主链合约中锁定一部分的ETH,如果有使用者传送operatorTopUp()请求,自动从里面扣,具体要等看到程式码才能知道了。

    另外有人说了,为什么要搞这么复杂呢?侧链反正是operator说了算,他直接把v改掉不就行了么?这里谈谈我的理解。我们知道,Plasma Cash的核心优势是:使用者只需要关心自己手中的代币。在Plasma Cash中,只有使用者充值才能铸币,uid是主链合约生成的,operator无法凭空造出一个代币来。因此,operator如果想作恶,只能冒领别人的代币,这样一来一定会被别用户挑战。但是Plasma Debit有所不同,operator是可以修改使用者代币中的金额的。这部分多出来的钱必须先由operator垫付,并记录在主链上。这样,operator提现的时候也只能提走自己垫付的钱,不能多提。

    Plasma Cash/Debit的另一大优势是:可转让性(Assignability)。你可以把代币完全转让给另外一个账户,这样对方无需在主链上进行任何交易就可以加入到侧链的支付网路中了,仅仅需要验证该代币的所有交易历史(这一点正是闪电网路的状态通道方案的缺陷所在)。

    总结一下:Plasma Debit通过为代币引入新属性,利用operator作为中介,为整个系统提供流动性,从而解决了Plasma Cash代币无法分割的缺陷,使得微支付成为可能。目前Plasma Debit还处于理论研讨阶段,Loom专案在github上为其单独开了一个程式码分支,但是暂时还没有实质性的程式码披露,让我们拭目以待。

    参考:

    https://ethresear.ch/t/plasma-debit-arbitrary-denomination-payments-in-plasma-cash/2198

    https://medium.com/@eolszewski/plasma-debit-simplified-dd8aa233e602

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

  • 相关阅读:
    领域模型(domain model)&贫血模型(anaemic domain model)&充血模型(rich domain model)
    XSS攻击&SQL注入攻击&CSRF攻击?
    算法笔记_054:Prim算法(Java)
    算法笔记_053:最优二叉查找树(Java)
    算法笔记_052:蓝桥杯练习Multithreading(Java)
    算法笔记_051:荷兰国旗问题(Java)
    算法笔记_050:硬币收集问题(Java)
    算法笔记_049:奇偶数排序(Java)
    算法笔记_048:找零问题(Java)
    算法笔记_047:复数运算(Java)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313180.html
Copyright © 2011-2022 走看看