Plasma Cash:更高效的 Plasma 结构(上)

xmorient点击上方“Unitimes” 可以订阅哦!


unitimes.io

640?wx_fmt=png

全球视角,独到见解


Plasma是一种用于可扩展的链下计算的框架,Plasma Cash通过使用 NFT(non-fungible tokens,即不可替换代币)和 Sparse Markle Trees(SMT,稀疏的默克尔树)为用户减少数据存储和带宽的要求,从而对Plasma结构加以改进


本文将分析用于保证用户资金安全的加密经济退出和挑战机制,即便当Plasma Cash链的共识算法受到损害,该机制依旧可以保证用户资金安全。同时提供一个用于评估的参考实现(reference implementation)。最后,文章将简要讨论Plasma Cash协议可以进行的进一步改进,例如任意面额支付、更少的用户数据检查、快速的退出等。


01

介绍


Plasma 是一种扩展性解决方案,它通过实现在区块链之间进行资产的相互转移来增加带有智能合约功能的区块链的吞吐量。资产从区块链主链发送并存储在 Plasma 链上。与通过双向锚定(2WP)的侧链(sidechain)不同,存储在 Plasma 链上的资金可以通过一种称为退出(exit)的方式安全地撤回至主链上。只要主链的共识机制是安全的,就可以保证能够安全地撤回到主链上,即便plasma链的共识机制受到损害。


应该注意的是,Plasma改善的是区块链主链的吞吐量(即每秒能够处理的交易量)而不是确认每笔交易所需的时间 。


Plasma Cash 通过将存放在 Plasma 链中的资金独立于主链使其获得独特性,以此来使用不可替换代币(NFT)。与最初的plasma设计相比,这种方式通过减少用户对其代币数据进行校验,为将资金撤回主链提供一个更为简单的结算协议(settlement protocol)。围绕这种方式的讨论在网络上有很多。截至目前,还没有关于Plasma Cash的安全性和可扩展性保证的完整资源。


1.1

本文的贡献


协议分析:本文将对 Plasma Cash 技术进行全面的分析,对协议的各个部分及其功能进行详细解释。我们还将对协议可以添加的各种加载项(extensions)加以阐述,以及其中涉及的好处和折衷之处。


潜在的攻击分析:本文将探讨当前已知的针对Plasma的攻击以及如何设计Plasma合约来减少这些攻击。通过适当的机制设计和对可能导致故障的行为附加一些‘加密经济的’限制,我们可以实现一个能够抵御攻击的系统,即使攻击者完全控制了plasma链的共识机制。


实现:Plasma Cash的参考实现在github.com/loomnetwork/plasma-cash 中已经提供了,能够支持以太币(ETH)和 ERC-20 代币,以及ERC-721代币(即NFT)。Plasma 合约是不考虑代币种类的,因此无需扩展合约来支持更多种类的代币。


1.2

相关工作


在这一部分,我们将简要阐述有关通过其他技术方案来解决扩展性问题的工作,每种方案都有其自身的折衷之处。当前共有两种扩展性解决方式:协议层的扩展性(即第一层)和通过第二层计算来实现扩展。Plasma 被认为是第二层扩展性解决方案。


侧链:侧链是一条有着独立的安全共识算法并与另一条链(主链)相挂钩的区块链。价值(资产)可以通过使用简单支付验证证明(Simplified Payment Verification,SPV)来从一条链转移至另一条链上。通过SPV证明可以验证A链上的事件(交易)已经在B链上发生过(用SPV来证明一个交易确实已经在区块链中发生过)。应该注意的是,只有当侧链的共识是安全的,且不会审查交易或生成无效状态变化时,用户才能将资金从侧链撤回至主链上,也就是说,共识机制是侧链的‘托管人’。因此,通过使用侧链来解决扩展性会随着其容量和吞吐量的日渐增长而在安全性和去中心化等方面受到损害。作者认为,通过侧链来解决扩展性的优势有限,其主要用途是在实验和互操作性领域。


支付通道网络(Payment Channel Networks):支付通道(payment channel)是一种能够使双方通过交换代表通道最新状态的签名消息,以快速和免手续费的方式进行价值交易。在任何地点,状态都可以及时在底层区块链上进行结算。如果一方试图结算之前的某个状态,另一方可以在限定的时间内发起挑战/争议,可以对欺诈的一方进行惩罚。初始化支付通道需要通过一笔链上的交易才能实现。支付通道可能是单向性的或双向性的,且多个支付通道可以联系在一起形成支付通道网络,从而使双方能够彼此交易,即便双方之间并没有一个支付通道,即可以通过(1个或多个)中间人来实现多跳支付(multi-hop payment)。


支付通道具有即时敲定(instant finality)的特点,因为一旦交易的参与各方交换了各自签署的证明,支付就被认为是完成了。闪电网络(Lightning Network)和雷电网络(Raiden Network)都属于支付状态网络。除了在初始化支付通道时需要在链上进行资金交易外,支付通道网络还要求锁定一笔与正在被交易的资金价值相等的资金,以及需要支付给中间人的手续费。通用状态通道(Generalized State Channels)进一步延伸了支付通道的理念。通用状态通道用于解决在链下执行任意计算的问题,能够在链上进行结算。


02

Plasma 基本原理


‘经典的’ Plasma:Plasma 的最初版本描述了一个能够将子链和根链(或主链)连接起来的机制。如下方图1所示,主链在存在争议的情况下充当最终仲裁员。由 Plasma 链形成的树形结构形成了一个分层次区块链结构,就类似于法院系统的类似于法院系统,可以将争议一直上升到最高法院(即主链)。


640?wx_fmt=png


图1:链接主链(根链)的多条区块链(子链)


Plasma链使用一个潜在的中心化共识算法(如 PoA,即权威证明),并从主链的共识算法中获得其安全性。这主要是通过在主链上公布每个 Plasma 区块的默克尔树结构的状态根(state root)来实现的。Plasma 链使用的交易模型基于UTXO(未使用交易输出),类似于比特币。


退出和挑战:用户可以通过这种机制来试图将自己在 Plasma 链上的 UTXO(未使用交易输出)撤回至主链的账户中。在提交退出 UTXO 之后,用户需要等待挑战期(challenge period)通过,在挑战期期间,其他用户将对该用户的退出发起挑战,因为可以通过证明该退出无效来获得一笔奖励金。


挑战是指由另一个用户提供的证明,证明想要退出的 UTXO 无效或已经被花费掉了。挑战可以是无需交互的(即如果挑战成功,证明 UTXO 无效,则退出即刻会被取消),也可以是交互式的(即发起挑战的用户将会要求想要退出的用户在挑战期结束前,对该挑战作出回应)。在挑战期结束后,如果没有其他挑战,就可以最终确定退出了,即允许想要退出的用户将 UTXO 明确的数量金额撤回至该用户在主链上的账户中。


退出和交互式挑战机制要求用户在发起退出时附加一笔奖励金作为抵押。如果该用户的退出被成功挑战了,即证明想退出的UTXO是无效/已经被花费掉了,则该笔抵押金将被发送给成功进行挑战的用户,当然此时退出就会被取消了。这种方式将激励用户诚实行事,同时也创建了一个由诸多监视者(即发起挑战的用户)组成的系统,他们会因为报告欺诈性行为而获得奖励。


03

Plasma Cash


Plasma Cash 是要求更少的用户数据校验的 Plasma 结构。Plasma Cash 通过使用不可替代代币(NFT)来减少用户校验的要求,而只需校验用户持有有的 NFT 即可。系统的安全依赖于用户在接受某个币作为支付方式之前,通过 Sparse Merkle Trees (SMT,即稀疏的默克尔树)来完全验证该枚币的历史记录,SMT 会对某一笔包含或不包含在某个区块中的交易进行有效验证,这点将会在下一个小章节中进一步阐释。


3.1

Sparse Markle Tree


默克尔树(Merkle Tree)其实就是一个数据结构,该结构允许以简洁的方式提交数据集(dataset),并证明这个提交的数据集中的某个部分是通过 O(log2(N)) 个步骤(而非 O(N) 个步骤)进行提交的:其中N代表该数据集中元素的数量,通过默克尔证明(Merkle Proofs)获得。被提交的值叫作默克尔根(Merkle Root)。Sparse Mercke Tree (SMT ) 就是一颗排列有序的默克尔树,其中数据集的每个元素都被放置在一片带有索引的“叶子”上,该索引与该元素在数据集中的索引相对应。如果该数据集的某个元素不包含在默克尔根里面,那么该元素的“叶子”将被设置成一个特殊的默认值(default value)。


通过默克尔证明,可以有效地证明某笔花费了一个币的交易被打包进入了某个区块。这种方式也可以证明某笔花费了一个币的交易没有被带包进入某个区块。一个币只能在每个区块中使用一次,因为涉及该枚币的交易只可能存在1笔。如果某个代币还没有被使用,则其“叶子”的哈希值就被设置成0。以上的情况可以在下图中展示出来。


640?wx_fmt=png

图2:SMT中的默克尔证明


通过预先计算 SMT 的默认值,以及通过在证明中引入位段(bitfield)作为从证明或 SMT 的默认值中转变成在验证过程中选择接下来的32个字节,这样可以对验证者进一步进行优化,正如[10]中所阐述的那样。对于一个包含2378笔交易的区块的合理估值(estimation)导致证明的大小为320个字节,相比之下,对于大小为64的SMT而言,标准的证明是2048(64*32)个字节。


3.2

周期性默克尔提交


所有 Plasma 的设计都依赖于一个 Plasma 链运营者,负责将每个已生成的区块的默克尔根(Merkle Root)提交至主链上。如果使用了一个PoS(权益证明)系统,某个区块的公布必须伴随着许多验证者(validators)进行签名,超过预先约定的那个阈值(threshold)。每当一个Plasma区块的根被提交至主链上时,所有包含在该区块中的有效交易,一旦有关这些交易被打包进入该区块的见证数据(witness data)可以获取时,则这些交易就可以被视为已经确定(finalized)。


由于只需要将区块根提交至主链上,而无需提交区块中的所有交易,因此Plasma可以将任意数量的交易捆绑在一起,唯一限制就是该Plasma区块的大小(size)。能够实现的最小确认时间(minimum finality time)就是根链的出块时间(在以太坊根链,出块时间为15秒)。如果每个区块都必须在主链上公布,那这一过程的运营成本将非常高昂。我们希望运营者们通过降低提交区块根的频率来换取更大的确认时间,从而能够降低维护成本


3.3

NFT & 抵押


当我们在 Plasma 智能合约中存储(抵押)一定价值(币)时,合约将为该枚币生成一个唯一的 ID 和一个元数据键值对(metadata keyvalue pair),并将之存储在合约中。这个 ID 是该枚币的唯一序列号,使该枚存储在合约中的币变成了不可替代代币(NFT,即non-fungible token)。因此,将5枚以太币存储两次两会产生两个NFT,这两个 NFT 包含了其自身的唯一交易历史,并且它们之间是相互独立的。可以将这个唯一的 ID 视为一个序列号,就像法币现金中的序列号一样。


当该枚币被存储在 Plasma 只能合约中之后,一个只包含该笔存款的交易将被添加至Plasma链之上。


3.4

币的转移 & 交易历史的验证


Plasma Cash 中的每个币都有其独一无二的交易历史。某个币的接收者在接受之前,必须验证该枚币拥有一个有效的交易历史。一个具有无效历史的币被认为是假币,因此无法进行安全地取出/撤回。为了验证某个币的交易历史,必须向接收者发送一份有关该枚代币的(最开始的)交易被打包/未被打包进入区块的默克尔证明(merkle proofs)。然后接收者再继续验证有关该枚代币的交易历史是否存在无效花费(invalid spends)。这是通过验证该默克尔证明在主链 Plasma 区块的默克尔根上的有效性,来加以实现的


这将给该枚币的发送者造成很大的存储和带宽负担。具体来说,发送者需要发送的默克尔证明就是  O(t ∗log2(N)) ,其中 t 表示从该枚币开始存储以来的区块的数量,N 表示该Plasma链支撑的币的数量。


在现实情况下,当买方想要从卖主那里购买某个产品时,会涉及到一下几个步骤(在不发生欺诈的情况下):


  1. 买方广播一笔交易,该笔交易将自己对一定数量的币的所有权转移出去;

  2. 该笔交易会被打包进入某个区块,相关的见证数据(witness data)将可以获取;

  3. 买方验证该笔交易是否已经被打包进入该区块;

  4. 买方将有关该笔交易已(未)被打包的证明发送给卖主;

  5. 卖方验证有关该币的历史记录,以及该币被打包进入该区块的正确性;

  6. 卖方将产品发给买方。


3.5

抵押币的退出


正如在上文第2章节中描述的那样,退出机制就是一种将币从 Plasma 链中撤出,并允许该币被转移至持有者在主链上的账户中。


对币进行退出,要求退出者提供证明自己对该枚币的所有权的交易,包括由该枚代币之前的所有者签名的历史记录,以及该笔交易的直接始源(direct ancestor)。同时也需要提供有关该笔交易被打包进入区块的默克尔证明。


640?wx_fmt=png

图3


如图3: 在区块1中,Alice 将主链上面的一枚币抵押入Plasma链。在区块2中,Alice 将该枚币发送给 Bob,并且Bob验证了该枚币存入成功。区块3中在没有存入任何该枚币的交易信息的情况下被提交了。在区块4中,Bob 将该枚币发送给 Charlie。Charlie 必须验证在区块1和区块2中该枚币的历史信息,以及验证该枚币在区块3中并无交易历史。如果 Charlis 希望将 Bob 的该枚币取出,则必须提交那笔经过Bob签名的交易,以及有关该枚币的直接始源(在本例中,即一开始Alice向Bob发送的那笔交易)。Charlie 同时还需要提供有关这两笔交易分别被打包进入其区块中的默克尔证明。


可以通过状态机(state machine)对币进行建模。在开启退出机制后,该枚币就切换到 EXISTING 状态(退出状态)。如果通过了挑战期(或成熟期),该枚币的退出就可以敲定,其状态也就切换至 EXISTED 状态(已退出状态),此后就可以将该枚币撤回至用户钱包中了,可通过下图4加以说明。图5展示了退出从发起至最终敲定的全过程。我们将在下文的第4章节中讨论有关挑战(challenge)的详情。


640?wx_fmt=png

图4: 退出步骤。在一枚币被切换到已退出的状态后,其持有者可以将它提取到钱包中。


640?wx_fmt=png

图5:在整个过程中,退出可以在成熟期被挑战。在成熟期结束之后,该枚币完成退出,可以被提取出来。


由于文章较长,我们将在之后推出论文的第二部分的疑问。第二部分内容包括:

4. 对Plasma Cash的攻击

  4.1 对已花费的币进行退出

  4.2 双花退出

  4.3 通过无效交易历史进行退出

  4.4 挑战已花费币的退出

5. 未来的工作

  5.1 任意面额支付

  5.2 减少用户数据审核

  5.3 更快和更低成本的撤回

6. 总结


原文作者:Georgios Konstantopoulos

编译:Jhonny

原文链接:

https://github.com/loomnetwork/plasma-paper/blob/master/plasma_cash.pdf



【本文版权属于 Unitimes,转载请保留版权信息。未经授权,不得以任何方式加以使用,包括转载、摘编、复制或建立镜像。Unitimes 将追究侵权者的法律责任。合作或授权请联系 editor@unitimes.io 或添加微信 unitimes2017】


640?wx_fmt=jpeg
阅读更多

没有更多推荐了,返回首页