最近几年比特币的火爆带动了人们对区块链技术的研究当然我们在这里并不讨论区块链技术本身, 而是讨论一下区块链中的 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 具有相似特性的其它算法
来源: http://www.bubuko.com/infodetail-2544773.html