玩转瑞士军刀——哈希算法在区块链中的应用

Posted 智能之河

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转瑞士军刀——哈希算法在区块链中的应用相关的知识,希望对你有一定的参考价值。

引言:不知道大家有没有用过瑞士军刀?它也叫做万用刀,在折叠小刀身上配备有锥子、罐头起子和螺丝刀等许多工具,非常方便实用,可用在日常生活中的很多地方。今天说的哈希算法就是密码学中的瑞士军刀。如果说共识算法是区块链的灵魂,那为了保证价值的可靠传输,密码算法可谓构建了区块链的骨架,区块链的设计中处处可见密码学的身影,其中应用最为广泛的是哈希算法。

 

哈希算法是什么?


哈希算法是密码学里的一类算法,可将任意长的数据压缩成一个固定长的数据(信息摘要),又称为散列算法或摘要算法。

Hk(x)=y,其中x是无限的集合,y是有限的集合。

送入哈希算法的数据稍有不同,就会得到自己独一无二的编码,相当于计算出一个身份证号或者得到一个指纹。哈希算法是单向的,无法通过计算后的结果还原出原始数据。


密码学中常用的哈希算法有MD5、SHA1、SHA2、SHA3、RIPEMD160,其中比特币区块链中用的比较多的是SHA2和RIPEMD160。SHA2是SHA算法家族的第二代,SHA256是其中一员,它将任意长的数据通过算法压缩成一个固定长为256比特的数据;而RIPEMD160则是一个160位加密哈希函数。

    

哈希算法有什么优点?


一是空间少。哈希算法能将任意长的输入压缩成固定长且短的数据,节省存储空间。

二是速度快。哈希算法直接通过关键字得到要存取的记录存储位置,存取非常快。

三是特征化。输入数据间细微的差异经过哈希后,输出有巨大的差异。

四是不可逆。保证了数据的完整性,对数据盲化,保护了数据的隐私。

 

哈希算法在区块链中的应用


前面说过,哈希算法是密码学中的瑞士军刀,在区块链中有很多各具特色的应用,同时不同的应用会用到其不同的特性。下面我们就看看哈希函数在比特币区块链中的几个主要应用,其中都用到了哈希函数的哪些特性。

 

一是挖矿,即解一个哈希不等式。

挖矿其实就是工作量证明(PoW),在以前的文章中对PoW有详细阐释。对比特币而言,矿工(通过不断重复哈希运算来产生PoW的各网络节点)必须要在满足全网目标难度的情况下求解SHA256算法。 

SHA256^2(PreB|| Timestamp || Merkle Root ||…||Nonce)<Target 

上面的哈希不等式中SHA256^2代表进行了两次SHA256计算,以抵御像彩虹表这样破解哈希算法的攻击。传入的计算参数都是区块头的组成部分,如PreB指的是前一个区块的哈希值。

 

如果计算出来的值小于难度目标值(Target——使整个网络的计算力大约每10分钟产生一个区块所需要的难度数值。整个网络会通过调整这个变量来控制生成PoW所需要的计算力,每产生2,106个区块后会根据之前2,106个区块的算力进行难度调整),则挖矿成功。简而言之,挖矿就是重复计算区块头的哈希值,不断修改参数,直到找到与难度目标值匹配的随机数的过程,这有些类似深度学习里的调参。

 

这些计算参数中能改变的只有梅克尔根(Merkle Root)、区块时间戳(Timestamp)和随机数(Nonce)。比如区块时间戳,指UNIX时间戳,用于记录区块的产生时间,分布式的网络系统没有固定的时间服务器,每个节点获得的时间戳都可能不一样,因此设置了规则,合法的时间戳必须大于前11个区块的中位数,并且小于网络调整时间+2小时。 要通过像这样的参数来计算出符合条件的值,基本上也就只能靠暴力计算了。这种不断执行SHA256计算的过程很消耗算力,因此被形象地称为挖矿。在挖矿这个典型应用中实际上用到了哈希算法速度快和特征化这两个特点。 

 

 

第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源,生成私钥。生成一个比特币私钥在本质上与“在1到2256之间随机选一个数”无异。

第二步是通过椭圆曲线算法从私钥生成公钥,这不是本篇文章的重点,这里不做详细介绍。

                           

假设m是一个56字节串,第一个字节表示椭圆曲线上的点P的存储类型,后面55字节是点P,第一步计算哈希值SHA256(m)=A,将m压缩成32字节;第二步计算哈希值RIPEMD160(A)=B,将A压缩成20字节。 这样可以进一步加强安全性,降低碰撞的概率,防止攻击。       

 

三是生成梅克尔树(Merkle Tree)结构。

梅克尔树在比特币中其实就是一棵二叉树。它是对一个区块中所有的交易事务进行两两哈希计算,得到的哈希值再两两哈希计算,这样递归计算生成一棵二叉树,也称哈希树,树的顶部为“梅克尔根”(Merkle Root),放在区块头中。通过这样组织的数据结构,很容易知道区块中的交易信息是否被篡改;而如果被篡改了,还能知道是第几块的信息被篡改了。 

在分布式的网络架构中,一个节点同步自己的区块链账本数据,是通过与其他节点通信实现的。那下载区块数据时,如何校验数据是否有问题呢?这时,梅克尔树就发挥作用了,因为哈希算法的特点,只要参与计算的数据发生一点点的变更,计算出的哈希值就会改变。这其实就是二叉树查询,快速发现出问题的数据块,将原来大块的区块数据切分成小块处理。简单支付验证(SPV)原理的钱包也是使用了梅克尔树来验证支付是否已经发生。

这里用到了哈希算法特征化和不可逆的特点。

 

四是形成区块链(哈希链)。

区块哈希就是对区块头进行哈希计算,得出某个区块的哈希值,用这个哈希值可以唯一确定某个区块,相当于给区块设定了一个身份证号,而区块与区块之间就是通过身份证号进行串联,从而形成了一个链式的结构。哈希值相当于一个指针,检验信息是否被篡改,如果信息被篡改,那么其哈希值和哈希指针的值必定是不等的。

这里也用到了哈希算法特征化不可逆的特点。

 


以上是关于玩转瑞士军刀——哈希算法在区块链中的应用的主要内容,如果未能解决你的问题,请参考以下文章

1.3.1 区块链中的加密算法——Hash算法(更新)

详解在区块链中的POW和哈希算法

区块链中的加密算法:Hash算法之SHA256算法

币图细说—区块链中的密码学

币图细说—区块链中的密码学

百科技:区块链中的密码学——哈希算法和非对称加密!