Plasma是一种用于构建可扩展区块链应用程序的框架。
Plasma框架
Plasma是用于构建可扩展应用程序的框架。Plasma应用倾向于使用common building blocks,大多数Plasma应用需要将智能合约部署到另一个“根”区块链(如以太坊)。
众所周知,目前的以太坊网络,每秒最多只能处理20-30笔交易,而对于很多简单支付,区块链需要处理每秒大约几千笔交易订单。很多项目正在以不同的方式解决可扩展问题,我们希望通过扩展区块链系统来解决问题。同时也希望是在保持安全性和分散性的前提下,毕竟这才是我们构建区块链的原因。通常我们有两种方式:
- 通过升级区块链本身来使得区块链更具有扩展性。
- 通过尝试在现有的系统上构建东西,在添加新的图层而不更改底层系统。
Plasma属于第二种,这种方案的很多设计来源于观察,即每个人都不必了解网络上发生的每一笔交易。我们可以从一个链中获取资产并通过将资产锁定在主链(或“根链”)上并在侧链上再次“创建”它们,将它们转移到另一个链(称为“侧链”)。当你想回去时,你只需要“破坏”侧链上的资产并在根链上解锁它们。
这听起来很简单,但有一个很大的问题:有人必须同意在侧链上“创造”这些资产。那么谁可以“创造”资产?这里的想法是,如果侧链共识机制运作正常,那么您的资产是安全的。不幸的是,侧链通常并不比主链安全。如果有人设法随意地赚钱,而这些资金与锁定在主链上的资产不对应,那么他们就可以“销毁”这些资产(他们欺诈性地创建了这些资产)并窃取了大量资金。
显然这并不理想,只要侧链是安全的,您的资产就是安全的。但如果侧链发生故障,那么您的资产就可能会被盗。这是我们介绍Plasma,首先,开发Plasma是为了获得侧链的一些好处,同时确保只要根链是安全的则存储在侧链上的资产必须始终是安全的。我们没有获得侧链的所有功能,但我们保留了一些最重要的东西(如使交易能够更加便宜),同时还保持安全性。Plasma的基本原则是,如果侧链发生安全故障,所有用户的资产都可以顺利“回退”到根链。
区块链不仅缓慢而且昂贵,Plasma想要构建快速而便宜的区块链,也同时兼顾它的安全性,以下的组件将使之成为可能:
脱链执行
Plasma应用在“根链”之外完成大部分工作,根链往往速度慢且成本高,因为它们需要非常安全。应用程序应该可以在根区块链之外进行任何工作。
例如,在Plasma MVP中中,几乎每个交易都发生在以太坊之外。只有存款和取款,进入和退出时,才在智能合约上处理。这是Plasma应用的标准工作流程。任何不需要资产的移入、移出智能合约的东西都可以在链外执行。
状态承诺
当我们做脱链处理的时候,我们需要一些方法来确保我们的变化是最终的。这就是我们利用所谓“状态承诺”的原因。state commitment 是存储应用程序状态的压缩版的加密方式。
然而,Plasma无法存储有关应用程序的所有内容。我们通常使用Merkle trees,这些承诺有点像您的应用程序的保存点。
退出机制
如在支付网络应用中,应用程序的承诺可能包含了每个用户目前有多少钱的信息。如果用户想要从这个应用中退出并提取他们的钱,他们需要向智能合约证明他们有钱撤回,为此,用户需要使用Merkle proof。
以上即为Plasma应用的基本的构建模块。下面我们来介绍一下Plasma MVP、Plasma Cash和Plasma Debit。
Plasma应用
Plasma MVP
Plasma MVP是一种基于 UTXO
构建的极其简单的Plasma链的设计。其基本的规范支持高吞吐量的支付交易。以下将介绍其设计过程、工作原理及构建方式。
扩展脱链
通过增加区块链的数量确实可以增加处理任务的总数,但是一旦达到极限,那么增加区块链就不是一个好办法,独立的区块链还同时降低了生态系统的总体安全性。侧链 的引入提供了一种替代方案,它允许创建“侧”区块链,其资产与“父”区块链挂钩。与大多数区块链系统一样,这些侧链需要它们自己的共识机制来确定块的规范集和排序。如果这种共识机制失败或被制服,侧链上的用户资金可能面临被盗的风险。于是引入了Plasma。
共识机制
区块链通常需要共识机制,Plasma链是特殊类型的区块链。即使Plasma共识机制失败,也可以保证用户资金的安全。因此,最简单的MVP版本依赖于称为operator的东西。operator是通过创建块来有效运行整个Plasma链的单个实体。Plasma的独特设计确保即使操作员试图行为不当,用户资金也是安全的。此关键功能还可以将Plasma MVP用于私有区块链,同时确保用户始终保持对其资产的控制。现在我们将详细解释为何用户资金始终是安全的。
存款
基本的MVP规范只允许用户存入ETH,但规范可以很容易地扩展到支持ERC20。当用户存入这些资金时,在Plasma链上创建一个仅包含单个交易的块。此交易为存款人创建新的输出,其值等于存入的资金的价值。一旦用户存款,他们就可以开始在Plasma链上进行交易。
交易
用户可以通过花费他们拥有的输出并创建新输出来进行Plasma链的交易。实际上,这意味着签署一个签名,确认用户愿意进行交易。然后将该交易(和相应的签名)发送给operator。operator将收到一堆交易,然后将它们包含在称为块的有序交易列表中。一旦operator收到足够的交易来填补区块,operator将向该区块提交对该区块的承诺。
每个块都由一组交易组成,这些交易被转换为Merkle trees。这棵树的根源是与每个Plasma块一起发布到以太坊的承诺。
取款
当用户想要退出Plasma链时,他们会在以太坊上提交“退出”交易。
开始退出
由于MVP中的资金表示为UTXO,因此每个出口必须指向特定输出。我们还想确保只有实际拥有该输出的人才能撤回它。因此,为了提款,用户需要提交merkle证明及退出。智能合约检查此证明以确保创建输出的交易实际包含在某个块中,而且还需检查输出是否由启动退出的用户拥有。
挑战退出
如果只需要撤回所需的全部内容,那么用户就可以撤回他们已经花费的输出。我们希望确保所引用的输出实际上是未使用的,因此我们引入了一个挑战期。挑战期是一段时间,人们可以通过证明UTXO实际花费来挑战退出的有效性。用户可以通过揭示由开始退出的用户签署的UTXO来签署的另一个交易来证明UTXO确实花费了。
退出优先权
我们刚刚描述的退出协议允许人们从Plasma链中提取资金。不幸的是,Plasma operator被允许做坏事,比如双重支出交易,我们无法做任何事情来制止它们。operator甚至可以从无效交易创建的输出中开始提款。
我们该如何处理呢?我们希望进行有效交易的用户在进行无效交易的任何用户之前获得资金。我们只需要添加一些规则来确保用户资金是安全的。这些规则中的第一个是UTXO具有“退出优先级”,确切的优先级基于区块链中UTXO的位置。该位置首先由块确定,然后是块中交易的索引,然后是交易中输出的索引。这为每个UTXO提供了独特的静态位置。“较旧”的UTXO会在较新的之前退出,这意味着如果区块链中包含无效交易,那么在无效交易之前发生的所有交易都将在该无效交易之前处理。
确认签名
如果在错误交易后包含交易,该怎么办呢?如果用户进行交易,交易被发送给operator,并且operator的有效交易之前放置无效交易,则完全会发生这种情况。用户可以尝试退出交易的输入,可以通过显示签名支出来挑战退出。
我们通过要求交易无效直到它们签署两次签名来处理这种情况。每当用户进行交易时,他们将签署第一个签名以使该交易包含在块中。然后,一旦交易包含在有效块中,用户将签署第二个签名,称为确认签名。正确遵循此规则的用户永远不会签署确认签名,除非他们知道他们的交易包含在有效的块中。
我们添加了一个额外的规则,退出挑战也必须提供确认签名。现在,如果操作员在无效交易后包括用户的交易,则用户根本不会签署确认签名。无效交易后包含的交易将不具有确认签名,因此无效。
More Viable Plasma
确认签名会带来非常糟糕的用户体验。用户需要在进行交易之前签署签名,等待查看包含在有效块中的交易,然后签署另一个签名。第二个签名也必须包含在Plasma块中,从而减少可用于更多交易的块空间! More Viable Plasma,也称为MoreVP,是Minimal Viable Plasma的扩展,无需确认签名。
Plasma Cash
Plasma Cash 是一种Plasma基于ERC721协议的实施方案,主要用于存储和转移不可替代的Token。Plasma Cash最初设计用于解决Plasma MVP中的集中退出问题。
智能合约通过定义应付回退函数在接收ETH时执行部分功能,但不适用接收其他类型通证。ERC721标准中定义了一种onERC721Received的方法,当ERC721通证被发送到智能合约账户时被调用,且在接收ERC721通证后可模拟回退函数的回调功能。Plasma合约实施为ERC721TokenReceiver,在收到硬币后立即触发存款函数。
为了表明没有任何丢失的交易,用户需要提供证据,证明令牌未在任何其他块中使用。让我们通过查看一些Plasma Cash块来证明这一点。
如图,在这四个Block结束时,G拥有token#2,而C拥有token#4。那么G如何证明他们实际拥有#2?G只需要证明#2没有花在块#1和#3上,并且它在块#2中从E转移到F,在块#4中 从F转移到G。G可以通过每个块的Merkle证明来实现这一点(利用特殊的稀疏Merkle树结构(SMT))。
Plasma Cash中的每个硬币都独一无二,考虑到有使用Merkle树来组织区块内的交易,但是树中交易索引为硬币uid,我们把它称为Merkle树中的“slot”。硬币有uid字段,指存入的ERC721硬币uid。字段由ERC721通证合约分配,与先前引用的slot无关。添加contractAddress字段是为了让合约支持多类型通证。硬币状态建模为状态机形式,包括DEPOSITED,EXITING,CHALLENGED,EXITED等状态。
新存入硬币最初处于DEPOSITED(存入)状态。当用户可通过引用自己拥有的交易(或该交易的直系祖先)以及包含对应引用交易的区块,启动硬币退出。开始退出后,状态变为EXITING(退出中)。
正常情况下,成功启动退出后,已处于EXITING(退出中)状态一段时间(一段时间=挑战/成熟期)的硬币得以完全退出且状态变为EXITED(已退出)。完全退出相当于硬币提现成功。那么“不正常”情况下,硬币退出的成熟期出现挑战。根据Plasma Cash规范中描述,对后来交易或退出引用区块之间的交易提出挑战时,退出马上被删除,且将退出人的债券(bonds)交于挑战者。
当用早先区块中交易挑战退出时,硬币状态被设为已挑战(CHALLENGED),且必须在挑战期结束时对挑战做出响应。响应后,硬币状态返回至EXITING,退出以“已配合挑战”的形式完成;若未响应,则退出被删除。
这个机制存在以下不足:
- 退出只能由退出交易所有者发起。
- challengeAfter 只能通过对被挑战退出的交易进行直接花费。
- challengeBetween 必须提供被挑战退出的先前交易所有者的支出。
- challengeBefore 用户证实自己可以退出硬币,但没有退,而是对恶意退出提出挑战。
- respondChallengeBefore 必须带被响应挑战交易的后续花费。
我们要求退出人在启动退出时首先提交一定数额的债券。挑战成功时,债券划拨给挑战人。由于challengeAfter和challengeBetween是非交互的,因此不需要债券。但是challengeBefore则要求用户提交一笔挑战债券(a bond for the challenge),响应成功债券被划拨给响应人。
Plasma Cash的挑战退出需要支持三种类型的挑战,以确保只有token的真正所有者才能撤回该token。如果有人证明撤销用户以后实际花费了token,则可以立即阻止提款。如果有人显示父交易和子交易之间存在交易,也可以立即阻止提款,这意味着提取用户提供了无效的父交易。还可以通过在Token的历史记录中提供一些其他交易来挑战退出。
Plasma Cash具有高度可扩展性,因为用户只需要跟踪他们自己的token。然而,由于在可扩展性和灵活性之间需要进行平衡,这使得Plasma Cash不适用于需要小数代币的场景,例如交易所。此外,与每个交易一起发送的证据可能会非常快速地增长。一旦Plasma链运行了一段时间,这些证据可能会变得非常大。当然,Plasma Cash仍然适用于某些场景,对不可替代的代币的支持使得Plasma Cash非常适合供应链物流和纸牌游戏!
Plasma cash的实现源码见 plasma-cash。
Plasma Debit
Plasma Debit 付款渠道交易允许使用代币的小数部分。因此,它不必撤回整个token,而是允许用户部分撤回token。如果用户花费了1个ETH token的一半,则允许他们撤回0.5 ETH。
在Plasma Debit中,交易Merkle树被分成多个槽,每个槽存储固定的ETH面额(存入的金额)并跟踪公钥。该槽中的每个事务都更新当前与该硬币相关联的公钥。每个时隙不仅会跟踪公钥,还会跟踪0到v之间的数字a,其中v是在主链上存入该帐户的ETH总量。v不会改变,但是a可以在每次交易中变化,并且代表所有者拥有的当前硬币的部分。存入该槽的剩余资金由operator拥有。其中A交易被改变时,任何其他的交易,需要当前coinholder的签名。
每个Plasma Debit硬币基本上等同于当前硬币所有者和操作者之间的双向支付渠道(类似于闪电网络中使用的基于多重支付的支付渠道)。唯一的区别是支付渠道的状态在主链上定期公证(在Merkle根目录中与operator的其他渠道)。
这种公证给予Plasma Debit硬币支付渠道没有的两个重要功能:
- 可转让性。Plasma Debit币可以从一个所有者转移到另一个。这相当于允许支付渠道中的一个参与者将他们对该支付渠道的兴趣永久地分配给某个新的一方,这对于先前的支付渠道结构是不可能的。最重要的是,这允许新方加入支付网络而无需进行链上交易(这是Lightning Network的一个缺点)。
- 原子性。Plasma Debit币可以与同一Plasma链上的其他硬币原子地更新,而无需HTLC(围绕数据可用性存在类似边缘退出的边缘情况,这使得这比起初看起来略胜一筹,但它仍然具有潜在的强大功能)。
通常情况下,挑战退出方式与Plasma Cash是一致的。这些挑战确保撤销token的人实际上是token的所有者。但是如果用户在已经花费了一半的时候尝试撤销整个token的时候,Plasma Debit通过添加一个阻止退出的挑战来解决这个问题。
正如我们之前提到的,用户需要与operator建立付款渠道才能收款。operator可能会提前创建许多可以转移给新用户的渠道。这些渠道中的每一个都要求operator锁定一些资金。根据网络的大小,它可能会锁定很多资金!对于交叉货币支付,Plasma Debit并不比Plasma Cash好多少,目前没有任何更好的方案。
总结
公链(如Ethereum/Spectrum等)有其安全的特点,然而其实现共识的速度较慢。侧链协议则是一种跨区块链的解决方案,通过实现这种解决方案,可以使数字资产从一个区块链向另一个的转移。通过主链扩容,可以在保证安全的前提下,直接增加区块来实现,但是主链扩容对于节点服务器的性能要求过高,增加了小矿工搭建节点的成本,不利于信息的同步。而Plasma作为一种侧链扩容方案,它不需要修改主链的底层,可以实现较高的链下TPS。基于Plasma框架,构建了一些Plasma应用,如Plasma MVP、Plasma Cash和Plasma Debit等,它们各自都有优缺点。
Plasma MVP使用Fungible Tokens(FT)简化Plasma的实现,通过初始的单个operator负责子链的共识。然而其缺点是token保存在池中,以便所有的用户必须观察并验证整个区块链以防止攻击,对用户节点的计算和存储要求很高。同时,operator可能是恶意的,需要观察者挑战错误行为。当用户提交交易时,交易可能包含,也可能不包含在子链中,解决的方法是使用确认,这是一个非常复杂的额外步骤。
Plasma Cash更改Plasma MVP以使用Non-Fungible token(NFT)。当用户存款时,她的代币被保存为与该用户相关联的离散单元(NFT)。这减少了计算负荷,因为每个用户不需要验证整个链,只需要用户感兴趣的Token。缺点是Non-Fungible-Token不适合某些应用程序。
More Viable Plasma使用户创建交易并且不知道该交易(输出)是否包含在块中时,仍然可以退回到退出输入。然而,对于每个块,如果用户(有一些NFT)没有花费NFT,那么用户将获得排除证明以表明她没有花费NFT。这在计算上的工作量较少(与以太坊相比),因此效率更高。当用户想要花费NFT时,她只需提供排除证明即可证明她是合法的所有者。但是,子块链中的每个块都需要此排除证明,这使得它仍然很昂贵。
Plasma Debit允许从非Fungible转换为Fungible Token。在用户和operator之间建立的闪电型状态通道来传输Fungible-Tokens。缺点是必须以某种方式激励operator为希望接收token的每个用户建立一个通道。
未来,Plasma作为一种框架,其应用会更多,其生态必将越来越成熟。