我们都知道,关于区块链有很多重要元素。我们经常讨论的主要是区块和链这两个要素,其实它还有三个重要元素,分别是加密、默克尔根和工作量证明。下面,就跟着小编一起来看这五个元素到底是什么吧!

一.加密


    加密是区块链中最重要的元素,这是区块链的根基,没有加密,区块链就无从谈起。区块链使用的是SHA-256哈希散列算法进行加密,它是美国国家安全局研发的。简单的理解,它就是一个加密函数。函数的执行效果是,无论你给这个函数传入任何不同信息内容(最大长度限制2^64位),都会产生长度固定(256位)但内容不同的结果,这个结果被称为哈希值,也被称作报文摘要。

    这个函数的最大特点就是,验证一个哈希值是不是一段给定信息内容的哈希值很容易,我们只要把这个信息内容放入哈希函数里进行计算,然后比对计算结果即可。但是如果我们想破解一个哈希值,得到精准的原信息内容,这几乎是不可能的。能知道这个哈希值原信息内容的人只有两个,一个是原信息内容的拥有者,另外一个就是上帝。

二.区块


    区块是用来记录实际数据的。区块包含两个部分,一个是区块头,一个是区块体。区块头主要记录该区块信息特征,例如:区块体的默克尔树的根,难度系数,工作量证明,区块创建时间,前一个区块的哈希值等。区块体主要记录应用场景的实际数据及默克尔树。比如,区块链应用在比特币场景时,区块体记录的是2000多条交易记录,以及这2000多条交易记录生成的默克尔树数据。需要注意的是,本区块的哈希值,是对区块头信息进行哈希,而不是对整个区块。

三.默克尔树

    默克尔树又称为哈希树,是一种数据存储结构。它由一个根节点、一些枝干节点和一些叶子节点组成。在区块链之前,最经典的应用场景就是P2P下载。区块链在BTC应用中,默克尔树是二叉树,它是一个特殊的哈希树。要求叶子的数量是偶数,每两个叶子连在一个枝干上,然后每两个枝干连在同一个父枝干上,不断的汇总,最终连在一个根节点上。具体实现是,把每一条支付信息进行哈希加密分别得到一个哈希值,然后再每两个哈希值拼接作为信息内容再次进行哈希加密,就这样不停加密,直到最后生成的一个哈希值,这个哈希值就是默克尔树的根,它也会被写进区块头里。如果有记录被篡改,那么会影响到根的哈希值。这样就可以防止篡改一个区块内的某条记录。


    说到这,可能有些读者会问,为什么不把所有的叶子数据做个拼接,然后只进行一次哈希加密,这样一样也可以达到防篡改的目的。没错,这样是可以达到记录防篡改的目的,但是,这样做的缺点是,整个区块链要始终保存这些叶子数据,如果这些数据随着时间的推移,没有必要再存储,或者区块链的存储太大需要删减的时候,就尴尬了,一旦删除了这些叶子数据,就无法对根哈希值进行验证了。

    另一个原因,分布式存储,数据同步是非常占用网络资源的,所以当本地节点有不同步情况,我们希望的是,只下载同步某些没同步的记录,而不用下载整个区块的数据,这样效率最高,也最节省网络资源。如果读者之前使用过BT下载软件,那么就比较容易理解这个概念了。使用哈希二叉树很容易找到没有同步的记录,1024条记录,我们只需要10步查找,就能定位是哪条数据没有同步,1024*1024条数据,也只需要20次的查找。这种查找效率是非常高的了。

四.链

    区块链中的链并不像区块那样是一个物理存在,它是一个逻辑概念。其表现为,每个区块头都存储上一个区块的哈希值,而每个区块头在进行哈希加密的时候,一定是包含上一块哈希值。这样,一个个的区块,就从逻辑上,形成了一个有序的链条,并且,区块一旦加入到了这个链条中,如果想要篡改某个区块,那就要篡改该区块以及该区块之后的所有区块信息。这种篡改的时间成本是非常高昂的。如果默克尔树是保证区块本身防篡改的话,那么链就保证了整个区块链生态系统防篡改。


    如果,同一时间,有两个区块加入到了区块链的尾端,那么该怎么处理呢?区块链的处理机制是长链优先,在比特币场景下的实际处理方式是,哪一个分叉最先达到6个区块,就把其他的分叉废弃。已经同步这些废弃分叉数据的节点,重新同步最新数据。

    长链优先机制本意是最长链,生长最快的链,是最可信的链,因为只有大多数人相信这条分叉的链,这条分叉才能生长最快。但如果有人拥有了全网51%的计算能力,或者有51%的人联合起来的话,那么这条长链就不可信了,这也就是区块链致命弱点。

五.工作量证明

    我们知道,一个固定的内容只能产生一个固定的哈希值,这个值也许大于这个临界值,也许小于这个临界值。如果大于了这个临界值,岂不是被剥夺了加入区块链的权利?设计者是这样规定的,在对区块头进行哈希加密的之前,加入一个叫随机值,这个随机值也是区块头信息的一部分。然后再进行哈希加密计算。如果结果符合要求,就加入区块链,如果结果不符合要求,就换一个随机值,再次计算,直到符合要求为止。

    这个临界值是由一个常量/难度系数决定的,难度系数越大,这个结果就越小。结果越小,就意味着命中成功的概率越小,计算的次数就越多,耗费的时间就越久。比特币系统会动态调整这个难度系数。如果全网平均区块加入链的时间小于10分钟,那么就会提高难度系数。如果大于10分钟,就会降低难度系数。最终是要保证区块大约在10分钟左右加入链。

    一旦找到符合要求的随机值,那么这个随机值就被叫做工作量证明。意思就是说,这个区块是经过大量的计算才加入进来的,这个随机数,就是工作量的最好证明。