前言:认真来说,传统的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。在区块中所提供的随机性是可被公开验证的,并且可以通过随机提取器中提取统一的随机比特。
然而,简单地使用随机机制将节点分配给碎片仍是不够的。我们还必须要确保网络的一个碎片中不同成员意见的一致性。这可以通过像工作量证明这样的共识协议来实现。分片技术是区块链的一个令人兴奋的技术,它让我们看到了希望,它可以在程度非常小的影响去中心化和透明度的情况下解决扩容问题。然而,毫无疑问的是,分片技术,尤其是状态分片,在设计层面和实现层面都是非常困难的。这也是以太坊一直想走却没有完全走通这条路的原因。
【有向无环图】
DAG 是有向无环图(Directed Acyclic Graph)的缩写,这是一种有顶点和边的图结构。它可以保证从一个顶点沿着若干边前进(有向),但永远不能回到原点(无环)。在IOTA这个项目中,提到的Tangle(缠结)就属于DAG的一种数据结构,真正意义上讲,IOTA已不属于“区块链”,你可以理解为如果比特币、以太坊使用的是底层数据结构是BlockChain,而IOTA的底层数据结构则是DAG,但它依然属于“去中心化”的范畴。
让我们回顾一下这张图:
有向无环图(Tangle)在 IOTA 里发起一笔交易的流程如下:你需要先找到网络里的两笔交易,验证它们的合法性,然后做微量的POW计算,把自己的交易与它们绑定,再广播到网络。你的交易会被后来的交易以相同的方式验证。如果验证你交易的其他交易越多,则你的交易的确定性越高。当达到一个临界值时,就认为这个交易被确定了,这和比特币6个区块确定交易状态的思想一致。简单来说,IOTA是把算力作为交易的一部分。只要你想加入这个网络,那必须先成为Mini版矿工,做出微量的POW贡献,也因此它是去中心化的。DAG的优势可以做到高并发,理论上是无限多的并发,意味着它可以大幅提升交易速度。
有向无环图(Direct Acyclic Graph或DAG)是近些年来区块链项目的技术热点之一。许多业内人士认为,这项技术有可能在根本上解决区块链的扩容问题,因此相关的项目都有较高的热度。然而,由于其更高的技术门槛和开发难度,采用这项技术的区块链项目仍为少数,在国内更是凤毛麟角。
传统的线性架构的区块链,在维持良好的多中心化与安全性的前提下,在底层上的吞吐容量有根本的瓶颈问题。因此这些区块链项目的扩容方案,一种是以牺牲多中心化的记账方式来换取整个链的吞吐容量,一种是依赖侧链、分片等第二层(Layer 2)技术来处理小额交易。要根本性地获得更好的底层链效率,需要采取与完全不同的架构。DAG就是较被看好的潜在挑战者。DAG相对于传统线性区块链的优势是非常明显的,主要在于可延展性和交易吞吐量上。
可延展性:由于采取DAG的数据结构的话,每个节点不需要再等其它节点的数据达到统一就可以处理新的交易,避免了因网络延迟和数据同步造成的时间浪费。因此,参与DAG记账的节点很容易大幅延展。因此,DAG非常适合IoT一类设备非常多且网络状况往往不稳定的应用。相比之下,在线性区块链系统中,节点一旦碰到通信延迟而数据不统一,就无法参与下一次区块的生成,甚至在极端情况下有网络分叉的危险。
交易吞吐量:此外,DAG的尾端可以平行增加任意多的新数据,因此天生具有很强的交易吞吐量。这一点更是完胜线性区块链线性区块链每次只能增加一个区块大小的数据量,所以可以处理的交易量是很难改变的。
DAG的主要安全问题有:
双花:DAG异步处理数据的特征导致攻击者可能利用节点间的信息差进行双花。具体来说,如果两个顶点间没有明确的父子关系,攻击者可以分别在只看到这两个顶点中的一个的不同节点处,对同一笔存款进行双花。这种双花只有在同时看到两个区块的节点处才能被检测到,并且只有在两个顶点重新汇合到一个新顶点时才能最终判定哪一笔是双花。为了防止这种双花的发生,需要额外通过制定更周密的双花检测规则。
影子链攻击:DAG允许多重并行交易的特征,导致攻击者可能暗中生成一条影子链,并且时不时地将影子链跟主链进行对接以逃避检测算法。极端情况下,这条影子链有可能代替主链成为全网的共识。
虽然DAG的缺点明显,但由于DAG高并发、异步的特征,非常适合IoT类应用,许多IoT类项目都会偏爱DAG架构。IOTA就是以处理机器间小额高频交易为应用场景。另一方面,IoT设备一般不具备PoW挖矿所需的算力,因此PoS/DPoS DAG或者BFT DAG更有可能成为未来DAG项目的共识机制。
【多链】
多链,即抛弃了“一链治所有”的传统方案,采用“多链分而治之”的新方案重新设计了一个保障每个合约都能正常运行的公链。这一创新极大程度上简化了架构,降低了数据处理压力,确保一条链上流量激增不会影响到另一条链的效率,在链上进行的任何业务都不会收到其他业务干扰,有效实现了资源隔离。
区块链的互操作性本身就是一些应用的基础需求。想象一个理财应用,用户可以用某项资产交换不同机构的理财产品,不同的资产就需要在多条链上做转移、交换。还有一些ORACLE应用同样需要多链间的跨链喂入交互,譬如汇率牌价、天气、股价、特定指标等等。区块链的某些应用在单链上无法完整实现,需要在多链架构下的可扩展性、隔离性、高性能、互操作等特性的帮助下实现。
在EKT中Token链是一个并行多链的结构,多链多共识,共享用户基础。EKT的token是链上的一个属性,就像使用了utxo模型的链utxo有其他token一样,我们的转账事件也是内置的。
EKT的中心思想是设计一个社区的机制,让开发者可以轻易的开发一个DAPP,其他的交给EKT来处理, EKT 的“一链一主币,多链多共识”的机制为后来的区块链项目开发提供了很大的便利,可以使用于任何区块链适用的应用场景。 EKT 提供了一套底层的区块链机制,其他的区块链项目可以很容易的基于 EKT 的主链代码部署一套自己的主链。在EKT上编写的区块链项目将无需过于担心安全性问题,因为每一个接口都是非常简单并且在许多条并行主链上部署和运行的。部署主链时可以灵活的发行自己主链的代币以及选择共识算法。新部署的主链也可以加入到 EKT 通用积分的整个生态,共享 EKT 生态的用户资源,代币也可以和EKT 主币以及其他主链的代币进行交换和流通。
在EKT中,我们使用公私钥加密和路由策略的机制实现拜占庭容错,EKT主链上每个DPoS节点的公钥都是公开的。这是一种兼顾效率、安全和去中心化的解决方案。Token现在一般被定义成一个智能合约,但如果把它变成一个预先定义好事件的“对象”,这个“对象”可以有自己的参数(比如总量、共识机制等等),则会带来更好的安全体验。接受token的地址可以有两种:普通的用户地址和合约地址,合约地址收到token之后可以执行非图灵完备的合约语言,进行简单的状态计算和token转移。EKT把Token链和DApp链分开,将来在很大程度上能规避之前说到的分片,和offchain遇到的困境。
以上就是我对区块链共识机制的一些思考,和一些在设计EKT的多链多共识时对横向扩展的考虑。欢迎大家提出疑问,共同探讨。
【结语】
以上就是关于可扩展性相关技术的一些简单概括和介绍,实际应用的技术细节和命名方式可能会有很多,但从目前来看,大体都脱离不了off-chain、sharding、DAG、multi-chain四类的范畴。从目前来看,无论何种技术的解决方式都是在从“更高的效率”和“去中心化”二者之间寻找一个平衡,想要效率就要中心化,想要安全就要去中心化,也因此,现有解决方案也都在引发一些“不是去中心化”的质疑声。
其中争论最激烈的就是比特币Core派和BCH派之间,Core派的解决方案是侧链,BCH就抨击侧链最终会沦为中心化的银行。BCH的解决方案是大区块,Core派就抨击BCH本身就是以矿霸为核心的中心化代表。有争论才有突破,意味着问题本身就还没有唯一的答案。这反而证明了我们正处于一个区块链刚刚起步发展的黄金时代,也是区块链现阶段的魅力所在,百家争鸣、各抒己见……投身此间,我倍感庆幸。
公链是区块链发展的前提基础,也是区块链行业未来发展的核心保障。而目前区块链的发展现状是,底层公链的性能尚未发展起来,在其上构建的各类DAPP严重受限于性能,各种共识算法都有不完美之处。无论是O(N^2)的BFT算法还是O(N)的改进算法(包括POW和POS和一些牺牲一定条件的改进BFT算法,scalability都总是存在一个瓶颈上限。我相信,虽然scale-out的off-chain、sharding、DAG、multi-chain都还远说不上完美,但这应该是区块链无限扩展性能的正确方向。
参考阅读:
20161019 论比特币系统的共识规则
20170119 区块链 - 比特币的决共识机制
20170223 区块链共识机制浅谈
20170723 拜占庭容错(BFT)算法介绍
20170821 Is there any link between Bitcoin's PoW and BFT?
20171213 到底什么是分片技术?
20180327 分片技术(sharding)——区块链扩容问题的良方
20180414详解“多链多共识”机制
《BTC whitepaper》
《Ethereum whitepaper》
《EKT whitepaper》
《EOS whitepaper》