认真来说,传统的BFT共识机制是一种效率不高的算法,由于每笔交易都要通过所有节点验证,验证结果需要被广播到网络,换句话说,一笔交易要先被广播到网络一次,然后每个节点都要再广播一次,这就导致了一笔交易有O(N^2)的消息复杂度。计算机背景的同学都知道,O(N^2)是一个很低效的方案,直接导致BFT在大于1000个节点之后同步能力明显下降。对于比特币的POW,因为任何矿工节点发现符合当前难度的块之后,把交易打包进块里,向全网(N)广播,然后网络上的所有的全节点验证这个交易的哈希,即可证伪,所以实际上是一种一对多且不需要回复的共识机制,也即O(N)的复杂度。目前共识算法研究的前沿是如何实现O(1)算法,叫做横向扩展(scale-out),也即一笔交易不广播到全网,或者说,有的交易有的节点并不知道,这样就可以解决区块链的可扩展性问题。目前出现在大家视野里的O(1)共识算法有off-chain(链下通道),sharding(分片),DAG(有向无环图),multi-chain(多链)等等,每种算法都有其特点和长处,本文将解读这类横向扩展的解决方案。
链下通道
off-chain这个概念来自比特币社区,2013年12月提出,后来形成了我们熟悉的链下链的一套体系,也即侧链。off-chain的诞生是由于比特币本身或者某一区块链本身的机制存在一些问题。但是直接在比特协议或者比特币链条上进行修改的话,又容易出错。而且比特币区块在一直不断运行,万一出错了涉及的资金量太大了。这个是不被允许的。这种情况下,诞生了侧链。本质上来说,侧链机制,就是一种使货币在两条区块链间移动的机制,它允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。侧链实质上不是特指某个区块链,而是指遵守侧链协议的所有区块链,该名词是相对与比特币(或某宿主链)主链来说的。
针对比特币的侧链项目名叫闪电网络,它的运行机制也比较简单:你是A,要给B发起一笔交易。首先你要创建一个On-Chain交易,在这个交易中,你需要开通了一个A和B之间的支付通道(State channel),而且,你必须要做相应的抵押。比如,A打算给B转100BTC,那么A必须要先抵押最少100BTC,然后才可以转100BTC给B。A抵押后,就可以开始给B转账了。A可以随心所欲的今天给B发1BTC,明天再给B发2BTC,都不打紧的,反正是Off-Chain交易,没有交易费。闪电网络在于给A和B之间提供这种支付通道,即Off-Chain(链外)交易通道。
那么,如果A或B想把BTC余额提出来,并停止和对方的转账交易,怎么办?此时就需要关闭A和B之间的支付通道,并利用闪电网络的一系列协议进行清算了。
假设此前A抵押了100BTC,其中总共给B转了10BTC,那么A的余额为90BTC,B的余额为10BTC。在此过程中,A是无法篡改交易记录的,所以最后A可以转出的数额为90BTC,B可以转出的数额为10BTC。
简单总结一下闪电网络的工作方式:
a.建立支付通道;
b.需要抵押。
建立支付通道,就是普通的链上交易,和正常的链上转账交易一样;抵押则需要两者之间的最终清算金额少于抵押金额,否则,一方完全可以关闭支付通道后跑路。嗯,大体看上去是没问题的,反正不亏就好。
所以闪电网络的适用情况
a.资金频繁往来;
b.双方之间的交易金额小于抵押金额。
例如大交易所之间使用闪电网络就特别合适,资金你来我往的,速度快先不说,光交易费就可以省出一大笔。如果是没什么联系的两个人,要交易的话,就必然会横跨数个不稳定state channel或者要经过一个大的中继者,这个中继者可以是具有公信力的,也可能突然跑路,所以既然这样为什么大家不继续愉快地使用支付宝呢?state channel还有一个问题,刚才说到的保证金,如果持续从一方发送资金到另一方,保证金就会越来越少,最后被迫关闭,这也是一种不稳定因素。
还有一个问题,A在关闭支付通道时,B不在线的话,B可以用A之前的签名数据申请抵押金,以补偿自己的损失。可是如果B不在线,协议就只能要求A在申请关闭支付通道后,允许B先转出余额,然后A再转。这个过程是设置了超时机制的,在这个机制下,假设B突然发生不幸,就无法先转出余额,那么这也意味着A永远都无法转出自己的那部分余额了。
最后,总结一下目前off-chain存在的问题:
a.中继过于中心化问题;
b.在线状态不稳定问题;
c.抵押资产问题。
分片
分片又称Sharding,它首先出现在数据库领域。起初,所有的数据都放在一台服务器上。虽然不同的用户访问的是不同的数据,但是只有一台服务器提供服务,随着用户访问的不断增加,即使这台服务器是超人,在客官的不断所求下,也会累趴下。那么人们想到最容易的改进办法就是:将不同数据放在不同的服务器上,此时,访问不同的数据就会由不同的服务器提供服务,从而突破单节点数据服务器I/O能力限制,系统处理能力得到线性增长。这就是计算机领域里分片的原初概念,是对数据进行分类,将不同类的数据放在不同的服务器,提供并行处理能力,这类分片的学术名称叫做“垂直分片”。
既然有垂直,那可能也有“水平分片”。可以进一步想象,随着访问同一类数据的请求越来越多,单台服务器依然会成为瓶颈,那么可以进一步将数据分为多个部分,分布到多台服务器,这就是水平分片。简而言之,分而治之就是分片的核心思想。
以太坊的分片,简单来说就是将区块链网络划分成若干能够处理交易的较小组件式网络,以实现每秒处理数千笔交易的支付系统。设置一个区块链,在这个区块链系统中有一百个各自不同的宇宙,每一个宇宙都是一个独立的账户空间。使用者可以在某个宇宙中拥有一个账户,该用户发起的交易也只会对交易相关的宇宙产生影响。是不是似曾相识?听上去是不是和侧链很像?是的,如果说侧链是通过“外部嫁接”到主链,那分片就是将主链进行“内部分割”,显然后者的实现难度要比前者复杂的多!也因此很多人都认为V神把事情复杂了……其具体为何要如此实现V神自有他的道理,不在本文讨论,但基本可以确定的是,即使是分片,也会为效率牺牲一定程度的“去中心化”。顺带一提,EOS也有分片,叫Region。
基于分片技术的区块链的实现对公共区块链有着不同的好处。首先,区块链上处理交易的速度变成了每秒上千笔甚至更多,这改变了人们对加密货币作为支付方式效率的看法。改善交易吞吐量将会给去中心化的系统带来使越来越多的用户和应用程序,而这将反过来促进区块链的进一步采用,也使挖矿变得更有利可图,同时也能吸引更多加入到公共网络上的节点,从而形成一个良性循环。
此外,分片技术可以帮助降低交易费用,因为验证单笔交易的处理量减少了;节点可以在依然盈利运营的同时收取较小的费用。在现实世界中,我们将低费用与高交易处理能力结合起来,会使公共链将变得越来越有吸引力。这些积极的趋势所持续的时间越长,我们就会越能看到更多的主流的加密技术和区块链应用程序的出现。
分片的最重要的挑战是创建碎片。开发者需要开发一种机制来确定哪些节点可以按照安全的方式保留在哪些碎片中,这样就能避免那些控制大量特定碎片的人所发起的攻击。打败攻击者的最佳方法(至少在大多数情况下)就是建立随机性。通过利用随机性,网络可以随机抽取节点形成碎片。这样一种随机抽样的方式可以防止恶意节点过度填充单个碎片。
但是,我们如何建立随机性呢?最容易获得公共随机性的来源是区块,例如,交易的Merkle tree root。在区块中所提供的随机性是可被公开验证的,并且可以通过随机提取器中提取统一的随机比特。
然而,简单地使用随机机制将节点分配给碎片仍是不够的。我们还必须要确保网络的一个碎片中不同成员意见的一致性。这可以通过像工作量证明这样的共识协议来实现。分片技术是区块链的一个令人兴奋的技术,它让我们看到了希望,它可以在程度非常小的影响去中心化和透明度的情况下解决扩容问题。然而,毫无疑问的是,分片技术,尤其是状态分片,在设计层面和实现层面都是非常困难的。这也是以太坊一直想走却没有完全走通这条路的原因。