谈到哈希算法,每一个程序员都不陌生,可是谈到比特币共识算法PoW,若是没有接触过的技术人员可能以为应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单。但其实若是你已掌握哈希算法,几分钟内你就能理解PoW。为了更好的说明PoW的原理,咱们再把哈希算法及相关概念描述一下:程序员
哈希算法就是以哈希函数为基础构造的,经常使用于实现数据完整性和实体认证。一个优秀的 hash 算法,将能实现:算法
哈希函数的抗碰撞性是指寻找两个可以产生碰撞的消息在计算上是不可行的。但找到两个碰撞的消息在计算上不可行,并不意味着不存在两个碰撞的消息。哈希函数是把大空间上的消息压缩到小空间上,碰撞确定存在。只是计算上是不可行的。例如,若是哈希值的长度固定为256位,显然若是顺序取这
个输入值,计算它们的哈希值,确定可以找到两个输入值,使得它们的哈希值相同。安全
原像不可逆,指的是知道输入值,很容易经过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。微信
难题友好性指的是没有便捷的方法去产生一知足特殊要求的哈希值。网络
一个哈希函数称为难题友好的,若是对于每一个
位的输出
,若
是从一个具备较高不可预测性(高小熵)分布中选取的,不可能以小于
的时间找到一个
,使
。分布式
为了引伸出工做量证实PoW的原理,考虑一个由哈希函数构成的解谜问题:已知哈希函数,一个高小熵分布的值
以及目标范围
,寻找
,使得
。函数
这个问题等价于须要找到一个输入值,使得输出值落在目标范围内,而
每每是全部的输出值的一个子集。实际上,若是一个哈希函数
的输出位
位,那么输出值能够是任何一个
~
范围内的值。预约义的目标范围
的大小决定了这个问题的求解难度。若是
包含全部
比特的串,那么问题就简单了,但若是
只包含一个元素,那么这个求解是最难的,至关于给定一个哈希值,找出其中一个原像,原像不可逆的性质说明了这个难度。事实上,因为
具备高小熵分布,这确保了除了随机尝试
值以完成搜寻那个很大的空间外,没有其余有效的途径了。区块链
哈希函数的难题友好性构成了基于工做量证实的共识算法的基础。经过哈希运算得出的符合特定要求的哈希值,能够做为共识算法中的工做量证实。这里比特币的安全保证依赖于哈希函数的安全性,若是哈希函数被攻破,能够想象Pow共识算法就失效了,不用算力达到就能够攻击了。.net
小熵(min-entropy)是信息理论中衡量某个结果的可预测性的一个指标。高小熵值的是变量呈均匀分布(随机分布)。若是咱们从对分布的值进行随机抽样,不会常常抽到一个固定的值。例如,若是在一个128位的数中随机选一个固定的数
,那么选到该数的概率是
。3d
理解了难题友好性,就基本理解了PoW的原理。结合比特币去理解PoW。比特币PoW的过程,就是将不一样的nonce值做为输入,尝试进行SHA256哈希运算,找出知足给定数量前导0的哈希值的过程。要求的前导0的个数越多,表明难度越大。比特币节点求解工做量证实问题的步骤概括以下:
1)生成铸币交易,并与其余全部准备打包进区块的交易组成交易列表,经过Merkle树算法生成Merkle根哈希;
2)把Merkle根哈希及其余相关字段组装成区块头,将区块头的80字节数据做为工做量证实的输入;
3)不停地变动区块头中的随机数nonce,并对每次变动后的区块头作双重SHA256运算,将结果值与当前网络的目标难度作比对,若是知足难度条件,则解题成功,工做量证实完成。该矿工得到记帐权,生成新区块并广播到全网。
欢迎关注微信公众号,推送区块链、分布式、Rust、Linux等技术分享!
![]()