序言
如果我们仔细回顾一下今年区块链技术的进展,就会发现各种有新的想法的公链团队越来越少出现了,大家谈论以及关注的点也都不那么聚焦在公链上了。反倒是很多新的 Layer 2 项目在不断涌现,非常活跃。
要知道在这之前,尤其是 2017 年,大家无人不谈公链,无人不做公链,各种 ICO 的项目宛如烈火烹油,火的一塌糊涂。
为什么会有这样的思潮转变呢?
这里还是需要提到不可能三角问题
2017 的很多区块链团队都是野心勃勃,说要颠覆比特币,颠覆以太坊,各种区块链 3.0,甚至是区块链 4.0。比特币和以太坊所为人所诟病的 TPS ,也成了区块链团队攻击并且用来给自己 PR 的材料,很多宣称有百万 TPS 的项目诞生。
而经过一年的发展,大家发现要纯靠一套算法和共识来解决区块链的不可能三角问题是不现实的,因为如果你要保证系统的去中心化和安全性,每一笔交易必须由网络中每个节点进行处理,而这样就注定了它的性能肯定是达不到我们要求的。
于是大家的关注点开始转变,越来越多人开始关注第一层的扩容方案。以太坊生态其实一直在研究相关的扩容方案,只是大家在做公链遇到瓶颈的时候,很多人才反过来关注这些东西。
让每个节点做更多的工作量?
公链吞吐量的根本限制来自于它不能高于我们对单个节点所要求的交易吞吐量,由此突破的方向我们可以想到,是不是能够让每一个节点做更多的工作?
我们确实可以让每个节点做更多的工作,比方说把扩大区块大小扩大四倍,这个意味着每一个节点的工作量是之前的四倍,但是这样它就提高了加入门槛和牺牲了部分去中心化。
因为扩容之后,节点做的工作多了,计算量也需要扩展,这样会把一批算力小的机器给淘汰,会导致算力变的更中心化。
而且说实话,这种扩容方式对提升到我们需要的区块链性能还差的远。
那么现在的问题是,我们怎么在不增加单个节点工作量的情况下做更多有用的事情?
每个节点不需要处理每个操作?
在我们惯常的思维中,每一个节点是需要并行处理每一个交易的,那么如果每一个节点不需要处理每一个操作呢?
设想一下,网络分成了两个部分,每个部分可以半独立运作。A 部分处理一批交易,B 部分处理一批交易,A 和 B 之间彼此独立,目前的交易限制就变成了两个节点同时处理的交易总量,区块链的吞吐量是翻倍的。
而如果我们把区块链分成很多部分,尽可能的细分,我们就可以成倍的增加区块链的 Tps。
这就是我们俗称的分片技术( Sharding )
区块链被分成不同的部分,称为碎片,每个部分都可以单独处理交易,这个技术通常被称为第一层的扩展方案,它是在以太坊本身的基础协议中实现的。
分片从设想上来说是一个非常棒的想法,但是在技术实现上,还是遇到了很多挑战和问题。
从现有的容量挤出更多有用的业务?
我们如果从相反的方向考虑,我们并不增加区块链本身的容量,但是我们用已有的容量做更多的事情呢?
这个很自然联想到的是压缩计算。
目前区块链上绝大多数的共识的达成其实并不需要经过所有节点的确认,有些东西只发生在你我之间,我们两者之间清楚就好。
那么我们可不可以考虑把这些东西放在链外去做,最后底层担任一个 Crypto Court 的角色呢?这样可以兼顾去中心化、安全性和性能。
我觉得是完全可以的,而且我认为这个才是正确的一个方向
这就是我们接下来要着重讲述的「链下」技术,它们包括状态通道、Plasma、Truebit 等,它们也叫做第二层解决方案,简称 Layer 2。
状态通道(State Channel)
我们先来谈谈状态通道,举一个例子方便大家理解。
Alice 和 Bob 一起玩一个划拳游戏。
Alice 赢了可以从 Bob 那里得到 1 块钱,而如果 Alice 输了需要给 Bob 1 块钱,反之亦然。
如果这个游戏是在以太坊主链上运行,我们通常的方法是 Alice 和 Bob 一起创建一个智能合约,每当划拳游戏开始的时候,他们向智能合约发起一个交易,当其中一个玩家赢了的时候,智能合约会执行规则付给赢家 1 块钱。
这个很清晰,也很简单,但是在以太坊上还是效率太低了。因为这个只局限 Alice 和 Bob 之间的交易需要整个以太坊来处理。
而且每次玩家需要操作的时候,都必须支付 Gas 费用,他们必须等待几个块之后才能开始行动,这个对于来玩游戏是很不友好的。
那么我们在这里可以不可以设计出一种系统,尽可能的减少 Alice 和 Bob 在链上的操作?
是可以的。
Alice 和 Bob 能在链下更新游戏的状态,同时有必要可以恢复到以太坊主链的状态的这种系统,就叫做状态通道,它实现的过程可以概括为以下几个步骤。
- 打开状态通道
- 质押资产
- 建立一个去中心化的制衡机制
- 在链下发送交易
- 对状态签名并发送
- 双方确认状态的改变
- 关闭状态通道
具体的过程如下:
首先,我们在以太坊上创建一个智能合约,这个是一个类似法官的角色,Alice 和 Bob 为两个参与游戏的玩家。
然后 Alice 和 Bob 开始玩游戏。
Alice 创建并签署了一个描述她第一次操作的交易,并且把这个交易发给了 Bob,Bob 签了名之后,把签名版本发了回去,并且自己保留了一个副本,然后 Bob 创建并签署了他第一次操作的交易,把这个发送给了 Alice ,Alice 也对交易进行了签名,再发回去,并且为自己保留了一个副本。
每次他们都能更新当前的游戏状态,每个交易包含一个声明,这意味着后面的交易总是能知道每个操作发生的顺序。
这个其实暂时还没有任何事情发生在链上,他们只是在网站上互相发送交易,没有任何东西传到区块链上。但是所有的游戏交易都能发送到智能合约上,它们都是有效的区块链交易。
我们可以把这个看成是两个人互相写在一系列区块链认证的支票,实际上没有钱存入银行或者取出,但每个人都有一堆可以随时存入的支票。
当 Alice 和 Bob 结束游戏之后,他们需要向法官提交最终的状态来关闭这个通道,这样只付一笔交易的费用。
假设最后划拳游戏经过了很多轮,Alice 合计赢了 5 局,那么 Bob 要给 Alice 5块钱。法官合约保证这个最终的状态是双方都签过名的,经过一段时间挑战期之后,确保没有人能够合法的修改这个结果,合约就会向 Alice 付 5 块钱。
而需要「挑战期」的原因是防止玩家作恶。
如果 Bob 发送给法官的是更早的状态,没有发送最终的真实状态,由于法官只是一个智能合约,它是无法知晓这个是不是最新的状态的,那么 Alice 的资产就会受到损失。
所以我们有挑战期,让 Alice 有向法官合约证明 Bob 游戏状态作恶的机会。
比方说,如果 Bob 发送的是更早的状态,那么 Alice 是保留过这个状态的副本的,她可以把这个状态提交给法官合约。法官合约通过查看声明就能判断 Alice 发送的状态是最新的,拒绝 Bob ,并且罚没掉 Bob 的押金。
再举个例子,不是很精确,但是方便大家简单的理解状态通道在做什么。
我们去赌场赌博,都要把现金换成筹码,而赌场不管你在赌场游戏过程发生了什么,他们只看你结束游戏时候的筹码。
而每一次游戏结束你都可以离开赌场,你可以把你当时你的筹码给到赌场官方,他们会把相应的筹码兑换成现金给你。
就好比我们在状态通道进行的交易是可以即使终结的
中间有很多不一样的东西,例如在赌场是你一个人在执行,而状态通道需要两个人甚至是多人等等,而且中间有很多博弈过程,我们不做详细比较,我只是想通过这个例子给大家描述清楚状态通道大致在做什么。
而通过描述过程,我们可以发现状态通道有以下几个特点。
优点
- 状态通道具有良好的隐私性
不管在状态通道上发生了多少的瞬时交易,这些交易都是在通道内部发生的,并没有广播和记录在链上,其他人不会知道,所以具有非常好的隐私性。
- 即时终结性
只要状态双方都签署了状态更新,这个状态就可以被认为是最终状态,大家可以随时退出。
- 适合长时间多状态更新
状态通道特别适合那些需要长时间里交换许多状态更新的参与者,因为在部署合约的时候,创建的状态通道有一个初始成本,而一旦部署完毕,状态通道的边际成本就接近于零。
缺点
- 每打开和关闭一个状态通道都需要一个链上交易
打开状态通道如果只给发 1 笔交易,这样会很不合算,因为还需要在链上做其他的两笔交易,它不适合低频操作。
- 状态通道的参与者要保持随时在线
由于挑战期的存在,状态通道的参与者需要一直在线,如果不在线,资产就有可能损失掉,我们平常用 imToken 做转账,等待几个区块的确认就好了,需要一直在线对于参与者来说确实是一件很不友好的事情。
- 比较适合具有一组确定参与者的应用程序
因为状态通道的法官合约始终需要知道作为通道的一部分的实体(地址),当我们需要添加和删除成员的时候,每次都需要更改合约,重新建一条通道,这个也是很麻烦的一个点。
接下来我们讲讲通过状态通道实现的项目,帮助大家来理解其应用。
闪电网络( Lighting network )
这个是比特币网络的微支付通道,已经做了很多年了,但是由于比特币本身对于脚本和智能合约的支持非常的差,它的解锁和锁定的流程设计的非常的复杂,所以这个项目一直发展很缓慢。
雷电网络( Radien Network )
这个是以太坊上的微支付通道,叫做雷电网络,和闪电网络类似。由于以太坊支持智能合约,所以它比闪电网络要简单很多,发展也快很多。
雷电网络借鉴了闪电网络的技术理念,关键技术也和闪电网络一致,包括 RSMC、HTLC 等技术。
它们出众的地方在于,你不必与每个想要与之交易的特定人员都开通一个状态通道,你可以打开一个连接着更大的状态通道网络的通道,这样的话你可以向任何连接在这个状态通道网络上的人付款,并且不需与额外的费用。
参与者越多,网络处理转账能力越高。但是在网络建立初期,由于支付通道很少,所以需要有人多主动建立中介点,才能让整个网络更有价值。
Sprites
它引入了经济模型,给保持状态通道的用户提供经济激励,以使他们能够保持状态通道。
A 和 B 交易、B 和 C 交易时需要创立状态通道,它们交易完之后都会把状态通道关掉,而当下次 A 和 C 需要交易的时候,还需要另外建立状态通道。
如果我们能通过经济激励的模式把 A 和 B、B 和 C 之间的状态通道给保持住,那么下次 A 和 C 交易,就可以以 A 和 B、B 和 C 的状态通道作为跳板,进项交互。那么它们就不需要再建了。
这就是 Sprites 在做的事情 ,提供了经济激励鼓励大家维护状态通道,让其能够帮别人去做交互。
Counterfactual
它做的事情是 Generalize State Channel。
我们之前提的都是 Payment 的状态通道,如果是一个基于游戏的状态通道,像下五子棋、卡牌,它的退出的时候,法官的智能合约相对会写的很复杂,工程实现方面更难。
而 Counterfactual 做的就是把法官这一层给 Generalize 了,只要你做完一次状态通道的 Open,它就可以适应于各种应用,各种退出的方式。它抽象化了状态通道的打开和退出机制,通过通用模块化的实现,允许大家更方便的使用状态通道。
Liquidity Network
Liquidity Network 旨在解决以太坊支付速度的问题,它相对于闪电网络和雷电网络做了很多优化。
雷电网络是两方之间的一个单向通道交易。而 Liquidity Network 采用了 Hub 的网络拓扑结构,用户可以加入到任意一个 Hub 中,通过 Hub 与其它用户进行交易和支付转账,实现了多方之间的双向通道交易。
在之前的状态方案当中,如果 A 要发给 C,他们之间没有建立通道,但 A 和B、B 和 C 都有建立通道,那 A 可以付费给 B 来「借道」完成与 C 的交易,如果中间环节过多的话,“借道费”都也是一笔不小的开支。而由于 Liquidity Network 采用了 Hub 的结构,所以 A 如果要发给 C,就不再需要通过 B 了,也就不存在「借道费」的概念了。
而且在 Liquidity 里面,利用 REVIVE 的押金再平衡算法,解决了雷电网络通道之间资金独立,不能自动平衡的问题。
比方说在雷电网络中,如果 A 给 B 发交易,然后 B 给 C 发交易,假设 B 的余额是 0,那么 A 发给 B 之后,B 不能直接发交易给 C,它必须跟 C 建立支付通道,并且充值足够的钱(大于交易金额),才能和 C 交易,显得很麻烦。
而 Liquidity 通过 REVIVE 技术可以直接让 B 和 A 交易完之后,立即和 C 交易 ,大大增加了交易的效率。
FunFair
FunFair 是一个由以太坊智能合约支持的去中心化游戏平台,其通过一对一的状态通道( Fate Channel )建立了一个 P2P 的赌场,旨在实现在线区块链博弈的公平公正,解决「赌场」游戏高费用和低信任度的问题。
SpankChain
SpankChain 是一个基于以太坊的,成人娱乐平台,其现有产品包括 Vynos,一种点对点微支付处理钱包,它已经为成人参与者建立了单向支付通道( 其 ICO 的时候使用的就是状态通道)
Plasma
Plasma 是一个链下交易的技术,由 Vitalik Buterin 和 Joseph Poon 在2017 年 提出,它相当于贡献了一条子链,可以让你在主链上质押资产,然后在子链上产生资产,而且它提供一个服务器,不需要点对点的交互,在服务器上就可以进行交互。
Plasma 子链可以更快地操作,且交易费用更低,因为它的操作不需要在整个以太坊区块链存留副本
它的基本流程和状态流程也比较相似。
主链上抵押资产
在子链上交易
提现退出
不过状态通道更多的是针对你想交易的那几个点,是两个人之间的交互,而它想要在一个大的库里面进行复杂的操作是一个很困难的事情。而 Plasma 可以在子链上进行各种形式的交易,调动智能合约,转账给多个人等等,非常灵活,不像 State Channel 一样,只有打开通道的人能用,任何人都可以随时进来。
Plasma 是一个大的框架,细分有好几种不同的实现方式。
首先,让我来详细介绍一下整个过程,来帮助你理解 Plasma 的整个框架,如下图所示。
我们在以太坊上创建一套智能合约,作为 Plasma 的 Root Chain,而 Root Chain 包含了子链的状态交易规则,记录子链的哈希值,并且其作为一个桥梁,让用户在以太坊主链和子链之间转移资产。
然后我们创建子链,子链可以拥有它们自己的共识算法,假设这里我们使用 POA ( Proof of authority )共识机制。
这个是一个依赖可信区块生产者的共识机制,每个验证者都必须都是通过身份验证的可信人,打个简单的比方,以前交易需要一群互不认识的人来比拼算力,艰难计算一道复杂的数学题,但是现在我们有一个可信的人做担保,所以便可以快速通过交易,要是这个人使坏,其他的人可以把他踢出网络。
假设游戏公司是唯一一个创建区块的实体,这个实体运行着几个节点,而这些节点被当作子链的块生产者。
而子链一旦创建开始工作,块生产者将定期向根合同做出声明,这个将被记录在 Plasma 的链上,作为子链发生计算的证据。
而用户要玩游戏的时候,他们得先在主链上抵押资产获得在子链上的资产,然后在子链上交互。
因为不需要与主链交互,而且只有少数几个节点必须处理交易,所以交易费会很低,而且操作会很快。
我们结束游戏之后,可以选择提现退出。
下面我将通过几个问题,帮你更加深入理解 Plasma 的细节,包括周期性提交和安全退出机制。
当你在子链上宣布要退出,你有 100 个以太要提现时,由于主链不一定知道子链的情况,它是不能相信你拥有这笔资产的。
此时你就得提交证明,像默克尔树证明,而默克尔树证明是要证明到一个默克尔树的根哈希的,你也得证明你上传的根哈希是真实的。
这个就要求 Plasma 的子链周期性的把它的状态(默克尔数的根哈希) Commit 到主链上,让主链清楚子链根哈希的状态。这就是周期性提交
不过这样会存在问题
如果记账节点放出来的信息是假的呢,他提交的根哈希和这条链实际产生的根哈希是不对应的,因为主链其实也不清楚,这个时候怎么办?
我们就需要提供一个数学证明,证明它在同一个区块高度签名的数据都是一样的,比方说 Validator 如果在这个区块高度发出的信息是 A ,而 Commit 到主链上的区块信息是 B ,我能通过这种数学形式发现记账节点是作恶了的,这样就可以罚没它主链上的押金。
但是如果子链压根就不公布区块信息,这样就没有作恶证明提交到主链上,这个时候怎么办?
这个时候 Plasma 提供了一种 Safe Exit 的机制。
每一个在子链上的节点,如果意识到子链有可能作恶,而且他自己没办法证明子链作恶的时候,这个机制能够允许参与者退出。参与者提交他最后的一个的可信证明,有多少余额,就把这个余额提现到主链上,保证资金的安全
这个是 Plasma 的核心理念,Plasma 不会为了速度牺牲安全。你可以在子链上自由交易,并且在子链作恶之前,把币提走。
MVP ( MInimal Viable Plasma )
这个是 Plasma 最早的实现,它采了取一条 UTXO-Based 的链作为子链,由于它需要子链不是概率确认的链,所以它一般采用的是 PoA 共识算法(或者 BFT)
所有的 Plasma 的核心都是在退出和挑战的机制上,我们这里也着重强调一下它的退出和挑战机制。。
我们从图可以很清楚的看到,用户在主链上抵押了 Fungible Token 之后,在子链上获得了未花费的 UTXO。
假设这个用户花费掉了这笔 UTXO,分成了四笔输出,然后决定要退出,要把这个钱提交到主链上,发起了一个 Start Exit。 同时他提交我拥有这个 UTXO 的证明,这个证明在默克尔树的根哈希中,这个是由记账节点定期的 Commit 到主链上的。这两个数值就可以证明这个用户拥有这个 UTXO。
但是这样就需要一个 Challenge 的过程,因为用户提交的证明只能保证他在当前的区块是拥有这个 UTXO 的,它并不能保证用户之后不会花费这个 UTXO。
所以这里有一个比较长的挑战期( Challenge Period),即一定的出块时间,让别人去提交他作恶的证明 。
假设用户在发起提现之后又给一个人转了一笔账,那么挑战者是可以将这个转账交易记录和这个默克尔树哈希发送到主链上来证明用户 Exit 是无效的,以此来罚没用户在主链上的押金,这个时候挑战者就可以拿到这笔押金。
这里我们细化谈谈它的作恶和退出机制。
如果现在有一个密码学证明,证明这个东西属于张三。因为这个交易打包在区块里,这个区块的默克尔树哈希放在这个主链上。
但是如果一条线都是作恶的,出块节点是作恶的,出块节点做一个假的交易,做了一个假的区块和一个假的默克尔树哈希,放到了根链上,这个时候根链实际是无法判断的,如果我不把这个区块公布出来,它是不知道我作恶的证据的。
这个时候用户如果需要退出,怎么才能保证用户能够正常退出呢?
假设我作为一个作恶节点,知道你们要退出,我可以先生成一批金额特别大的交易,优先你们退出,假设你要提现 100 个以太,我就可以伪造一个 101 以太的提现交易,这个等于说拿着你的钱就跑了。
因此 MVP 设置了一个优先级的设计。每一笔进入 Plasma 的交易都会有一个优先的序号,高位是区块高度,然后是交易在区块里面的次序和这个 Output UTXO 在这个交易中的次序。这样就形成了一个全局唯一的序号,所有人按照这个序号退出。
如果某一个时刻大家开始发现节点开始作恶,要退出,一定是早期交易的区块先退出,后期作恶的区块后退出,我作恶区块的意义不大。
但是这里还有一种作恶的方法。
如果诚实的交易被矿工打包到了作恶交易的后面,因为矿工是可以选择打包次序的。在这个错误的块里面,诚实的交易打包到错误的交易后面,导致诚实交易的退出优先级低于作恶交易的优先级。
1 个大户把 1000 个以太打入到 Plasma 链上,作恶矿工在存入的这个区块里优先造了一个假交易,然后放到区块里面,先把 1000个 以太提走了,大户是没有办法的
这里的解决办法是对每个存款( Deposit )都做二次确认,第一次是存进去,确认这笔交易被打包在 Plasma 的区块里,第二次是在用户把币存进去,确认存进去的区块以及之前的区块都是真实、合法的情况下,再发一笔交易,去确认这个交易是正确的。
在做了两次确认,证明交易都是真实之后,用户再去退出就能够安全退出了。
More Viable PlasmA
不过 MVP 每一笔存储交易多了一次签名之后,对系统来说还是开销很大的,所以有人提出了 More Viable Plasma。
它退出的次序不是以打包的次序为准,而是以退出的时候提交的 UTXO 的证据,UTXO 输入最早的一个 Input( Input 可能有四五个),哪个早就哪个先退出。
这个的好处在于,早的 Input 一定是已经被打包到交易区块里面了,如果这个 Input 是假的,那么在 Input 发生的那一刻就已经有人开始做退出了,这个是不可能的。
因此这个时候我可以假设这个 Input 是真实的,越早的 Input 它的真实性就越高,我退出的时候就按照 Youngest 的 Input 退出,它的保障性最高, 这个是 More VP。
Plasma Cash
Plasma 还有一个实现叫做 Plasma Cash。
MVP 的缺点是,每一个人,不光是矿工,都要时刻紧盯着这条链,如果有人作恶,就赶紧退出。
而且一旦出现问题,退出还需要提供相应的数学证明。数学证明还得从本地同步的区块中获取,因为别人同步的可能都是假的,这就要求你还要同步区块。
这一系列的过程对用户是很不友好的。
这个时候有人就提出了 Plasma Cash,它最大的特点是用户只需要关注自己的数据就好了。
它采用的是 Non-Fungible Token 的存储机制,它的 Deposit 进来之后是不分割的,每一笔存款,比方说 1号是 10 个以太,2 号是一只猫,它们被打包成一个 Non-Fungible Token 放进来,系统给每一个打包的包裹一个序号,如图所示,这个系统现在是有八个存款,每一个存款都是一个包裹。
假设三号包裹原来的持有人是 A,他把这个包裹转给了 B,在这个区块里,它就包含了一个 A 到 B 的交易来指向三号包裹,六号包裹是 D 到 B,把所有权转向了 B,剩下的包裹没有动作。
而用户只需要关心和自己有关的数据,像图中的 A ,他只需要关注 3 号和 5 号包裹,不需要关注其他人,因为所有人的钱是自成体系的,不是像 Fungible Token 捆在一起的,所以像 6、7、8 该退就退,因为不是 A 的东西。
不过这里有一个问题,比如说 Bob 拥有 7 号包裹,要转给 A,但是由于 A之前没有和 7 号包裹交易,他只关注自己,他是不了解 7 的历史的,所以Bob 给 A 转账的时候其实 A 是不确定对方是否拥有 7 号包裹的所有权的。
而 Bob 要证明拥有 7 号包裹的所有权,就必须把 7 号资产从创生到现在所有的资产、每一个默克尔树和默克尔树哈希都给 A,来证明这个块是真实属于 Bob 的。
所以 Plasma Cash 转账的时候数据量是很大的。
Plasma Cash 要求退出的时候,需要把最后关于这个 Token 的两笔交易上传,比方说 A 转给 B,B转给 G,而G要退出,那么 G 就把这两笔交易提交到子链上退出,退出其实不复杂,复杂的是 Challenge,其 Challenge 主要有三种。
- 假设 A 退出之后又花费了资产
A 提出申请之后又把这个钱转给了别人,这个时候 Challenger 可以把这个这个交易提交给主链,让 A 退出失败
- 双花交易
A 和矿工串通同时转给 G 和 F,Challenger 可以采取和 1 相同的方式,让 A 失败。
- 历史的证明
因为退出的时候只提供最后的两笔交易,而它们可能都是假的,这个时候 Challenger 可以任意指定一个块,要求对方证明是怎么到这个状态的,以保证系统安全性。
Plasma Cash 的挑战很复杂,转账证明也很复杂,优点是无需关心别人的状态,只需要关心自己。
Plasma Debt
Plasma Debt 和 Plasma Cash 比较像,转账、证明和挑战都很类似,其区别是 Plasma Cash 里每一个包是一个 Non—Fungible 的资产,而在 Debt 里每一个包是一个状态通道,这意味着和状态通道的交互可以不按整个包来交互。
比如说我有 100 个以太,在 Plasma Cash 中,这 100 个以太我只能一起转给张三或者一起转给李四,但是在 Debt 里面,这100个以太,我可以转一部分给张三,转一部分给李四,不用全转。
每一个 Token 都是使用者和 Plasma 链的运营者的一个小型状态通道,这个状态通道也可以按照 Plasma Cash 的方式进行流转,这样可以让用户可以不需要把资产当成 Non-Fungible Token,还可以进行比较高效的运转。
不过状态通道按照 Cash 方式进行流转还是会和 Cash 面临一样的问题,转账证明很复杂,因为它依旧需要所有的历史交易。
Plasma Leap
Plasma Leap 是在 MVP 的基础上做的,MVP 是一个类似比特币的一个 UXTO 链,在比特币里面是有一个解锁脚本来做智能合约的,Plasma Leap 就把这种类似比特币的智能合约的理念带到了 Plasma 里,引入了 P2SH 加锁脚本,对于存储结构进行了提升。
在每一个交易里面是可以加一个 EVM 的二进制代码作解锁脚本的,这个代码是对应一个智能合约,由智能合约来进行解锁。
不过这个智能合约不像以太坊上的智能合约,那么完整完善,它做的事情很简单,就是证明用户能不能花费这个 UTXO,就像比特币一样,用户能不能花费它,什么时候花费它,它不能做更复杂的智能合约。
链下计算( Off Chain Computation )
以太坊声称要做计算机,EOS 要做全球操作系统,但无论是做计算机还是做操作系统都得正视计算这个问题,链上计算的开销是非常大的,链上每一个 EVM 的 Code 计算需要全球计算机都算一遍,才能得出结果,所以有人做了这么一个计算的扩展,在链外做 Computation。
这个方式大致有两种
TEE( Trusted Execution Environment )
第一种是在可信的执行的环境中,把这个计算算出来,然后传到链上去,再加上可信环境的一个证明。
这个证明不是计算结果的对和错,而是证明这个计算是在安全的环境里运行的。
可信的执行环境在工业界相对来说还是比较成熟,ARM 芯片是支持 TrustZone 方案的,我们用的苹果和安卓手机的指纹,它的秘钥信息都是存在 TrustZone 里面的。
它的优缺点通过介绍其实也比较清楚了。
s
优点
- 隐私性很强,因为所有东西都是在黑箱子里面的。
- 性能也非常的高,单个机器执行即可,因为我信任的不是这台机器,而是这个 Trust Zone。
- 功能非常的灵活,不像 Plasma 比较单一,它可以做各种各样的东西甚至是远超过 EVM 的东西,因为 EVM 里面做一些加密运算是很难的
缺点
黑箱计算引入了未知的风险
依赖于硬件限制了它的扩展性,因为不可能每个人都有一个符合硬件要求的设备来运行这套系统。
系统的安全性是依赖于厂商的,厂商是可以在 Trustware 里面做任何的事情,这个也引入了风险.
所以这种依赖于安全执行环境的 Layer 2 方案一般是由联盟链或者是企业内部的链来使用的。
Truebit
第二种叫 Trurbit,它解决的也是链外运算的问题,这个项目很有趣。
这里面有好几个角色,包括用户、Solver 和 Challenger。
第一个是计算需求的提出者(用户),这个计算需求是用 Truebit 的 VM 来描述的,在实际操作的时候,Truebit 的 VM 是用 Rust 实现的
用户可以选择悬赏的方式找人来帮他做运算,运算的执行人叫做 Solver。
Solver 把每一步的运算状态都算成一个哈希折叠到默克尔树里面,在最后,Solver 把所有运算结果的默克尔树的根哈希,以及运算的最终结果提交到区块链上。
而 Challenger 需要自己算一遍生成结果,如果他发现算的结果和 Sovler 算的不一样,他就能根据错误信息找到哪一步或者是哪几步错了。Challenger 就能把这个状态和状态运行的指针上传到区块链上,挑战这个 Solver。
因为 Truebit 在链上拥有指令集,而且 State 可以证明它在原来的默克尔树里面,于是链可以计算这个 State 加指令得到一个新的 State,通过这个链可以开始判断,这个 State 是 Solver 生成的 State 还是 Challenger 生成的 State,谁对谁错。
Truebit 只需要链上的一步运算,就能够证明所有运算是正确的还是错误的,它能把普通运算折叠成了最关键的计算,交给主链去运算,验证。
链间通信( Interoperation )
跨链通信是一个跨链的技术,它和 Plasma 不一样,两条链之间没有特别强的主次关系,其子链和侧链仍然有权利自己产生资产,自己运行,然后通过某种协议和主链或者其他链进行跨链交互,大家进行数据互通。
它严格来说不是 Layer 1 的 Layer 2,但是它对整个系统 Scability 的提升是很有好处的。
接下来我简单介绍两个项目,方便大家来理解。
Cosmos
Cosmos 的系统架构如图所示,它中间有一个 Cosmos Hub,周围的叫做 Zone,可以认为中间是一个交换链,周围其他是子链。
Zone 是用 Tendermint 来做的,采用的是 BFT 共识以及区块链框架,它也满足 Instant Finality(即时终结性),如果系统是少于三分之一的作恶节点,它一定是正确的。
它引入了链间通讯协议( Inter-Blockchain Communication ,简称 IBC) ,这个是类似 Plasma 和 State Channel 的一个协议。
它的简单流程如下,A、B链都是 Zone。
- 用户在 A 链上锁了 10 个币
- A 链10 个币被锁住的密码学证明被提交到了 B 链上
- 如果被 2/3 的验证者验证通过,则它是有效的。
- B 链上将会产生 10个币
而之所以需要 Cosmos Hub 的原因是它能够把 Zone 相互建立的IBC 的数量从 N^2 变成 N,不过这个也是有前提的,即所有的 Zone 必须是 Instant Finality,你给我一个证据,我就认为你的币就锁在那里,拿不出来了,它不能是概率确认的,不能这里生成,那里又推翻了。
但是由于比特币和以太坊是概率确认的链,如果这样 Cosmos 就连接不到它们上面了,所以它做一个Peg Zone,这是一个代理链,给概率确认的链做了一个代理,这样 Cosmos 就能和它们交互了。
Polkadot
相对 Cosmos 来说 ,Polkadot 是非常完善的项目,但它的架构和 Cosmos 几乎是一致的。
它的中间叫做 Relay Chain ,是 Cosmos 中 Hub 的角色,周围的 Para Chain 是 Cosmos 中 Zone 的角色。
Para Chain 用的是 Parity Substrate 这么一个框架,这个链是基于 BFT 的,所以也是 Instant Finality,而这样同样会遇到连接概率确认的区块链的问题,所以它提了一个 Bridge Chain 这样的概念,这个和 Cosmos 的 Peg Zone 是一样的。
但是 Polkadot 的 Parity Substrate 相对 Cosmos 的 Tendermint 是做的是比较完善的。
Polkadot 的创始人用 Rust 实现的 VM 以及 BFT 做了一个升级,增加了随机选举验证节点的方式加速了共识协议,所以它的速度会非常快,而且它部署智能合约以及升级节点的能力也很强。而且 Substrate 上引入了相对其他链更完善的治理机制。
现在我们重点来说说它的安全机制,这个是和 Cosmos 区别非常大的。
它提了一个概念叫做共享安全池( Shared Pool Security ),在 Polkadot 里面,它的记账节点和出块节点是混在一起的。
其中有几个角色, Collator、Validator、Fisherman 、高阶Validator、 Nominator。
其中 Collator 是做区块的打包和收集和交易的验证,但是它没有权利把这个区块给确认,即他不能把区块写到区块链里面,而把区块写到区块链里是 Validator 来做的。
Collator 是针对每一条链的,每条 Para Chain 都有一组有相对应的 Collator,但是 Validator 是整个全网公用,是随机选出来的。
假设 PareChain 有一组 Collator 生成了一个区块,这个区块由哪些 Validator来验证我们并不清楚,它是随机选的,而选出的 Validator 将会投票看区块是否合法,只有合法才能写到这个子链的区块链里面。
而 Fisher Man 是用来监督 Validator的,那些经得起考验的 Validator,可以变成一个更高阶的 Validator,高阶的 Validator 可以判断这个 Fisherman 的监督是正确还是错误,比方说 Fisherman 举报这个 Validator 作恶,之后高阶 Validator 会判断它是不是真的作恶了。
高阶 Validator 的选举需要满足两个要求,一方面 Fisher Man 没有举报过低阶 Validator ,另外一方面 Nominator 会来提名谁能来当高阶的 Validator,这是一个互相制衡的结果。
但是它是怎么制衡,它最新的设计里面还没有公开,它只是大致实现了这样的一个点。
通过以上,我大致介绍了一些 Layer 2 团队和项目,虽然有的严格意义上来说并不能称作是 Layer 2,但是我也一并列了出来,方便大家理解。
目前的情况就是,公链的创新和热度已经逐渐趋于平缓,各种 Layer 2 的新团队在不断地涌现,我觉得这也是一个正确的趋势,Layer 1 本来就不需做这么多事情,做好去中心化和安全就可以了。
这也是 Nervos 在做的事情,我们认为一个好的 Layer 1 只需要做好 Key State 的存储, Key Computation 以及对 Layer 2 友好就够了。
像 Turebit 只需要链上的一步运算就能够证明所有运算是正确还是错误,和我们认为 Layer 1 需要做好的 Key Computation 是非常一致的,而 State Channel 和 Plasma 中所强调的 State 也和我们的方案很契合。
希望文章对你有所启发,以上。