比特币的区块哈希算法

比特币的区块哈希算法采用双重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)) SHA256(SHA256(Block_Header))

区块头的6个字段

比特币的区块哈希算法_第1张图片

比特币的字段存储采用小端模式

数据高字节存在区块的高字节地址。注意,字节是基本单元!

算法的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'

更多

你可能感兴趣的:(blockchain,bitcoin,2018)