前景提要
之前在文章当中也提到过PoW算法的工作原理,以及他的一些源代码的实现,但是,我觉得那些内容还是了解的不够深入,最近又对PoW进行了一个深入的了解,下面谈一下我个人的心得,并对之前的文章进行一些补充。
关于PoW
PoW是最开始又中本聪在比特币的白皮书当中提出的共识机制,和以往的共识机制(Paxos,Raft,PBFT)不同的是,PoW主要是通过竞争记账的方式来解决去中心化的记账系统的一致性问题的,也就是说以每个节点的计算能力来竞争记账权,也就是我们所说的“算力竞赛”。
在比特币当中,每10分钟都会进行一轮的算力竞赛,只要竞赛胜利,就会获得一次记账的权力,在这里所说的算力竞赛,也就是我们要说的PoW(Proof-of-Work)共识机制。
那么Pow的要求是什么呢,在源码中,或者说这种机制当中,会定义一个target值,我们要做的就是通过暴力计算,来找到一个小于target的值(注意!是小于!),一旦成功,那么就说明成功,这样我们就可以获得记账权利,也就相当于完成了一次PoW。
对于上面这句话,有几个点可以详细的说明一下:
1)我们要找到的那个值一定是要小于target的;
2)为什么我们要在这里说是暴力计算呢,因为我们在进行计算的时候是一个一个数进行尝试的,通过尝试找到最终的答案;
3)继续2)的问题,如何进行一个数一个数的尝试呢?我们继续往下看
我们知道比特币的区块头当中包含着很多的基本内容,之前在源码当中也提到过,其中大部分内容都是固定的,但是有一个是会一直变化的,那就是nonce值,这是一个随机值,他的作用就是通过与区块头其他内容结合,并进行一定的函数执行,让所得结果与target进行比较,为了不错过任何一种可能性,因此我们的nonce值往往是从0开始,以1为增量,一直变化的,所以这也很好的解释了为什么会叫做“暴力计算”。
说到这里,就可以看出来Pow有一个很严重的问题,那就是----严重的资源浪费,从暴力计算问题就可以看出来,我们每一次都是需要从头开始的,每相邻的两次Pow计算也是毫无关联的,因此会造成很大的浪费
Pow中使用的加密函数
在Pow中,对于工作量证明所需要的函数是SHA256
加密算法。
关于SHA256算法,我们在这里进行简单的介绍:
SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256。SHA系列算法是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
如果有兴趣的话,可以查阅一些相关的资料,我之后也会提到这种加密算法,这种算法,对于比特币来说,还是相对安全的。(当然只是相对的)
在Pow中,我们使用的是连续两次的SHA256
加密算法得到我们要和target进行比较的内容,也就是
target > SHA256(SHA256(Block_header))
如果满足这个式子,那么恭喜你,你获得记账权了!
Pow中的难度调整
在Pow当中,因为每一次都是在进行算力计算,而且
每一次进行算力竞赛的时候,target的值也是不尽相同的,那么这样,就会造成计算难度高低不同的问题。
首先我们先提出target的计算方法:
目标值=最大目标值/难度值
有人会问,为什么不能就设定成一个固定的值,反正nonce值是在不断进行变化的,只要能找到不就好了么,而且这样还会省去调整难度的问题,这样想思路是好的,但是你这样容易会对下一次计算提供“便捷”,你一旦知道了上一次的最终nonce
值,那么下一次你一定会想办法看看是不是有什么规律可循,这样你接下来的计算速度会越来越快(那比特币会受不了的)。因此,难度调整是十分有必要的。
那么是如何进行调整的呢?我们通过的是一个公式进行调整:
新难度值=旧难度值×(过去2016个区块花费时长/20160分钟)
要说明的是,为什么在这里使用的是20160,这是比特币每两周生成所有块的理想时间(1块=10分钟)。
这样,我们就可以实现对Pow算法难度的设置,从而将难度一直保持在一个相对平衡的水平,也从而保证每一次算力竞赛的时间长度大概是在10分钟左右。
PoW能否解决拜占庭将军问题
貌似所有区块链当中的共识算法的最终目的,或者说是评价指标,应该都是对拜占庭将军问题的解决处理,因此我们来谈一谈PoW到底能不能解决拜占庭将军问题,其实,在2015年,Juan Garay就对比特币的PoW共识算法进行了正式的分析,他最终得出的结论是比特币的PoW共识算法是一种概率性的拜占庭协议(Probabilistic BA)。Garay对比特币共识协议的两个重要属性分析如下。
一致性
在不诚实节点总算力小于50%的情况下,同时每轮同步区块生成的几率很少的情况下,诚实的节点具有相同的区块的概率很高。
正确性
当不诚实算力具一定规模,超过51%,甚至不用接近50%的时候,比特币的共识算法并不能保证正确性,也就是,不能保证大多数的区块由诚实节点来提供。这就是著名的51%算力攻击。
总结
通过以上的分析,我们可以看到,比特币的共识算法并不适合于私有链和联盟链。其原因首先是它是一个最终一致性共识算法,并不是一个强一致性共识算法。第二个原因是其共识效率低,提供共识效率又会牺牲共识协议的安全性。
但是,作为区块链入门必学的经典共识机制,PoW还是在一定程度上有很大的意义的,因此我们还是很有必要学习PoW算法的。
网友评论