区块链知识分享——Hash

Hash 是什么?

Hash 哈希算法。密码哈希函数是一类数学函数,可以在有限合

理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称为散列值。以哈希函数为基础构造的哈希算法,在现代密码学中扮演着重要的角色,常用于实现数据完整性和实体认证,同时也构成多种密码体制和协议的安全保障。

碰撞是与哈希函数相关的重要概念,体现着哈希函数的安全性,所谓碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值。哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。

在比特币系统中使用了两个密码学哈希函数,一个是 SHA256,另一个是 RIPEMD160。

RIPEMD160 主要用于生成比特币地址,我们着重分析比特币中

用得最多的 SHA256 算法。

SHA256 属于著名的 SHA 家族一员。SHA(Secure Hash Algorithm,安全哈希算法)是一类由美国国家标准与技术研究院(NIST)发布的密码哈希函数。正式名称为 SHA 的第一个成员发布于 1993 年,两年之后,著名的 SHA-1 发布,之后另外的 4 种变体相继发布,包括SHA224、SHA256、SHA384 和 SHA512,这些算法也被称作 SHA2。SHA256 算法是 SHA2 算法簇中的一类。对于长度小于 2^{64}位的消息,SHA256 会产生一个 256 位的消息摘要。

SHA256 具有密码哈希函数的一般特性。SHA256 是构造区块链所用的主要密码哈希函数。无论是区块的头部信息还是交易数据,都使用这个哈希函数去计算相关数据的哈希

值,以保证数据的完整性。同时,在比特币系统中,基于寻找给定前缀的 SHA256 哈希值,设计了工作量证明的共识机制;SHA256 也被用于构造比特币地址,即用来识别不同的用户。

SHA256 是一个 Merkle-Damgard 结构的迭代哈希函数,其计算过程分为两个阶段:消息的预处理和主循环。在消息的预处理阶段,主要完成消息的填充和扩展填充,将所输入的原始消息转化为 n 个 512比特的消息块,之后对每个消息块利用 SHA256 压缩函数进行处理,SHA256 的计算流程如图

区块链知识分享——Hash

在比特币系统中,SHA256 算法的一个主要用途是完成 PoW(工作量证明)计算。按照比特币的设计初衷,PoW 要求钱包(节点)数和算力值大致匹配,因为需要通过 CPU 的计算能力来进行投票。然而随着人们对 SHA256 的计算由 CPU 逐渐升级到 GPU,到 FPGA,直至到 ASIC 矿机,这使得节点数和 PoW 算力也渐渐失配。解决这个问题的一个思路是引入另外的一些哈希函数来实现 PoW。

scrypt 算法最早用于基于口令的密钥生成,该算法进行多次带参数的 SHA256 计算,即基于 SHA256 的消息认证码计算,这类计算需要大量的内存支持。

采用 scrypt 算法进行 PoW 计算,将 PoW 计算由已有的拼算力在一定程度上转化为拼内存,能够使得节点数和 PoW 的计算力的失配

现象得到缓解。

莱特币就是采用 scrypt 算法完成 PoW 计算的。SHA3 算法是 2012 年 10 月由 NIST 所选定的下一代密码哈希算法。在遴选 SHA3 算法过程中人们提出了一系列的候选算法,包括了BLAKE、Grostl、JH、Keccak、Skein、ECHO、Luffa、BMW、CubeHash、SHAvite、SMID 等,最后胜出的是 Keccak 算法。达世币(DASH,原名暗黑币,DarkCoin)定义了顺序调用上述 11 个哈希算法的 X11 算法,并利用这个算法完成 PoW 的计算力能够保持一定程度上的匹配。


分享到:


相關文章: