最近几年比特币的火爆带动了人们对区块链技术的研究。当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用。对于SHA系列算法我们已经在前面作了说明,在这里也不再重复。
1、区块链中的SHA
区块链中用到了SHA,可是究竟什么地方使用到了SHA算法呢?为了解决这个问题,我们必须先来了解下区块链的组成结构。每个区块都包括了一个被称为魔法数的常数、区块的大小、区块头、区块所包含的交易数量及部分或所有的近期新交易。区块的具体结构如下所示:
数据项 |
描述 |
长度 |
Magic no(魔法数) |
总是0xD9B4BEF9 |
4字节 |
Blocksize(区块大小) |
到区块结束的字节长度 |
4字节 |
Blockheader(区块头) |
包含6个数据项 |
80字节 |
Transaction counter(交易数量) |
正整数VI=VarInt |
1-9字节 |
Transactions(交易) |
交易列表(非空) |
<Transaction counter>-许多交易 |
从上表中我们似乎并没有发现SHA的踪影。上表中除了区块头,其他部分的含义都是非常明确的。所以接下来我们就需要中点看一下区块头,看看它究竟是什么含义。事实上,在每个区块中,对整个区块链起决定作用的是区块头。既然如此,拿去块头又有哪些内容呢?其具体的结构如下:
数据项 |
目的 |
更新时间 |
大小(字节) |
Version(版本) |
区块版本号 |
更新软件后,它指定了一个新的版本号 |
4 |
hashPrevBlock(前一区块的Hash) |
前一区块的256位Hash值 |
新的区块进来时 |
32 |
hashMerkleRoot Merkle(根节点Hash值) |
基于一个区块中所有交易的256位Hash值 |
接受一个交易时 |
32 |
Time(时间戳) |
从1970-01-01 00:00 UTC开始到现在,以秒为单位的当前时间戳 |
每几秒就更新 |
4 |
Bits(当前目标的Hash值) |
压缩格式的当前目标Hash值 |
当挖矿难度调整时 |
4 |
Nonce(随机数) |
从0开始的32位随机数 |
产生Hash时(每次产生Hash随机数时都要增长) |
4 |
如上表所示,在这个区块头的结构中,我们终于看到了SHA的踪影,就是hash值,它就是通过SHA算法计算得到的。
2、区块链如何使用SHA
在上一节,我们明白了SHA在区块中的位置,那么在区块链中究竟是如何使用SHA的呢?我们再看一看前面区块头的格式,有两个256位的Hash值:hashPrevBlock(前一区块的Hash)和hashMerkleRoot Merkle(区块体的Hash值),这两个Hash值是如何我得到的呢?
前一区块的Hash值采用的计算公式为:前一区块的Hash值=SHA256(前一区块的区块头);而区块体的Hash值采用的计算公式为:区块体的Hash值=SHA256(本区块的区块体)。
由上面两个计算公式我们不难推断,一个区块不但与自身的内容有关,同时也与前一个区块的内容有关。也就是说一个区块的内容不但影响自身,而且对后续的区块都有影响。因为任何内容的变化,都会导致本区块Hash值的变化,从而导致区块头的变化。而区块头的变化就会导致后续区块的区块头的变化出现连锁反应。
3、区块链为何使用SHA
前面我们已经说明了区块链中如何使用Hash值,接下来我们来说一说为何要使用SHA。这与区块链的技术要求以及SHA算法的特性有直接的关系。
首先,区块链本身要保证每一条都是独一无二。因为绝不能出现两条一样的数据,而SHA256极低的碰撞概率正好能够保证这一点。每个区块的Hash之都是唯一的正好可以用来标识该区块。
其次,区块链要保证每条记录的安全性,而SHA算法可以保证哪怕只有微不足道的差别,也能产生大相径庭的结果。结合区块链的结构,当任意区块发生变化时,都会影响后续的所有区块,所以如果想要修改某个区块的内容,就必须修改后许所有区块的内容,而这几乎是不可能的,从而保证了区块数据的安全。
再者,SHA的结果长度是固定的,而与具体的原文内容无关,这样可以保证区块链中每个区块的格式以及用来标识区块的区块头的大小是完全一致的,但却绝对不会重复。
综上所述,区块链使用SHA算法是一种技术上的必然选择,即使不采用SHA也必是与SHA具有相似特性的其它算法。
欢迎关注: