Plasma Cash

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Plasma Cash相关的知识,希望对你有一定的参考价值。

1. 引言

Plasma 由 V 神在2017年8月提出,希望通过链下交易来大幅提高以太坊的 TPS。

Plasma是一种设计模式,它允许链外消息驱动链上资产的转移。它通过将交易吞吐量转移到Plasma链来实现对根链的扩展。你可以把它看作是一个教授需要在短时间内批改许多考卷。教授可以将这项工作委托给助教,他们查看考卷上的每个问题并计算对应的分数,但只向教授报告总分。

每个Plasma链将交易排序的信息压缩到单个哈希,并存储在根链上。像比特币和以太坊这样的就是根链——这些区块链具有更强的安全性和去中性化保证(安全性和活性)。

“Plasma 不是在中心化服务器上贴上一个Merkle树。”
——Vitalik Buterin,2018年于TechCrunch,瑞士Zug


上图摘自Plasma World Map - the hitchhiker’s guide to the plasma

Plasma 设计模型的主要分支有:

  • 1)Plasma MVP(Minimal Viable Plasma):包含了复杂的理论来保证withdrawals的安全性,每笔withdrawal交易包含多个签名。【基于UTXO模型】
    作者为V神。Plasma MVP为Plasma白皮书发布后的第一个plasma模型。

    • 1.1)MVP以 基于UTXO的二进制状态数 为数据结构。
    • 1.2)设计了挑战系统来避免invalid exit。
    • 1.3)设计了Confirmation和Exit Priority来解决数据不可用问题。
    • 1.4)存在的问题:由于poor UX问题,在Confirmation阶段发送交易时需要2步签名。
  • 2)Plasma Cash:代币必须有固定的、不可分割的面额。用户存入的每个token都需要保留大量的数据。 【基于UTXO模型】
    作者为V神。Plasma Cash用于改进Plasma MVP的问题。

    • 2.1)每个Coin具有唯一的ID和面额。
    • 2.2)使用Sparse Merkle Tree(SMT):将coin ID作为每个叶子节点的索引。
    • 2.3)若某coin在当前块未被使用,则相应叶子节点值为null(因无与该coin相关的交易信息)。当某coin被使用时,相应叶子节点中会包含相应的交易信息。这意味着SMT的“包含证明”和“不包含证明”可用于清晰验证the use history of coins。
    • 2.4)Plasma Cash的问题在于:由于非同质化(non-fungibility),很难支付部分费用,且每个coin的历史验证可能是一项非常繁重的工作。
  • 3)Plasma Debit:用户必须存储very large sized proofs,同时operator需要锁定大量的资金,以创建pre-emptive(先发制人的)通道。【基于UTXO模型,允许花费fractional parts of token,也允许取回fractions of tokens。】
    Plasma Debit与Plasma Cash类似,只是每个token为用户与chain operator之间的支付通道。类似于大的Lightning hub,但可向Plasma Cash token那样在通道内传输。
    相比于PoS,Plasma Debit更适于PoA(单个运营者)共识模式。
    Plasma Debit转账时,要求收款方与运营者之间已有支付通道,且在该通道内运营者具有足够的资金。


所有的Plasma都假设存入的资产具有明确的owner,从而实际上阻止了创建更复杂的应用程序——如AMM自动做市商或EVM。

此外,Plasma侧链中,若某operator出了问题,无法保证其它operator可接管该Plasma chain。
Plasma要求信任operator,同时存在“mass-exit”大规模退出问题(确实发生了)——即Plasma chain上的大量用户同时赎回,在L1层造成巨大的拥塞和高交易费用,导致许多人不可避免地不得不等待相当长的一段时间才能获得资金。

1.1 基本概念

  • 稀疏Merkle树:一种大小不变的完美Merkle树,之所以称之为“稀疏”,是因为大部分叶子是空的。详细参看Sparse Merkle Tree

  • 经济最终性:保证操作永远不会逆转,除非提供最终结果的一方将一大笔钱烧毁。

  • UTXO:未消费交易输出(unspent transaction output)。每笔交易都必须具有来自有效UTXO 集的输入。每笔交易的输出将成为新的UTXO 集的一部分。比特币就使用UTXO模型。

2. Plasma应用流程

Plasma应用流程为:

  • 1)运营者将Plasma合约部署到以太坊主网:像交易所这样的实体,如希望拥有高交易吞吐量和低延迟(甚至实现即时的经济最终性)的实体,将受益于运行Plasma链并成为运营者。合约所有者包含在合约初始化中。
  • 2)Plasma运营者创建区块:运营者的众多角色之一是聚合和排序交易,并将其打包到区块中,然后将Plasma区块的哈希提交到根链(以太坊)。

    实现Plasma的方法有很多种。不同的Plasma链可以有不同的治理规则、不同的token、存储状态的方法等,但所有Plasma链会定期向根链提交哈希,以便继承根链的安全性。
  • 3)新用户Kanye将ETH存入Plasma合约,并分配返回PETH:在2种主要的Plasma设计中,可将任何token存入Plasma链并接收到与之相应的token。若Kanye存入ETH,则会得到PETH;若存入BTC,则将获得PBTC。(Plasma Cash的规范更好地支持ERC721资产,如加密猫,但并非Plasma规范都支持存入任何token)。
  • 4)Kanye向Donald汇款,但Donald还不走Plasma智能合约中:Kanye并不仅限于汇款给那些已经是Plasma合约成员的人,它也可汇款给Donald这样的以太坊巨鲸。
    在"Plasma Cash"规范中,你存入的每个代币都会被分配唯一的ID。这些唯一ID存储在稀疏Merkle树中。代币有所分配的(Merkle树的)叶子的索引,而这些索引是这些代币可用于交易的唯一位置。
    想想买卖房产——当你交易房子时,房子不会移动,但拥有房子钥匙的人会改变,房子的契据是当事人的记录以及所有权易手的频率。这使得它非常容易检查token的历史记录,因为你能够轻易的在Merkle树中查找到这些记录!

    在这里,我们具体看Kanye发送给Donald的token的索引。Kanye 在发送token时必须包含token的历史记录。如果token被多次交易,其历史记录可能会变得非常冗长!稍后我们将讨论如何改善这种情况。但就目前而言,这对Donald来说可以接受,他只需要下载他关心的代币交易历史。
  • 5)Donald有2种选择:继续花费PETH或创建退出交易以在根链上退回出ETH。Donald 不需要向运营者提交消息成为Plasma合约会员,以实现退出PETH并赎回ETH。Donald想立即换掉代币以保持匿名,所以他不想继续使用他的PETH。
    他拿到了token的历史记录,以证明所有权,并将记录放入提交到 Plasma 合约的退出请求中。他的退出交易还包括gas费和作为抵押的保证金(以防止撒谎)。当一切停当,如果没有人挑战Donald,他能在根链上用PETH赎回ETH。

    至此,已在宏观上阐述了一个理想的场景。接下来将深入讨论工作流中的每个部分:【注意,Plasma存在多种规范,不同执行方案的规范之间存在差异。】
  • 交易
  • 退出
  • Plasma运营者角色

2.1 Plasma交易

每当Kanye发送token时,他还必须同时发送该token的历史记录。在Plasma Cash中,用户只需下载他们关注的代币的交易历史。分片客户端验证允许每个用户的数据负载更轻。
但是,如果一枚代币被花了很多很多次,那么该代币的历史就会变得很长并难以在交易中传输。解决这一问题的一种提议是引入检查点。一旦检查点最终确定,客户只需提供从该检查点(有最终性)开始的证明,这样可以将证明的大小变成常数,而不是线性增长。
Plasma Cash检查点基于加密经济聚合签名,为在Y区块高度的用户X对代币的所有权提供了经济保证。

遗憾的是,在Plasma Cash中发送任意小面额的代币更加困难(Plasma借记或状态通道是对这一缺陷的改进方案)。当调用存款函数时,用户指定其存款的面额,这一方案使得Plasma Cash适合发送ERC721非同质token,而Plasma MVP的UTXO模型更适合处理任意面额交易。

2.2 Plasma退出

当提款被认为是如下情况,退出就产生了挑战:

  • 1)退出一枚已经花过的代币(Exiting an already-spent coin)
  • 2)双重退出代币(Double-exiting a coin)
  • 3)退出有无效历史记录的代币(Exiting a coin with an invalid history)

任何人都可以提交欺诈证明来挑战退出者,如果他们在撒谎,他们将失去他们的保证金。

黑客攻击怎么办?
Plasma链安全保证与根链一样好。如果Plasma链被黑客攻击,黑客必须提交退出交易,以得到他想窃取的所有资金!在Plasma Cash中,黑客必须在他的退出交易中包括保证金,他不能带着所有窃取的资金潜逃。

2.3 Plasma运营者

Plasma运营者的主要作用是:

  • 1)将交易聚合到区块中,
  • 2)并将每个Plasma区块的Merkle 树发布到根链。

在更复杂的设计中,中心运营者可以由PoS 验证者取代,从而缓解对交易审查的担忧。然而,拥有中心运营商有很多好处,而且我们可以用Plasma运营者的保证金做很多有趣的事情:

  • 即时经济最终性!由于运营者负责创建区块,因此他们可以提供有关交易包含和排序的保证。运营者会因为撒谎而付出失去保证金的代价,因此用户会立即知道他们的交易是否包括在内。
  • 无效退出处罚:可以惩罚运营者允许无效退出的通过,并消减其保证金中的资金。
  • Casper验证:运营者可以是Casper PoS验证者(验证者有保证金)

3. Plasma Cash

Plasma Cash在Plasma MVP的基础上做了如下改进:

  • 1)每个single deposit对应唯一coin ID,token不可分割也不可合并。
  • 2)不同于 Plasma MVP中将交易按txindex顺序存储在二进制Merkle树中,Plasma Cash将交易存储在sparse Merkle tree或Patricia tree中,其索引为所花费coin的ID。

用户为证明其coin是有效的,proof中需包含:

  • 1)自该coin存入依赖,代表该coin历史的所有交易。
  • 2)附加 每个区块该coin的“不包含证明”,以说明该coin在此之前未被花费,以验证该coin未被双花。

假设有 n n n个coin和 t t t个区块,相应的proof size为 t ∗ log ⁡ ( n ) t*\\log(n) tlog(n)
若用户将其coin转给另一用户,可简单的将整个proof发送给该用户。

3.1 Plasma Cash共识机制

Plasma Cash支持单一运营者(Proof-of-Authority)以及 Proof-of-Stake共识。
Plasma Cash的设计初衷是确保用户资金永远是安全的,即使共识机制misbehave。

3.2 Plasma Cash存款

用户向目标链的Plasma Cash合约存入资产。与Plasma MVP不同,每个Plasma Cash资产均以non-fungible token(非同质化token)来表示。如,若用户向合约存入10ETH,则将收到a token worth 10ETH,每个token具有唯一标识。

3.3 Plasma Cash区块

每个Plasma Cas区块内:

  • 每个现有token有一个slot。

当某token被花费时,该交易的record将放在相应的slot中。
以4种token为例:

在本例中,token #4由用户A转给了用户B,#1/#2/#3均未被花费,因此无需在相应的slot中放置任何东西。从而可实现:

  • 某token在某区块内被花费:“包含证明”
  • 某token在当前区块并未改变:“不包含证明”

用户无需跟踪每个token,某token的交易 不可能放入 另一token的slot中,用户仅需跟踪其自己的token——不用关注其它slot的内容。

3.4 Plasma Cash coin交易 及 交易历史

由于用户仅跟踪自己的token,其不需要知道谁拥有其它哪些token,当用户想要将其token发送给另一用户时,其需要证明其拥有该token!在该证明中,需包含该token的 full transaction history——自该交易创建以来的每笔交易。若history正确,则会展示the list of owners ending with the sender。

为证明history是正确的:

  • 1)用户需要提供额外的证明该history内的每笔交易均正确包含在某block内。
  • 2)且需证明没有任何missing交易,即用户还需提供 "该token在其它区块未被花费"的证明。

举例为:

即,4个区块之后,G拥有token #2,C拥有token #4。
G如何证明其拥有token #2呢?G仅需要:

  • 1)证明token #2 未在区块#1和区块#3中被花费。(2个“不包含证明”)
  • 2)证明token #2 在区块#2中由E发送给了F,并在区块#4中由F发送给了G。(2个“包含证明”)

C如何证明其拥有token #4呢?C仅需要:

  • 1)证明token #4 未在区块#2和区块#4中被花费。(2个“不包含证明”)
  • 2)证明token #4 在区块#1中由A发送给了B,并在区块#2中由B发送给了C。(2个“包含证明”)

Plasm cash区块采用稀疏merkle组织交易,每个区块的交易Merkle树的节点数量是一样的,每个coin占据一个叶子节点,且位置永不变动。当区块包含一个coin的交易时,coin对应的叶子节点才有值,否则是默认值。通过这种稀疏merkle树,系统很容易生成如下两个证明:

  • coin包含证明:
    从deposit block到最新区块间包含该coin交易的区块证明, 用来验真,即用来验证某个coin在某个区块被交易了,被更改为新owner了。包含证明是个数组,每个元素是一个区块的包含coin交易的merkle验证数据。
  • coin排除证明(“不包含证明”):
    从deposit block到最新块间不包含该coin交易的区块证明,用来验否,即用来验证某个coin在某个区块没有被交易。用来验证coin最新owner的有效性。排除证明也是个数组,每个元素是一个区块不包含coin交易的merkle验证数据。

比如coin1在1000高度有合法的包含证明,被转移给了alice了,且1001高度后有合法的排除证明,则可以认为alice是coin1的最终拥有者。这样的好处是,当alice将coin1转给bob时,alice只需将这些证明发送给bob,bob可以不需要有链的任何历史交易数据即可认可这笔交易。同时,alice也不需要保存子链的全部数据,只需保存coin1的交易记录,大大降低了每个用户的数据量。

3.5 Plasma Cash 取款 及 ChallengeExit机制

当用户想要取回某token时,需要提交该token history的最近2笔交易。如,C若想提取token #4,需要提供“child”(most recent)transaction from B to C,以及“parent” transaction from A to B。用户同时需要提交这两笔交易均包含在Plasma Cash链上Merkle proof。

和plasma MVP operator可以伪造utxo不同,plasma cash的operator是没法伪造coin的, 因为每个coin主链合约可以轻易查询检测。因而operator只能伪造coin交易记录,但是这个可以通过challengeBefore来挑战,从而导致operator伪造失败。Plasma MVP模式下,operator可作恶,系统没法干预和制止这种行为,只能通过全体用户调用startExit退出生态这一极端行为来解决。而Plasma Cash通过challenge机制即可解决operator作恶问题,是一个很大的提升。

Plasma Cash支持3种挑战机制,以确保只有token的真正owner才能取回该token:

  • 1)challengeAfter:若有人可证明取款用户之后已花费了该token,取款可被立即中断,

  • 2)challengeBetween:若有人可证明在child和parent之间还存在该token的交易,则意味着取款用户提供了invalid parent,取款可被立即中断。

  • 3)challengeBefore:若某人取款时,提供了该token history的某些其它交易。此时无法挑战立即中断取款,反而,取款用户被强制要求响应其所提供交易 之后的交易。

3.3 Plasma Cash优缺点

Plasma Cash推出的最重要的改进之一是“light proofs”。Plasma 结构要求用户下载整个Plasma 链,以确保他们的资金安全。使用Plasma Cash,他们只需下载与自己资金相关的Merkle树枝。

由于用户仅需跟踪其自身token,Plasma Cash具有很高的可扩展性。但是:

  • 1)coin交易不能分割,只能完整交易,只适合大额和non-fungible token交易,不适合小额交易。针对这个缺点,目前plasma debit项目在解决这个问题。【不适于交易所等需要fractions of tokens的应用场景】
  • 2)当区块增长时,coin的包含证明和排除证明数据不断增大
    我们假设系统支持1000个coin, 这会生成一个深度为10的稀疏merkle树(2^10=1024), 这意味着每个merkle证明需要提供10个兄弟节点hash, 每个hash是32字节,所以每个merkle证明的数据大小是:3210=320字节。我们再假设每15s出一个区块,一年就是4×60×24×365=2102400个区块,这样一年后,一个coin的合法证明的数据长度为:3202102400=0.67G,这个数据还是蛮吓人的。为了解决这问题,开发人员提出了checkpoint的概念,即每隔一段时间裁剪coin的历史记录。

3.4 Plasma Cash defragment去碎片化

详细见:

Plasma Cash的主要弱点在于其token的不可分割性。由于Plasma Cash的每个unit of value需分开exit,为使得系统值得使用,exit时的交易手续费 应远低于 退出的金额。这也意味着Plasma Cash中的最小面额(即以$记)应是主链交易手续费的数百倍。

可采用如下方案,让Plasma Cash中的面额足够小,且支持用户“multi-exit” a subtree of coins that all have the same owner with a single Merkle branch:

  • 已知某 2 k 2^k 2k sized subtree,其每个元素都是相同的,该树的a single branch就足以提供信息来验证整个subtree,并sign off on behalf of it。

但是实际上采用如上方案存在碎片化问题:

  • as users send each other partial payments and keep breaking their coins up into more and more pieces; after enough payments, a user would have to submit a separate Merkle branch and pay a full transaction fee for each coin that they exit, nullifying the benefit of exiting subtrees.

解决方案之一是去碎片化:

  • as a condition of accepting a transaction from A sending coins to B, A and B would have to send each other coins in such a way that at the end, every coin held by A has a lower index than every coin held by B. For example, suppose the starting allocation is B A C D A; B B E B F; G A A H I, and A is sending B two coins. The starting balances are A: 4, B: 4, so the final balances would be A: 2, B: 6, so the final allocation would be A A C D B; B B E B F; G B B H I, so the transfer would be an atomic swap: A gives B coins 4, 11, 12, and B gives A coin 0.

4. Plasma Cash + DEX

详细见2019年论文Plasma Cash: Towards more efficient Plasma constructions







参考资料

[1] Plasma Cash:Understand how Plasma Cash works and when to use it
[2] Plasma Cash:Plasma with much less per-user data checking
[3] Plasma Cash Simple Spec
[4] Plasma Cash: Towards more efficient Plasma constructions
[5] Plasma Cash: Plasma with much less per-user data checking
[6] 什么是Plasma?Plasma Cash?
[7] Plasma Cash 合约解读
[8] ZK-Rollups工作原理
[9] Plasma World Map - the hitchhiker’s guide to the plasma
[10] 区块链扩容系列之Plasma Cash
[11] What is Plasma? Plasma Cash?
[12] Learn Plasma
[13] fungible tokens in Plasma Cash Plasma Cash was a transaction format
[14] Plasma Cash Defragmentation

以上是关于Plasma Cash的主要内容,如果未能解决你的问题,请参考以下文章

Plasma Cash 合约解读

Plasma Cash合约解读

深入理解PlasmaPlasma Cash

POJ1276 多重背包(01背包 完全背包)

KF5 & Plasma

在 Ubuntu 14.04 LTS 上安装 PLASMA 失败