比特币共识算法PoW

谈到哈希算法,每一个程序员都不陌生,可是谈到比特币共识算法PoW,若是没有接触过的技术人员可能以为应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单。但其实若是你已掌握哈希算法,几分钟内你就能理解PoW。为了更好的说明PoW的原理,咱们再把哈希算法及相关概念描述一下:程序员

哈希函数相关概念

  • 哈希函数——是一类数学函数,能够在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值。
  • 碰撞定义——是指两个不一样的消息在同一哈希函数做用下,具备相同的哈希值。
  • 哈希函数的安全性——是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
  • 抗弱碰撞性——对于给定的消息M_1,要发现另外一个消息M_2,知足H(M_1)=H(M_2)在计算上是不可行的。
  • 抗强碰撞性——找任意一对不一样的消息M_1M_2,使H(M_1)=H(M_2)在计算上是不可行的。
  • 雪崩效应——当一个输入位发生变化时,输出中的每一位均有50%的几率发生变化。

哈希算法就是以哈希函数为基础构造的,经常使用于实现数据完整性和实体认证。一个优秀的 hash 算法,将能实现:算法

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不一样。
  • 冲突避免:很难找到两段内容不一样的明文,使得它们的 hash 值一致(发生冲突)。

哈希函数的性质

抗碰撞性

哈希函数的抗碰撞性是指寻找两个可以产生碰撞的消息在计算上是不可行的。但找到两个碰撞的消息在计算上不可行,并不意味着不存在两个碰撞的消息。哈希函数是把大空间上的消息压缩到小空间上,碰撞确定存在。只是计算上是不可行的。例如,若是哈希值的长度固定为256位,显然若是顺序取1,2,\cdots,2^{256}+12^{256}+1个输入值,计算它们的哈希值,确定可以找到两个输入值,使得它们的哈希值相同。安全

原像不可逆

原像不可逆,指的是知道输入值,很容易经过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。微信

难题友好性

难题友好性指的是没有便捷的方法去产生一知足特殊要求的哈希值。网络

一个哈希函数H称为难题友好的,若是对于每一个n位的输出y,若k是从一个具备较高不可预测性(高小熵)分布中选取的,不可能以小于2^n的时间找到一个x,使H(k||x)=y分布式

为了引伸出工做量证实PoW的原理,考虑一个由哈希函数构成的解谜问题:已知哈希函数H,一个高小熵分布的值value以及目标范围Y,寻找x,使得H(value||x) \in Y函数

这个问题等价于须要找到一个输入值,使得输出值落在目标范围Y内,而Y每每是全部的输出值的一个子集。实际上,若是一个哈希函数H的输出位n位,那么输出值能够是任何一个0~2^n范围内的值。预约义的目标范围Y的大小决定了这个问题的求解难度。若是Y包含全部n比特的串,那么问题就简单了,但若是Y只包含一个元素,那么这个求解是最难的,至关于给定一个哈希值,找出其中一个原像,原像不可逆的性质说明了这个难度。事实上,因为value具备高小熵分布,这确保了除了随机尝试x值以完成搜寻那个很大的空间外,没有其余有效的途径了。区块链

哈希函数的难题友好性构成了基于工做量证实的共识算法的基础。经过哈希运算得出的符合特定要求的哈希值,能够做为共识算法中的工做量证实。这里比特币的安全保证依赖于哈希函数的安全性,若是哈希函数被攻破,能够想象Pow共识算法就失效了,不用算力达到51\%就能够攻击了。.net

小熵(min-entropy)是信息理论中衡量某个结果的可预测性的一个指标。高小熵值的是变量呈均匀分布(随机分布)。若是咱们从对分布的值进行随机抽样,不会常常抽到一个固定的值。例如,若是在一个128位的数中随机选一个固定的数n,那么选到该数的概率是1/2^{128}3d

PoW共识算法

理解了难题友好性,就基本理解了PoW的原理。结合比特币去理解PoW。比特币PoW的过程,就是将不一样的nonce值做为输入,尝试进行SHA256哈希运算,找出知足给定数量前导0的哈希值的过程。要求的前导0的个数越多,表明难度越大。比特币节点求解工做量证实问题的步骤概括以下:

1)生成铸币交易,并与其余全部准备打包进区块的交易组成交易列表,经过Merkle树算法生成Merkle根哈希;
2)把Merkle根哈希及其余相关字段组装成区块头,将区块头的80字节数据做为工做量证实的输入;
3)不停地变动区块头中的随机数nonce,并对每次变动后的区块头作双重SHA256运算,将结果值与当前网络的目标难度作比对,若是知足难度条件,则解题成功,工做量证实完成。该矿工得到记帐权,生成新区块并广播到全网。

欢迎关注微信公众号,推送区块链、分布式、Rust、Linux等技术分享!

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息