前言
本文目前只有POW、POS、DPOS这些公有链常用的共识算法的理解。
PBFT和Raft是联盟链和私有链常用的共识算法,这两个还没有理解透彻,以后再更新。
POW
比特币中用到的即为POW共识算法。这个需要从nonce和难度值这两个值说起。
nonce存在与区块头中(区块头中其中有个很重要的hash值,是使用Merkle Tree算法得到的,这个算法并不复杂,文后有图解),而且nonce是不断增大或者说变化的,随着nonce的不断变化,对整个区块头做双重SHA256得到的hash值自然也就会不断的变化,这个先放下这个hash值,再说下难度值。
难度值顾名思义是表明产出区块难度的一个值,这个值随着算力增大而增大,使得基本上维持每十分钟发现一个新区块的速度,对难度值做如下计算
目标值 = 最大目标值 / 难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
此时再拿回来上面用区块头双重hash256得到的hash值,让目标值和hash值作比较,如果hash值小或相等,则证明成功,否则继续改变nonce值重复此步骤。
这个时候我们可以想象的到,POW的缺点:
- 如果算力足够大,那么拿到新区块的几率会大大提升。矿池的出现,一定程度上违背了去中心化的初衷,同时也使得51%攻击(文后再说)成为可能,影响其安全性。
- PoW存在巨大的算力浪费。看看矿池用掉多少电就知道了。
所以POS出现了
POS
PoS(权益证明,Proof of Stake)的出现很大程度上是因为PoW的缺陷而提出的。采用PoS的币中不同币的PoS不完全相同,权益证明要求用户证明拥有某些数量的货币(即对货币的权益),下面以点点币为例,理解PoS的思想。
点点币在SHA-256的哈希运算的难度方便引入了币龄的概念,使得难度与交易输入的币龄成反比。在点点币中,币龄被定义为币的数量与币所拥有的天数的乘积。点点币的权益证明机制结合了随机化与币龄的概念,未使用至少30天的币可以参与竞争下一区块,越久和越大的币集有更大的可能去签名下一区块。而一旦币的权益被用于签名一个区块,则币龄将清为零,这样必须等待至少30日才能签署另一个区块。同时,为防止非常老或非常大的权益控制区块链,寻找下一区块的最大概率在90天后达到最大值,这一过程保护了网络,并随着时间逐渐成为新的币而无需消耗大量的计算能力。
POS确实解决了依赖算力和算力浪费这两个缺点,但是引入的币龄这一权益象征的概念,显然也不够安全:
依据权益结余来选择,会导致首富账户的权力更大,有可能支配记账权。所以,DPOS来了
DPOS
股份授权证明机制(Delegated Proof of Stake,DPoS),是对PoW、PoS不足的提出的。下面以比特股为例,理解DPoS的思想。
比特股引入了见证人这个概念,见证人可以生成区块,每一个持有比特股的人都可以投票选举见证人。得到总同意票数中的前N个(N通常定义为101)候选者可以当选为见证人,当选见证人的个数需满足:
至少一半的参与投票者相信N已经充分地去中心化。
见证人的候选名单每个维护周期(1天)更新一次,然后随机排列,每个见证人按序有2秒的权限时间生成区块,若见证人在给定的时间片不能生成区块,区块生成权限交给下一时间片对应的见证人。如果见证人提供的算力不稳定或计算机宕机等,持股人可以随时通过投票更换这些见证人。
可以看到,其核心思想是通过缩小参与核心共识过程的节点数量,以提高共识效率。(这里可以认为选举见证人的过程为非核心共识过程,而见证人按序生成区块可以认为是核心共识过程)
说好的文后
Merkle Tree的算法图解

51%攻击
概念:
所谓51%攻击,就是说在整个网络中有人的算力超过了全网的51%。
如果51%攻击发生,就会破坏区块链去中心化的特性,同时也让网络处在几种攻击风险之下,例如自私挖矿,取消所有转账,双花以及随机分叉。
何时发生?
- 情况1:
某个矿池算力过大当矿池的算力过大,超过全网51%的哈希力,就会发生51%攻击。这可不是危言耸听哦,在比特币历史上,就曾经发生过。在2014年,著名的矿池GHash就超过51%哈希力。不过他们道德品格比较高尚,自己请求将算力减少,并承若不会超过39.99% 的哈希力。在2016年8月,Krypton和Shift,这两个基于以太坊的项目,就遭到了51%攻击。 - 情况2:
有无限的资本我们常说,不要让贫穷限制了想象力。如果你钱多的花不完,那么你就可以去买足够多的设备,例如所有的矿机和GPU来接管整个区块链网络,发动51%攻击。这听起来有点像咱们隔壁的高丽国做的事情,这种情况也被戏称为“金手指攻击”。在发动攻击后,你可以继续通过实行双花或者在链上发布各种欺诈转账,从而摧毁某个币的价值。 - 情况3:
工作量证明中链替换问题假设现在有人写了个智能合约,其中说矿工需要存入一大笔资金,然后才能加入挖矿。并且在有60%矿工加入之前,你随时可以离开。但是在有60%矿工加入之后,你就必须要在20个区块加在分叉链(红链)上才能离开。如此,新的链就会越来越强大,因为有60%的矿工都被绑定在新链上,同时原来的链(蓝链)也逐渐被替换掉了。有人或许会问,为啥矿工要遵守这个合约呢?逐利性是根本,并且对于矿工来说,这并无什么风险。此外就是之前存入的担保资金,使得矿工不得不做。这样地化,就会造成链分叉攻击。
什么结果?
- 结果1:自私挖矿
假设小红和小明是两矿工,他们两人同时解答了对应区块所需要的数学难题。那么问题就在于网络认可谁挖出来的区块。如果网络中有80%的算力选择去挖小红的区块,那么她出块的概率就要比小明高的多。
这样地话,小红的区块就会成功主链的一部分,那么小明的区块就只能被遗弃,不会加到主链上。这时候问题就来了,如果小红始终有51%的哈希力,那么她就能不停地去挖区块,然后将那个块加入到主链上,而且还不需要整个网络的批准。
这就太爽了,小红可以不停偷偷地去挖出区块,而且其他人都不知道。然后拿走所有的挖矿奖励和转账费用。
- 结果2:转账取消
小红想给小明转账,那么矿工就需要验证她的转账信息,再把信息放到区块里面,这样小明才能收到转账。
这时候假设比特币正在被51%攻击,那么这个区块就会被攻击者挖出,因为他有51%的哈希力。
换句话说,因为这时候他有绝对的权力,他也能够不接受任何区块的任何转账,而这些区块之后是要被放到主链上的。试想下这会怎么样,这意味着比特币网络彻底被摧毁。
- 结果3:双花现象
矿工最重要的作用之一就是可以防止“双花”现象。其实“双花”也很好理解,就是一笔钱被花了两次,同个币在同一时间被转账了2次。但是矿工就很好地解决了这个问题,因为转账只会在矿工将转账信息放入他们挖出的区块后,才会发生。
假设小明想去同时追小红和小朱,作为diaosi的他表示没什么钱,就想着投机取巧把同一个币同时转给她们。矿工这时候站出来不同意了,只把其中其中一个转账信息放入区块,然后覆盖另外一个,从而防止了“双花”。
不过在51%攻击的情况下,攻击者才是最后将新区块放入区块链上的人,他们完全可以发动 “双花”,将两比转账信息都放入区块中。甚至,还可以将同一个币进行多次转账。
如果发生“双花”现象,那么这类币的价值就会被严重打压,也会对其造成毁灭性的影响。而且通过链分叉,也会发生“双花”现象。
- 结果4:随机分叉
“分叉”大家应该都有所了解,毕竟之前比特币分叉的事情弄得沸沸扬扬的。下图中的红链就是从蓝链分叉而来的。设想51%攻击者在区块51中花了20个比特币买了其他数字资产,他们很容易就能在区块50进行分叉,又得到一个区块51。
最神奇的是,在分叉的时候,新的区块51中你也会得到之前区块中的资产。换句话说,51%攻击者在蓝色区块51中会获得等同20比特币的其他数字资产,在红色区块51中还会有20个比特币。这其实也就是分叉导致的“双花”现象。

- 主链分叉现象
而且最可怕的是,在51%攻击下,区块是由攻击者挖出来的,如果别的矿工想要去产生新的区块,那么攻击者可以在你挖出区块前,去分叉新的链,然后在新链基础上继续挖矿。
悖论
虽然看起来51%攻击非常恐怖,不过这通常仅存在于理论情况下。因为如果你想做到,首先需要足够的钱去掌控全网51%的算力,这将是非常大的一笔投资。其次在攻击后,币种价格会受到影响,你需要卖出非常多的币才能达到收支平衡。所以其实有理性的人,为了获得更大收益而攻击的人,实际上是不会发动这样的攻击的。这就是51%攻击悖论。
欢迎大家关注我的公众号
网友评论