比特币的区块哈希算法

比特币的区块哈希算法采用双重sha256算法。为什么不用一重sha256算法?这是因为SHA1在2017你那被攻破,采用的方法是birthday collision attack。社区觉得SHA2被攻破也是时间的问题,而抵御birthday collision attack的有效方法为双重哈希算法。(这是网上的说法,但真实性待定)

我个人也是更倾向同意评论下的看法,就是不用再担心长度延展问题,因为一次hash,可能可以构造出看起来有意义的区块头,但是两重hash是不可能的。
S H A 256 ( S H A 256 ( B l o c k _ H e a d e r ) ) SHA256(SHA256(Block\_Header))

区块头的6个字段

这里写图片描述

##比特币的字段存储采用小端模式
数据高字节存在区块的高字节地址。注意,字节是基本单元!

##算法的Python实现
该算法对应的实际区块,可以对比看看Merkle Root等,了解什么是小端模式存储大端模式展示。Block Explore上用大端形式对区块小端存储数据作展示。

import hashlib # 分别对应上述的6个小端模式字段 header_hex = ("01000000" + "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" + "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" + "c7f5d74d" + "f2b9441a" + "42a14695") # 把string解码成hex的形式 header_bin = header_hex.decode('hex') # 双重hash hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest() # hash的小端模式结果,比特币区块中存的是这个结果 hash.encode('hex_codec') '1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000' # hash的大端模式结果 hash[::-1].encode('hex_codec') '00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d' 

更多

阅读更多

更多精彩内容