共识算法

要想整个P2P网络维持一份相同的数据,同时保证每个参与者的公平性,整个体系的所有参与者必须要有统一的协议,也就 是我们这里要讲的共识算法。比特币所有的节点都遵循统一的协议规范。协议规范(共识算法)由相关的共识规则组成,这些规则可以划分为两个大的核心:工作量 证明与最长链机制。所有规则(共识)的最终体现就是比特币的最长链。共识算法的目的就是保证比特币不停地在最长链条上运转,从而保证整个记账系统的一致性 和可靠性。

工作量证明

工作量证明(POW)可简单地理解为一份证明,用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效 的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。比如现实生活中的毕业证、驾驶证等,也是通过检验结果的方式(通过相 关的考试)取得证明。

1.起源

工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。这个概念由Cynthia Dwork和Moni Naor 1993年在学术论文中首次提出[1]。而工作量证明这个名词,则是在1999年Markus Jakobsson和Ari Juels的文章[2]中才被真正提出。

哈希现金[3]是 一种工作量证明机制,它是亚当·贝克(Adam Back)在1997年发明的,用于抵抗邮件的拒绝服务攻击及垃圾邮件网关滥用。在比特币之前,哈希现金被用于垃圾邮件的过滤,也被微软用于 Hotmail/Exchange/Outlook等产品中(微软使用一种与哈希现金不兼容的格式,并将之命名为电子邮戳)。

哈希现金也被哈尔·芬尼以可重复使用的工作量证明(RPOW)的形式用于一种比特币之前的加密货币实验中。另外,戴伟的B-money、尼克·萨博的比特金(Bit-Gold),这些比特币的先行者都是在哈希现金的框架下进行挖矿的。

2.工作量证明的基本原理

工作量证明系统的主要特征是客户端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查客户端是不是 做了相应的工作。这种方案的一个核心特征是不对称性:工作对于请求方是适中的,对于验证方则是易于验证的。它与验证码不同,验证码的设计出发点是易于被人 类解决而不易被计算机解决[4]

下图表示的是工作量证明的流程。spacer.gif

image.png

举个例子[5], 给定一个基本的字符串“Hello,world!”,我们给出的工作量要求是,可以在这个字符串后面添加一个叫作nonce(随机数)的整数值,对变更后 (添加nonce后)的字符串进行SHA-256哈希运算,如果得到的哈希结果(以十六进制的形式表示)是以“0000”开头的,则验证通过。为了达到这 个工作量证明的目标。我们需要不停地递增nonce值,对得到的新字符串进行SHA-256哈希运算。按照这个规则,需要经过4251次计算,才能找到恰 好前4位为0的哈希散列。

"Hello,world!0"=>1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

"Hello,world!1"=>e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

"Hello,world!2"=>ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7

...

"Hello,world!4248"=>6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965

"Hello,world!4249"=>c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6

"Hello,world!4250"=>0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

通过这个示例我们对工作量证明机制有了一个初步的理解。有的人会认为如果工作量证明只是这样一个过程,那是不是只需要记住nonce为4521使计算能通过验证就行了?当然不是的,这只是一个例子。

下面,我们将输入简单地变更为“Hello,world+整数值”,整数值取1~1000,也就是说,将输入变成 一个由1000个值组成的数组:Hello,world!1;Hello,world!2;…;Hello,world!1000。然后对数组中的每一个 输入依次进行上面例子中要求的工作量证明——找到前导为4个0的哈希散列。

由于哈希值伪随机的特性,根据概率论的相关知识容易算出,预期要进行216次尝试,才能得到4个前导为0的哈希散列。而统计一下刚才进行的1000次计算的实际结果会发现,进行计算的平均次数为66958次,十分接近216(65536)。在这个例子中,数学期望的计算次数就是要求的“工作量”,重复多次进行的工作量证明会是一个符合统计学规律的概率事件。

统计输入的字符串与得到对应目标结果实际使用的计算次数列表如下:

Hello,world!1=>42153

Hello,world!2=>2643

Hello,world!3=>32825

Hello,world!4=>250

Hello,world!5=>7300

...

Hello,world!995=>164819

Hello,world!996=>178486

Hello,world!997=>22798

Hello,world!998=>68868

Hello,world!999=>46821

比特币体系里的工作量证明机制与上述示例类似,但要比它更复杂一些。

3.比特币中的工作量证明

对于比特币网络中的任何一个节点,如果想生成一个新的区块并写入区块链,则必须解出比特币网络出的工作量证明的迷 题。这道题的3个关键要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了解这道题所需要 的计算量。

比特币网络中使用的工作量证明函数正是前文提及的SHA-256。已经讲过区块的数据结构,但并未具体描述区块的 产生过程。区块其实就是在工作量证明环节产生的。矿工通过不停地构造区块数据,检验每次计算出的结果是不是满足工作量,从而判断该区块是不是符合网络难 度。区块头即为比特币的工作量证明的输入数据。

难度值是矿工们挖矿的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区 块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生都基本保持这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被 设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。

难度值的调整是在每个完整节点中独立自动发生的。每隔2016个区块,所有节点都会按统一的公式自动调整难度值, 这个公式是由产生最新2016个区块的花费时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得 出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快,则增加难度,比10分钟慢,则降低难 度。

这个公式可以总结为如下形式:

新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)

工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:

目标值=最大目标值/难度值

其中,最大目标值为一个恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

我们也可以将比特币工作量证明的过程简单理解成,通过不停地变换区块头(即尝试不同的nonce值)并将其作为输入,进行SHA-256哈希运算,找出一个有特定格式的哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,难度越大。

可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:

1)生成coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash。

2)把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入。

3)不停地变更区块头中的随机数(即nonce的数值),并对每次变更后的区块头做双重SHA-256运算(即 SHA256(SHA 256(Block_Header))),将结果值哈希反转并与当前网络的目标值对应的十进制字符串做对比,如果小于目标值,则解题成功,工作量证明完 成。

该过程可以用下图表示:

image.png

比特币的工作量证明,就是我们俗称“挖矿”所做的主要工作。理解工作量证明机制,将为我们进一步理解比特币区块链的共识机制奠定基础。

最长链机制

比特币网络要求所有节点都遵循一个协议(共识),所有保存到本地的区块链必须是被本地节点验证通过的最长链。由于区块链的每个区块必须引用它的前一个区块,所以最长链是最难推翻的。

理论上,矿工可以在任意区块的基础上开始计算下一个区块。但只有最长区块链上的区块才能获得系统的承认并得到挖矿奖励。打包区块获得的奖励在该区块上增加99个新区块(100个确认)之后才能使用。这是保证区块链不发生分裂的重要机制。

image.png

算力攻击

比特币在设计之初是为了实现一个点对点的电子现金系统,而这一系统的难题是如何避免双重支付问题。共识算法的目标 就是降低双重支付的可能性。在中本聪的白皮书里针对设计的比特币体系做了一个数学推算,以验证整个比特币体系里发生双重支付的概率,这里引用相关原文,让 大家来感受一下比特币区块链体系的安全性。

1.计算

设想如下场景:一个攻击者试图生成一条具有替代性的链,这条链的延长速度比诚实链的延长速度更快。即便这一目的达 成了,也不意味着系统可以任攻击者为所欲为,比如凭空制造币或者拿走从来不属于他的币。节点不会接受一个无效的交易,而诚实节点永远不会接受包含无效交易 的区块。攻击者唯一能尝试的是:改变一笔自己的交易,并尝试把钱从他最近的花费中拿回来。

诚实链和攻击链之间的竞赛具有二项随机漫步(Binomial Random Walk)的特点。成功事件意味着诚实链延长了一个区块,领先加1,失败事件意味着攻击链延长了一个区块,差距减1。

攻击者成功填补某一既定差距的概率类似于赌徒破产问题(Gambler’s Ruin Problem)。假定一个赌徒拥有无限的透支信用,然后开始进行潜在次数为无穷的赌博,以试图填补自己的亏空,那么我们可以计算他补上亏空的概率,也就 是该攻击链赶上诚实链的概率,如下所示[6]

image.png

假定p>q,那么攻击成功的概率就随着攻击者要追上的区块数的增长而呈现指数下降。概率是攻击者的敌人,如果他最开始不能获得幸运的突破,那么随着他落后的越多,他成功的机会就会变得无限渺茫。

现在考虑一下,一个新交易的收款人需要等到多长时间,才能足够确信发款人已经不可能改变这笔交易了。假设付款人是一个攻击者,他希望收款人相信他已经付过款了,然后过一段时间将已支付的款项重新发回给自己。付款人希望就算届时收款人会察觉这一点,也已经于事无补。

对此,收款人生成一个新的密钥对,然后在交易签署前不久将公钥发送给付款人。这可以防止付款人预先准备好一个链, 然后持续地对此区块进行运算,直到他的链幸运地超越了诚实链,然后立即执行支付。在此情形下,只要交易一发出,攻击者就开始悄悄地准备一条包含了该交易替 代版本的平行链条。

收款人将等待交易出现在首个区块中,然后等到z个区块连接在其后。此时,他仍然不能确切地知道攻击者已经进展了多少个区块,但是假设诚实区块产生一个区块将耗费平均预期时间,那么攻击者的潜在进展就是一个泊松分布,分布的期望为

image.png

在此情形下,为了计算攻击者追赶上的概率,将攻击者取得进展区块数量的泊松分布的概率密度乘以在该数量下攻击者依然能够追赶上的概率:

image.png

将其简化为如下形式,避免对无限数列求和:

image.png

转化为C语言代码[7]


 

#include double attackersuccessprobability(double q, int z){
   double p = 1.0 - q;
   double lambda = z * (q / p);
   double sum = 1.0;
   int i, k;
   for (k = 0; k <= z; k++)
   {
       double poisson = exp(-lambda);
       for (i = 1; i <= k; i++)
           poisson *= lambda / i;
           sum -= poisson * (1 - pow(q / p, z - k));
   }
   return sum;}


对其进行运算,可以得到如下的概率结果,发现概率对z值呈指数下降。

当q=0.1时:

z=0 p=1.0000000

z=1 p=0.2045873

z=2 p=0.0509779

z=3 p=0.0131722

z=4 p=0.0034552

z=5 p=0.0009137

z=6 p=0.0002428

z=7 p=0.0000647

z=8 p=0.0000173

z=9 p=0.0000046

z=10 p=0.0000012

当q=0.3时:

z=0 p=1.0000000

z=5 p=0.1773523

z=10 p=0.0416605

z=15 p=0.0101008

z=20 p=0.0024804

z=25 p=0.0006132

z=30 p=0.0001522

z=35 p=0.0000379

z=40 p=0.0000095

z=45 p=0.0000024

z=50 p=0.0000006

求解令p<0.1%的z值,具体如下。

为使p<0.001,则

q=0.10 z=5

q=0.15 z=8

q=0.20 z=11

q=0.25 z=15

q=0.30 z=24

q=0.35 z=41

q=0.40 z=89

q=0.45 z=340

计算结果表明,不管攻击者算力在整个网络的占比是多少,随着区块链里区块确认数增加,发生双重支付的概率就越来越 低。只有当你的算力占比比较高的时候才有成功的可能,而这个其实又可以通过增加确认数来避免。如果支付方与接收方调整相应的参数作为交易的条件,比如规定 N个确认才算交易完成,那么区块链的双花问题在这个体系下变得异常困难。

2.51%算力攻击

虽然比特币的体系在设计上已经大大降低了双重支付的可能,但没有绝对安全的系统。在攻击者拥有超过整个网络一半算 力的情况下,就有能力推翻原有已经确认过的交易,使恶意的双花成为可能,业内形象地称之为51%算力攻击。攻击者掌握了全网51%的算力后,可以用这些算 力来重新计算已经确认过的区块,使区块产生分叉,完成双花并获得利益。攻击者如果发动攻击,则能做到:

1)控制自己的交易,一笔发给接收者,另一笔发送给自己,让最终发给自己的交易成功而接收者的失效,欺骗接收者,实现双花成功。

2)阻止别人的交易被打包到区块,让交易不能确认。

3)阻止别人生成新的区块,获得区块奖励。

不能做的事情如下:

1)控制别人发送的交易。

2)阻止别人发送交易。

3)更改每个区块的奖励数量。

4)凭空产生币。

5)发送不属于他自己的币。

通过上述内容可很容易看出,攻击者实施51%算力攻击时唯一对自己有利的就是,完成对自己交易的双花,骗取交易接收方的利益。

而从经济学的角度去看这个攻击问题,攻击者通过攻击来获取利益,但这是需要成本的(算力成本),只有当攻击获取的 收益大于成本,也大于他诚实工作所获取的收益时,攻击者才会自发动攻击的意图。假定的有理性的人,即为了获得更大收益而发起攻击的人,实际上是不会发动这 样的攻击的。这样就产生了51%攻击的悖论,攻击者发起攻击要考虑自身利益,出于较高的成本,算力拥有者都会选择诚实的工作。

除了上述的攻击成本之外,攻击其实也依赖于社区的理性选择,这也让攻击的成功率很低。历史上,Ghash.io曾 经出现过算力接近于51%的情形,造成了社区恐慌,矿工选择撤离,最终让Ghash.io的算力急剧下降。而国内4家矿池也曾出现整体算力接近51%的情 形。2015年,国内矿池联盟合作,而且并未遵守社区软分叉的协议,产生新版本号的区块,造成区块高度为36731~36736的相关区块不符合社区的协 议。另外,其他矿池基于36731产生新版本的区块,而未选择在国内产生的新区块的链条上挖矿,此事件也同样引起社区的热议。最终,违背社区协议的国内几 大矿池将所挖的区块作废,在遵从社区协议的链条上挖矿产生新版本号的新区块。历史上的诸多事件证明,除了共识算法,社区成员的理性选择,也同样是维护整个 区块链体系安全的保障。

共识算法的探索

1.POW

POW使用的哈希算法原理上接近一个暴力破解的过程。随着比特币的发展及其市值的增加,市场上出现了ASIC矿 机,它是专门针对比特币使用的SHA-256算法研发的,从而使系统总算力不断上升。算力的快速上涨既降低了挖矿过程的去中心化,又带来了越来越高的能源 消耗。这种现象引发了社区的讨论。于是有新的竞争币尝试使用不同的用于工作量证明的哈希算法。

竞争币的鼻祖莱特币,除了修改了比特币的相关参数,最大的调整就是对共识算法的更改,将比特币工作量证明所使用的 SHA-256哈希算法变更为Scrypt哈希算法,两者的不同在于,Scrypt哈希算法本身不适宜进行并行计算,因此制造专业的ASIC矿机比较困 难。在实践中,随着莱特币市值的增加,人们也制造出了针对Scrypt的专业矿机。竞争币Darkcoin后续所使用X11算法,即让11种哈希算法串联 起来作为工作量证明的哈希函数,以防止专业的ASIC芯片矿机。再到后来又有出现了专门针对矿池挖矿的算法SpreadX11,它的代表者则是竞争币 Spreadcoin。

2.POS

POS(Proof Of Stake,权益证明)是一种不同于工作量证明的共识机制,它不通过竞争性的哈希计算,而是通过节点对所有权的证明来达成共识。有些人认为,随着区块奖励 的减少,工作量证明机制最终会导致系统出现“公地悲剧”,而权益证明机制对矿工的激励机制,可以维持更好的系统安全。

真正将POS机制运用起来的数字货币是点点币(PPC,PPCoin)。这里首先要引入币龄这一概念,在比特币 里,UTXO所位于区块的高度与当前最长链高度之间的差值决定着该笔Unspent币龄的大小,差值越大,代表着币龄越高。该Unspent的使用也就代 表着币龄的消耗。在POS机制里,一笔交易可以消耗的币龄被视为POS的一种形式,POS指的是一种对货币所有权的证明。拥有币且币龄越高的节点拥有着产 生新区块的权力。

3.小结

新共识算法的发明常常是源于对工作量证明能源消耗的优化及对专业矿机挖矿的抵制,很多人都在寻找任意节点(通过 GPU或者是CPU,也就是一台计算机)都可以参与整个网络挖矿的方法。以太坊发明了自己的挖矿算法ethash来抵制专业芯片的矿机,同时宣称将会以 POW+POS的机制来运行整个区块链网络。

另外,大量的私有链都尝试采用或发明了不同的共识算法。有限的去中心化,使得我们可以采用更为高效且低成本的共识算法。而类似于比特币区块链这样的公有链,由于需要达成所有节点完全平等、自由加入等特性的完全去中心化,相应的一定规模的资源消耗几乎是必然的。

[1] Dwork, Cynthia; Naor, Moni (1993).“ Pricing via Processing, Or,Combatting Junk Mail, Advances in Cryptology ”. CRYPTO ’92: Lecture Notes in Computer Science No. 740 (Springer): 139–147.

[2] Jakobsson, Markus; Juels, Ari (1999). “ Proofs of Work and Bread Pudding Protocols ”. Communications and Multimedia Security (Kluwer Academic Publishers): 258–272.

[3] 引用自https://en.wikipedia.org/wiki/Hashcash。

[4] 引用自https://en.wikipedia.org/wiki/Proof-of-work_system。

[5] 引用自https://en.bitcoin.it/wiki/Proof_of_work。

[6] W. Feller, An introduction to probability theory and its applications, 1957.

[7] 引用自https://bitcoin.org/bitcoin.pdf


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=671

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值