区块链原理简介

 

  密码学Hash()函数的单向性: Hash(x) =y , 通过y很难找到x

  哈希链: 假如现在有顺序产生的数据块 A, B , C 。 那么我们可以这样计算一个hash 。 注意 “||” 表示拼接

  (ps : A, B, C 可以是所在节点的二进制信息,等等,反正就是已经知道的值,比如一个普通文件的二进制信息)

h0=  Hash(A) 
h1 = Hash(B || h0)
h2 = Hash(C || h1)

  h2是我们计算的hash头部,现在来看, 为什么我们管这个东西叫Hash链, 因为h2 的值依赖于之前一系列数据的内容和计算顺序。

  假如说现在你知道了h2 , 别人拿着A,B, C, 他不管是修改A,B, C的任一点内容还是A,B, C的出现顺序,你都无法再次计算出正确的h2

 

  比特币区块链其实就是哈希链的一个变种

  (注意, 下文描述的这种添加随机数以及对随机数有特殊要求的规则是比特币为了实现工作量证明 Proof of Work 的共识机制而添加的, 并不是区块链的一个必要特征)

  怎么变? 添加一个随机数(Nonce)

  假如现在有顺序产生的数据块 A, B , C 。 我们来这样计算hash头。 注意 “||” 表示拼接

h0=  Hash(A|| Nonce0) 
h1 = Hash(B || h0 || Nonce1)
h2 = Hash(C || h1 || Nonce2)

  这里我们还添加一个额外的要求, 就是 h0, h1, h2 必须都得是以指定数目的0 bit开头的

  例如要求每个哈希值都必须以5个0开头,则h0,h1,h2都应该是这样的形式(00000*****************)

  添加了这个要求以后, h0, h1, h2就都不是那么容易计算的了, 因为你不能根据输出的形式来反推输入是什么,

    而A, B, C又是给定的, 那只能不断更改Nonce来穷举计算, 然后找到一个可以满足要求的Nonce值 ,使得h0, h1, h2符合要求

 

  到这里大家就知道所谓的矿工是在干什么了, 就是接受广播出来的数据块,然后计算当前最新的哈希链的头部, 当成功计算出了一个符合要求的Hash后, 就告诉所有人,自己找到了, 让别人再去计算下一个哈希头部。

转自:
作者:萧萧
链接:https://www.zhihu.com/question/31112808/answer/122099628
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

posted @ 2021-11-28 14:57  jojoNote  阅读(118)  评论(0编辑  收藏  举报