区块链做为一个去中心化的分布式帐本系统,然而在实际运行中,怎么解决由于去中心化后,保证整个系统能有效运行,各个节点诚实记帐,在没有所谓的中心的状况下,互相不信任的个体之间就交易的合法性达成共识的共识机制。算法
在分布式系统中,各个不一样的主机经过异步通讯方式组成网络集群。为了保证每一个主机达成一致的状态共识,就须要在主机之间进行状态复制。异步系统中,可能会出现各样的问题,例如主机出现故障没法通讯,或者新能降低,而网络也可能发生拥堵延迟,相似的种种故障有可能会发生错误信息在系统内传播。所以须要在默认不可靠的异步网络中定义容错协议,以确保各主机达成安全可靠的状态共识。因此,利用区块链构造基于互联网的去中心化帐本,须要解决的首要问题是如何实现不一样帐本节点上的帐本数据的一致性和正确性。安全
常见的共识就机制包括:POW(工做量证实机制)、POS(权益证实机制)、DPOS(股份受权证实)POW+POS(混合共识机制)等等,另外还有Pool验证池、Ripple瑞波共识协议等等网络
比特币的去中心网络采用的是工做量证实共识机制。异步
去中心网络之因此须要共识机制,是由于这是一个非基于信任(non-trust-based)的网络,任何人无须许可均可以接入这个网络。而且,这些节点分散在网络条件差别很是大的全球互联网之中。在彻底无中心的状况下,这些节点要同步一致,共识机制即为这些节点达成一致的机制。
关于分布式网络的共识机制,有著名的“Fisher-Lynch-Paterson 不可能结果”,即在必定条件下达成共识是不可能的。而比特币的工做量证实共识机制在实践中被验证是有效的。这是由于它采用了一个实用主义的解决方案。分布式
PoW(工做量证实机制) 共识机制
PoW(Proof of Work),即工做量证实,闻名于比特币,俗称“挖矿”。PoW是指系统为达到某一目标而设置的度量方法。简单理解就是一份证实,用来确认你作过必定量的工做。监测工做的整个过程一般是极为低效的,而经过对工做的结果进行认证来证实完成了相应的工做量,则是一种很是高效的方式。PoW是按劳分配,算力决定一块儿,谁的算力多谁记帐的几率就越大,可理解为力量型比较。如下内容基于比特币的PoW机制。
工做量证实( PoW )经过计算一个数值( nonce ),使得拼揍上交易数据后内容的 Hash 值知足规定的上限。在节点成功找到知足的Hash值以后,会立刻对全网进行广播打包区块,网络的节点收到广播打包区块,会马上对其进行验证。
如何才能建立一个新区块呢?经过解决一个问题:即找到一个nonce值,使得新区块头的哈希值小于某个指定的值,即区块头结构中的“难度目标”。
若是验证经过,则代表已经有节点成功解迷,本身就再也不竞争当前区块打包,而是选择接受这个区块,记录到本身的帐本中,而后进行下一个区块的竞争猜谜。网络中只有最快解谜的区块,才会添加的帐本中,其余的节点进行复制,这样就保证了整个帐本的惟一性。函数
假如节点有任何的做弊行为,都会致使网络的节点验证不经过,直接丢弃其打包的区块,这个区块就没法记录到总帐本中,做弊的节点耗费的成本就白费了,所以在巨大的挖矿成本下,也使得矿工自觉自愿的遵照比特币系统的共识协议,也就确保了整个系统的安全。性能
这道题关键的三个要素是工做量证实函数、区块及难度值。工做量证实函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题的所须要的计算量。区块链
首先看一下这道题究竟是什么?这道题的目的在于算出一个值,且这个值小于目标值便可,这个值就是上图中的上一个区块的哈希值。加密
目标值 = 最大目标值 / 难度值(最大目标值恒定:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )
tips:难度值是随网络变更的,目的是为了在不一样的网络环境下,确保每10分钟能生成一个块。spa
那如何计算呢?SHA256(SHA256(Block_Header)),即只须要对区块头进行两次SHA256运算便可,获得的值和目标值进行比较,小于目标值便可。区块头结构以下:
区块头中有一个重要的东西叫MerkleRoot的hash值。这个东西的意义在于:为了使区块头能体现区块所包含的全部交易,在区块的构造过程当中,须要将该区块要包含的交易列表,经过Merkle Tree算法生成Merkle Root Hash,并以此做为交易列表的摘要存到区块头中。
至此,咱们发现区块头中除过nonce之外,其他的数据都是明确的,解题的核心就在于不停的调整nonce的值,对区块头进行双重SHA256运算。整个工做量证实过程以下:
PoW依赖机器进行数学运算来获取记帐权,资源消耗大、共识机制高、可监管性弱,同时每次达成共识须要全网共同参与运算,性能效率比较低,容错性方面容许全网50%节点出错。
PoW的优势:彻底去中心化,节点自由进出。
PoW的缺点:目前比特币已经吸引全球大部分的算力,其余再使用PoW共识机制的区块链应用很难得到相同的算力来保障自身的安全;挖矿形成大量的资源浪费;共识达成的周期较长。
使用PoW的项目有:比特币、以太坊前三个阶段——Frontier(前沿)、Homestead(家园)、Metropolis(大都会)。以太坊的第4个阶段,即Serenity(宁静),将采用权益证实机制。
比特币的工做量证实的关键特色是,它巧妙地融合技术和经济因素,不仅是纯粹经过技术自己来达到这一点,而是归入了与自身做为一个数字现金系统相关的挖矿奖励。按《比特币:技术驱动金融》一书的分析,比特币的共识机制有两个与过去不一样的特色,咱们略作引伸讨论。
在这样一个加密数字货币应用中引入了经济激励,维护网络的节点就能够获得有价值的比特币做为奖励。
为何比特币网络中的节点们愿意打包交易、维护帐本?它们并不是出于“善意”,而是由于,它们能因这些挖矿行为得到比特币形式的经济激励。这是一个自行发行的电子现金系统的独特优点,若是所开发的是其余没有自行发行代币的 IT 系统,咱们就没法设计矿工挖矿奖励这样的经济激励机制。
激励挖矿节点参与挖矿的,除了与新区块相关的奖励以外,挖矿节点还能够获得区块中包含的全部交易付出的交易费。但到目前为止这个数值还较小,大概为新区块奖励的 1%。
比特币系统造成的共识不是彻底可靠的,可是在等待了 6 个区块约 1 个小时以后,出问题的几率呈指数级降低。在 6 个区块以后,一个交易发生双花状况的几率可被认为是零。从纯理论上看,完美的共识不可能达成,但从实用的角度看,这个共识是可信的。