必读!未来月薪10万的五大利器(一)

2019-04-28 17:19:04 浏览数 (1)

来源 | 《区块链与产业创新》

作者 | 井底望天、蒋晓军、相里朋

责编 | 乔治

出品 | 区块链大本营(blockchain_camp)

当前,区块链技术已经由1.0版本过渡到2.0版本,并逐步向3.0版本发展。新一代区块链技术发展的主要方向侧重于基础设施建设,即区块链底层技术的研发以及一些具体应用的落地。区块链3.0技术发展的目的在于提高区块链的整体运行性能,包括通过各种方式提高区块链系统的交易容量、交易速度以及系统的可扩展性等。

区块链1.0系统中,以比特币最具有代表性。比特币系统中,每个区块的容量大小是1MB,每10分钟出一个区块,以一个交易0.25KB计算,每秒平均能打包1000/0.25/60/10=6.67个交易。也就是说,以当前比特币区块的大小,每秒只能承载7个交易,即7TPS。作为区块链2.0系统的代表性项目,以太坊目前大概能够支持20TPS。

如果与中心化交易系统的处理能力相比,Paypal的处理能力是每秒100笔的量级,而支付宝在“双十一”时的处理能力达到了每秒10万笔的量级。所以,大众很难想象这样的区块链系统如何能够应对高频次的数据调用和存储。

在提高性能的解决思路方面,社区试图通过区块扩容、隔离见证等一系列技术提升交易处理能力。

区块扩容

对于比特币系统来说,提高系统交易容量的有效方法之一就是区块扩容。但是,区块的容量大小会影响到全网账本同步时间的长短。

以目前比特币系统中单个区块的产生周期为例。新产生的区块在网络中广播完成,需要至少半分钟的时间。半分钟的广播时间,意味着各个验证节点收到该新区块的实际顺序是有先后的。这样的设计在区块容量有限的情况下并没有暴露出潜在的问题。这是因为:

  • 接收到新区块的验证节点先后顺序是随机的;
  • 不同区块之间产生的时间间隔是10分钟,半分钟的延迟可以被整个网络接受。

假设为了系统扩容,将比特币的区块产生间隔改成半分钟,这等同于全网同步所需要的时间。一旦系统将各区块的产生间隔设定为半分钟,对拥有高算力的验证节点而言就占据了极大的主导优势。高算力验证节点可以通过自私挖矿或分叉攻击,威胁到全网的安全性。

此处需要对自私挖矿及分叉攻击做解释,以方便读者更直观地理解上述问题的严重性。通常意义上的自私挖矿或分叉攻击,是指区块链系统网络中,当某个验证节点验证完一个新区块后不对全网广播,而是继续其验证步骤,直到本地验证出的链比网络里的所有链都长时一举对全网广播,从而用仅仅由本地验证过的链去替换原本应该由全网验证的链。

从本质上讲,这时比特币系统的安全模型将会面临崩塌。同理,假如把区块大小扩大10倍,则全网同步传输所需的时间也会相应增加。当传输速度和区块产生速度相比不可忽略时,比特币的安全性就会大打折扣。

在现有的比特币网络中,如果人为设定系统产生区块的间隔为10分钟,那么单个区块容量将不能超过4MB。相对于当前1MB的区块容量而言,交易速度仅能提高4倍,即28TPS。这样的速度提升是非常有限的。

隔离见证

隔离见证(Segregated Witness,SegWit)是技术上为了应对如何在不增加区块容量的前提下提升系统交易速度而做出的尝试,其设计思想如下。

比特币系统中,每个交易数据都含有验证签名,该部分占用了约65%的数据空间。为了有效利用该部分数据空间,隔离见证技术提出将验证签名移至交易数据的尾部,从而释放原本被验证签名占用的数据空间。粗略统计,该改动可以将原本1MB的区块容量有效提升至1.8MB。

隔离见证技术主要解决的是交易信息被更改的问题。事实上,这个改动防止了第三方的延展性,让闪电网络这种侧链的实现更简单。同时,隔离见证技术也增加了比特币系统中简单智能合约的可用性。

然而,这些尝试并不能带来交易处理能力数量级的改善。于是,在侧链概念的基础上,比特币社区提出了比特币闪电网络(Lightning Network)的解决方案。闪电网络是以比特币区块链为后盾,在链下实现真正的点对点微支付交易,一定程度上打破了交易中面临的时延、最终性、容量甚至隐私问题。

以太坊提高整体性能的思路有两点:第一点是用侧链技术,类似比特币闪电网络的雷电网络项目以及Plasma项目,第二点是采用分片技术(Sharding)。

分片

1、比特币的UTXO账本模式

介绍分片,要先从比特币说起。其实,所有的区块链都可以抽象为两个部分:分类存储和运算。

比特币可以被看作一个存储数字的分布式账本,也就是账户余额。它是一个实际只有两种状态的现金交易系统,即账户余额只有两种状态:花掉的钱和没花掉的钱。这就是比特币的UTXO(Unspent Transaction Output)账本模式,中文翻译为“未花费的输出”。Transaction在比特币社区里通常被简称为TX,所以上面这个短语缩写为UTXO。

那么,在比特币的区块链账本里记录的每笔交易都包含若干的交易输入,即资金来源;也包含若干的交易输出,即资金去向。一般来说,每一笔交易都要至少花费一笔输入,产生一笔输出,而其所产生的输出就是“未花费的输出”,即UTXO。它的特点就是简单。

比特币的挖矿采用PoW(Proof of Work)共识机制。在形成共识时会出现暂时的分叉,即出现分叉链,这就需要6个区块来确认。确认的方法是选择最长链,哪条分叉最长就去哪边挖矿。这是PoW的一个弱点,即达成的共识并不是终极共识,需要二次确认才能成为终极共识。而那些在非最长链上的块被称为孤块(Orphan Block),随后就被放弃了。

2、以太坊的智能合约

以太坊的本质就是一个基于交易的状态机(Transaction-based State Machine),它可以被看作是存储图灵完整代码和状态转换运算的分布式账本。它引入了智能合约,用户可以创建智能合约,并调用智能合约的功能来更改其内部状态。相对于比特币的UTXO账本,以太坊大幅增加了对大量复杂状态的记录能力。这种革新使以太坊成为一种状态复制机(State Replica Machine),而这种状态复制机采用了拜占庭容错机制(BFT),进而开启了区块链的智能合约时代。

和中本聪做的挖矿PoW共识机制不同,以太坊的挖矿共识机制在PoW的基础上进行了优化,引入了GHOST(Greedy Heaviest Observed Subtree)协议和叔块(Uncle Block)的概念。

GHOST协议不认为孤块没有价值,而是会给予发现孤块的矿工回报。在以太坊中,孤块被称为叔块。GHOST协议支付报酬给叔块,激励了矿工在新发现的块中引用叔块。而引用叔块会使主链更重(包含子块数目最多为基本原则)。在比特币中,最长的链是主链。而在以太坊中,最重的链是主链。那么,以太坊的这些优化确认方法,通过BFT算法使每一个节点和其他节点一对一沟通,最后达成的共识就是终极共识(Consensus Finality),而不需要再次确认。

BFT算法,尤其是PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)以及各种改进的BFT算法都涌入了区块链。这里面有很多技术细节,但是可以归纳为一点:应用比特币和以太坊的PoW算法(俗称挖矿),其优点就是全球铺开方便。例如,比特币有几千个验证节点,以太坊有2万~3万个验证节点(2018年3月到了2.5万个),但是其交易处理速度比较慢,比特币是7TPS,以太坊大约是20TPS。应用PBFT算法正好相反,其交易处理速度可以比较快,例如,可以做到1万TPS,但是节点支持少,很难超过20个。而且,很多都在一个数据中心,甚至可能在数据中心的同一个机箱内。

近年来,希望改进PoW的交易处理速度的努力主要体现在PoS(Proof of Stake,权益证明)和DPoS(Delegated Proof of Stake,委任权益证明)上面,就是不再通过哈希碰撞来挖矿,而是看谁手上的原生虚拟通证数量多且时间长。这种做法大概可以将处理速度提高到几千TPS,例如2000~5000TPS这个级别,而不牺牲全球铺设的优点。

但是,PoS和DPoS也有一定的短板,就是相对于BFT经过严格的理论验证,PoW经过7年多的实践验证都行之有效,而PoS并没有在大规模的网络中受到考验。从以太坊的发展方向2看,它的PoS方案被称为Casper,大概需要2年时间才可以考虑到实际落地。而且,因为从PoW到PoS的转换会涉及目前的社区利益分歧,非常可能的妥协结果就是一个PoW PoS的双头共存局面。这种结果会导致问题变得更加复杂,从而无法解决以太坊的速度短板。

该算法是卡斯特罗(Miguel Castro)和芭芭拉·利斯科夫(Barbara Liskov)在1999年提出来的,它解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使拜占庭容错算法在实际系统应用中变得可行。该论文发表在1999年的操作系统设计与实现国际会议(OSDI99)上。这位芭芭拉·利斯科夫就是提出著名的里氏替换原则(LSP)的人,2008年图灵奖得主。

3、分片技术原理

通常情况下,区块链网络的处理速度在很大程度上是依赖单一节点的处理速度。但是,随着越来越多的验证节点加入区块链网络,系统速度及性能并非简单地得以提升,此时的系统反而会面临由于节点之间点对点通信路径的成倍增加而导致网络拥堵的问题。例如,采用BFT共识协议的区块链网络,如果节点超过了16个,速度将会变得十分缓慢。

分片协议正是为了应对该问题而提出的一种解决方案。其核心思想是将网络中的所有节点分成若干个子群体,这些子群体通过预定义的方法执行原来所有节点都要处理的工作,从而达到提高系统处理能力的目的。

分片协议规定,为了维持系统的容错性,分片的节点数不能低于一定数量。例如,考虑到对于拜占庭容错算法,50个与500个节点数在验证过程中并无太多的区别,那么系统可以将区块链网络的最低节点数设定在50。在系统采用了分片技术的前提下,区块链网络中参与的节点越多,表明系统可以分出的片越多;而分出的片越多,表明区块链网络同时处理智能合约的数量就越多。那么,采用了分片技术的区块链系统的速度将得到显著提高。

4、Zilliqa、以太坊和墨客

a)Zilliqa分片策略

ZLillia项目旨在通过分片和独特的共识机制来提高区块链的吞吐量。在ZLillia的设计中,每600个节点被分配为一个网络分片,由多个分片形成的并行网络就是分片网络。这类似于物理学中的并联和串联,将每600个节点放入分片内进行串联,然后再将不同的分片进行并联。

考虑到Zilliqa项目中,系统使用的共识机制是实用拜占庭容错,当系统将每个分片的节点数设置为600时,其速度的瓶颈就会凸显。项目方对此提出的解决方案是在每个分片的600个验证节点中选出一个组长,其他599个验证节点都知道该组长的身份信息。于是,原本每个验证节点都需要向另外599个验证节点发送验证信息的机制(拜占庭容错的要求),就成了只需要给组长发送验证信息;组长收到所有验证信息后,通过一个多重签名来记录验证的结果。因此,验证环节中的信息量将会大幅度减少,系统速度得以提升。

但是,Zilliqa的解决方案也存在不少问题。

第一,组长的中心化角色是一个软肋。假设其他599个验证节点中有一个节点被黑客控制,那么这个节点就可以轻易地通过DDoS攻击(Distributed Denial of Service,分布式拒绝服务)使分片失效,最终导致系统崩溃。

第二,采用拜占庭容错机制的系统事先不假定网络中的验证节点知道其他节点的身份,而Zilliqa项目中由于组长节点身份的特殊性,组长节点需要确认其他599个验证节点的身份以确保分片的可靠性,那么显而易见,这样的验证节点区分机制与拜占庭容错机制的本意是相违背的。

第三,Zilliqa系统是硬分叉与硬分片。也就是说,系统会按照固定的分片原则分好片,然后将不同的交易分到不同的片里。同时,系统还要根据地址判断,保证同一个地址去同一个片。这样不仅增加了系统的复杂度,也增加了交易出现双花的潜在风险。

b)以太坊分片策略

以太坊目前的分片策略是在一个合约处理周期内将网络中所有的节点分成若干份,然后将合约分配给每个分片。当该合约处理周期结束时,系统会根据实际情况对下一个合约进行重新分片。

这里会有以下几个问题:

  • 需要一个全局的存储器来保存分片信息;
  • 周期通常比较长,如果节点数动态变化比较大,那么分片的信息会很容易过时;
  • 周期结束时,当前分片处理的合约必须重新分配到新的分片,因而造成不必要的切换资源操作;
  • 分片的共识方式与底层的共识一样,这样分片的功能必须等主网切换到POS才能采用。

c)墨客分片策略

墨客(MOAC)的底层采用了PoW的方式保证数据的一致性,其底层母链节点一般称为验证节点(Validation Node,V-Node)。

分片处理的节点称为智能合约服务器(Smart Contract Server,SCS)节点,每个SCS节点通过一个V-Node接入母链,这样SCS节点可以通过V-Node获得全局一致性的区块信息。各个SCS之间的通信必须通过V-Node转发信息,从而避免SCS受到DDoS攻击,如下图所示。

SCS节点之间通信通过V-Node底层网络示意

SCS节点具有以下特点:

(1)每个分片有自己的存储,就是分片的区块链;

(2)SCS可以有不同于底层PoW的共识方式,如PoS、PBFT等;

(3)SCS的区块生成时间可以与底层不一致,例如,可以采用快速的区块周期来进一步提高处理速度;

(4)SCS周期性地向底层同步状态结果,从而获得阶段性的全局一致性。

与以太坊等设想的分片方法不同,墨客分片采用合约驱动的模式,即一个合约对应一个系统分片。合约创建时自动随机选择相应数量的SCS节点,形成一个分片来处理这个合约。这个合约的生存周期,从创建到结束合约都在分片中实现。当然,中间如果需要,可以重新选择分片SCS节点。

合约的执行尽可能都在SCS端执行,V-Node只处理支付交易和必要的合约调用。如果能够有100个分片,那么合约处理的速度将提高到100倍或更多。同时,底层将处理大部分支付交易,这部分的逻辑比较简单,完全可以降低支付交易的手续费,从而进一步提高处理能力。

合约驱动的墨客分片

存储器的价格则更不是问题。对于普通用户而言,因为有SCS可以参与挖矿,并不一定需要部署一个V-Node,只要有信任的V-Node可以接入就行。这样,墨客系统会形成两个层次的挖矿节点。

(1)大量运算能力强、网络带宽高、存储容量大的V-Node执行PoW,并提供SCS接入服务,维持网络必需的挖矿能力,这个数量在几千到一万台之间。

(2)海量基于中央处理器的SCS用于处理合约的执行。针对子链的共识多样性,这样的SCS节点甚至可以是手机等移动设备。SCS节点的数量可以不受限制。在目前的架构下,可以有几十万甚至几百万台SCS参与,而不会影响系统的性能。

墨客系统将提供一些主要的共识协议的分片实现,如PoS、PoA(Proof of Authority,权威证明)等。用户也可以实现自己的共识协议,作为SCS的一个插件。这样就形成了子链。

分层

1、分片的瓶颈

比特币的共识机制是PoW,而PoW作为底层共识机制会面临两个问题:第一,矿池带来的矿机算力集中化;第二,矿机数量受矿机经济学的限制,有一个动态平衡的矿机数量上限。对于比特币和以太坊这样的公共系统,矿机规模越大,去中心化越落实,系统的安全性就越高。然而,当矿机数量(算力)超过万台之后,因为矿机经济学的原因(即挖矿的奖励和耗费的成本之间的平衡),矿机数量基本会有一个上限,而不会无限增长。

所以,对于采用了分片技术的系统来讲,系统的扩展性会受到矿机规模的限制。例如,系统设定按照每300台矿机分一个片,那么3000台矿机对应10个片,10000台矿机就是对应33个片。如果应用推进顺利,用户数量增长较快,促使矿机数量增长到30000台,假设每个片的处理速度能够达到1000TPS,那么系统的极限处理能力就是10万TPS,这就是系统的上限。

2、分层技术原理

为了解决分片对系统处理速度造成的瓶颈,社区提出了分层(Layered Structure)的概念,即在系统架构上分出不同的功能层,各自执行不同的功能。例如,将系统解构成包含P2P网络层、区块链层、交易层、智能合约层、API层等各种功能层,如下图所示。不同的功能层在系统中完成其特定的功能。

系统的分层示意图

建立在分层技术的基础上,智能合约层的挖矿,如星际存储系统(IPFS)挖矿或物联网(IoT)挖矿都可以通过智能合约的建立方来支付矿工费。这就跳出了矿机经济学的限制,变成了谁设立(智能合约)谁付费的原则。这样的转变使SCS节点数在理论上可以无限增长。所以,在系统上线之初,SCS节点就会随着智能合约的大量上线而有可能突破10万个,甚至突破百万个。

智能合约层的运行需要考虑应用场景的多样性。应用场景的多样性可以类比高速公路的情况。高速公路不光要保证汽车在上面行驶的速度,同时也需要保证可以容纳不同种类的汽车,如载重卡车、越野车、家用车,甚至是摩托车。对应到智能合约层,项目方需要可以自由选择智能合约所需要的节点数目、不同的共识机制、区块的速度及主网刷新的时间等。也就是说,系统只需要提供一个基础框架,然后让项目方根据不同的应用场景灵活调整其功能。

3、墨客的分层技术

墨客分层技术的提出,正是基于前文所述的分层概念。同时,为了能够在大型网络中部署分布式系统,吸引更多的参与者,并保持高吞吐量和低延迟时间,墨客提出了分层的共识堆栈技术解决方案。其具体实现机制如下。

a)采用分层结构

墨客系统将简单的原生交易(Balance Transfer)和智能合约的执行分开处理,底层以PoW的方式处理所有的原生交易和全局合约,解决全局一致性和双花的问题。系统智能合约部署在上层,通过特定的共识机制处理,并采用分片技术将系统TPS提高100倍。

b)智能合约即子链(Smart Contract as a Micro-chain,SAAM)

每个部署的智能合约其实是一个子链,它可以自己选择所需的验证节点(挖矿节点),选择适合自身的共识机制,有自己的区块链来保存状态。子链采用定期刷新的机制将自己状态的哈希值写入底层区块链,以实现最终共识。

c)双层挖矿机制

底层的PoW采用与以太坊一致的挖矿方式,这类挖矿节点的数量在几千至上万个。上层的挖矿采用DApp支付挖矿费用的方式,按照使用的矿工数和单位产量来付费。这类挖矿节点的数量可以是几十万至上百万个。每个矿工以随机的方式参与某个子链,提供服务并获得收益。

在这样的配置环境下,上层挖矿就不再是一个负反馈的过程。每个矿工产生一个区块的收益是相对固定的。如果有大量的应用部署上来,就需要大量的矿工来为这些应用提供服务。大量矿工的加入,一方面扩大了生态系统的规模,另一方面也提升了系统的服务能力,从而吸引更多的应用来平台上部署。

0 人点赞