比特币的区块哈希算法采用双重sha256算法。为什么不用一重sha256算法?这是因为SHA1在2017你那被攻破,采用的方法是birthday collision attack。社区觉得SHA2被攻破也是时间的问题,而抵御birthday collision attack的有效方法为双重哈希算法。(这是网上的说法,但真实性待定)
我个人也是更倾向同意评论下的看法,就是不用再担心长度延展问题,因为一次hash,可能可以构造出看起来有意义的区块头,但是两重hash是不可能的。
##比特币的字段存储采用小端模式
数据高字节存在区块的高字节地址。注意,字节是基本单元!
##算法的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'