美文网首页
二、区块链的技术原理—Hash算法

二、区块链的技术原理—Hash算法

作者: VZzzzzz | 来源:发表于2019-06-25 21:33 被阅读0次

    前篇文章中我们对区块链已经有了基本的了解,这篇文章将带领大家深入理解区块链背后的底层原理。

    在了解区块链的具体原理之前,我们需要知道很重要的一点就是区块链的组成,如果从字面意思理解,区块链是由“区块”组成的链条,从技术的角度理解,区块链是一种分布式数据库。
    简单来说,区块链是由无数个“区块”这个基本单元所构成。如果把区块链比作一支账本,那么区块就是这个账本的一页。

    “区块”如此重要,以至于我们只有了解了“”区块“”,才能真正的理解区块链。

    话不多说,原理篇我也会分为三个部分,分别为:

    • Hash算法
    • 区块结构
    • 核心算法

    1、 区块链原理—Hash算法篇

    Hash算法是区块链中最核心也是用法最广泛的算法,实际上大家对它并不陌生。在整个区块链中它有着贯穿全场的作用,这里给大家再做几点详细介绍。

    1.1. Hash的种类:

    Hash算法有很多种,如MD5、SHA系列等等,而SHA算法又分为SHA-1、SHA-224、SHA-256、SHA-384和SHA-512五种变体,区块链中用到的是SHA256,所以我们在这里会重点关注,后面会讲到。

    1.2.Hash算法的特点:

    (1)输入任意长度的字符串(x)可以得到长度固定的结果(H(x)),例如使用MD5算法:

    MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
    
    MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
    

    (2)输入敏感,输入数据的稍微改变就会引起Hash运算结果的面目全非,上面的例子中“version1”和“version2”仅仅是最后一位“1”和“2”的区别,得出来的结果却截然不同。

    (3)免碰撞,即不会出现输入x≠y但是H(x) = H(y)的情况,也就是强抗冲突性。

    (4)原像不可逆,通俗地说,指的是知道输入值,很容易通过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。

    (5) 难题友好性,不存在比穷举更好的方法,以使哈希结果H(x)落在特定的范围,换一种说法就是,没有便捷的方法去产生一满足特殊要求的哈希值。

    哈希函数的难题友好性构成了基于工作量证明的共识算法的基础,例如,给定字符串“blockchain”,并在这个字符串后面连接一个整数值串x,对连接后的字符串进行SHA256哈希运算,要求得到的哈希结果(以十六进制的形式表示)以若干个0开头的。按照这个规则,由x=1出发,递增x的值,我们需要经过2688次哈希计算才能找到前3位均为0的哈希值,而要找到前6位均为0的哈希值,则需进行620969次哈希计算。也就是说,没有更快捷的方法来产生一个满足要求的哈希结果。

    1.3、SHA-256算法

    SHA-256属于Hash算法中的一种,由美国国家安全局研发,又属于SHA算法的变种之一,是SHA-1的后继者。

    SHA256相对于其他的Hash算法来说,特点是对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。

    准确来说,SHA-256算法才是区块链的核心算法,区块中的共识挖矿、钱包的创建等等使用的都是SHA-256算法。

    1.4、Hash算法的运用。

    现在假设一种场景:

    网络传输数据的时候,A收到B的传过来的文件,需要确认收到的文件有没有损坏。如何解决?

    最简单的方法是对整个原始数据做Hash运算得到固定长度的Hash值,然后把得到的Hash值公布在网上,这样用户从可信的渠道下载到公布的Hash值之后,对数据再次进行Hash运算,比较运算结果和网上公布的Hash值进行比较,如果两个Hash值相等,说明数据在传输过程没有损坏(篡改),反之说明数据经过篡改或损坏。

    如果从一个稳定的服务器(可信的渠道)进行下载,采用单一Hash是可取的。但如果数据源不稳定,一旦数据损坏,就需要整个数据重新下载,这种下载的效率是很低的。

    为了解决这个问题,在P2P网络中做数据传输的时候,往往需要把文件拆分很多小的数据块各自传输,同时从多个机器上下载拆分过后不同的小数据块,这样的好处是,如果小数据块在传输过程中损坏了,那么只要重新下载这一块数据就行了,不用重新下载整个文件。

    但是这么做的话,新的问题又来了,怎么去验证小的数据块有没有损坏?

    答案是,下载之前我们会对每个小的数据块分别做Hash运算最终得到一个Hash List。在下载到真正数据之前,我们会先下载这个Hash List,对hash list中的每一个hash值进行比对。

    同样的问题又来了,怎么确定这个Hash List是正确的呢?

    有一种办法是对所有的小数据块进行Hash运算,得到每个小数据块的Hash值然后再用遍历的办法与原数据块的Hash值做一一对比,只有下载下来的hash list 和本地计算的hash list中的每一个hash值完全一直,我们才会认为这个hash list是有效的,嗯,好像是可以,但这种方法代价是不是太大呢,正常场景下数据量可是相当巨大的,这种方法的效率比较低下。

    为了解决这个问题,最开始在生成HashList的时候把每个小块数据的Hash值拼到一起,然后对这个长字符串再做一次Hash运算,这样就能得到一个最终的hash,这个最终的Hash值我们称之为Hash Root(Top Hash)。


    image

    所以,最终处理就是,下载数据的时候,首先确保从可信的数据源得到正确的根Hash,用它来校验整个Hash List,然后通过校验后的Hash List校验整个数据块。

    使用迅雷下载电影时,有时候会先让我们下载一个“种子”文件,这个种子文件的用处是什么呢,大家可以好好想想

    相关文章

      网友评论

          本文标题:二、区块链的技术原理—Hash算法

          本文链接:https://www.haomeiwen.com/subject/slixcctx.html