信息摘要算法之七:SHA在区块链中的应用
最近几年比特币的火爆带动了人们对区块链技术的研究。当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的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具有相似特性的其它算法。
欢迎关注:

信息摘要算法之七:SHA在区块链中的应用的更多相关文章
- 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现
在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...
- VRF在区块链中的应用
最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...
- Merkle tree在区块链中的应用
上篇博文我们转载了一篇<Merkle Tree(默克尔树)算法解析>,那么大家是不是会有疑问,学习这个算法之后,我们改怎么去应用,区块链中又是如何应用的?今天这篇博客就以Merkle tr ...
- 区块链中的密码学(四)- Merkle树和SPV节点
什么是Merkle Tree? Merkle Tree 的命名来自于美国密码学家Ralph C. Merkle ,关于他的个人资料:传送门https://en.wikipedia.org/wiki/R ...
- 【以太坊开发】区块链中的预言机:Oraclize原理介绍
智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的. 工作原理: 智能合约通过对Oraclize发布一个合约之间的调用请求来 ...
- 区块链中的密码学(二)-RSA算法分析和实现
密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...
- iFace安全专家揭秘:存放在区块链钱包中的比特币,其实已经早就不属于你……
自MoreToken钱包跑路之后,2019年3月以来陆续多个钱包.交易所跑路,造成了大量用户账户被盗,仅MoreToken钱包用户损失总价值就达12.2亿人民币,用户损失惨重.为什么这么多钱包.交易所 ...
- 区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名
☞ ░ 前往老猿Python博文目录 ░ 在Hyperledger Fabric区块链中,有背书节点进行背书,Hyperledger Fabric 使用背书策略来定义哪些节点需要执行交易. Hyper ...
- 50行Python代码构建小型区块链
本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...
随机推荐
- 【Django】git建仓上传时遇到的小问题
根据教程 http://tutorial.djangogirls.org/zh/deploy/,在github上建仓上传项目文件. 执行到 git push -u origin master 时,输入 ...
- STLINK V2安装使用详解
1. 解压st-link_v2_usb driver.zip文件. 2. 运行解压后的st-link_v2_usbdriver.exe文件,安装STLINK V2驱动程序.安装路 ...
- Docker --rm 自动清理容器内部临时文件
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据. 清除断掉链接的容器缓存
- [C++]动态规划系列之Warshall算法
/** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...
- namecheap域名设置Cloudflare为第三方DNS
待更……等我搞完了就来写总结
- cpp 常量函数(函数后加const)
const用在成员函数后 主要是针对类的const 对象 如: class Text{ public: void printconst(void)const{cout<<" ...
- 深入理解内存模型JMM
JMM(java memory model)java内存模型主要目标是定义程序中的变量,(此处所指的变量是实例字段.静态字段等,不包含局部变量和函数参数,因为这两种是线程私有无法共享)在虚拟机中存储到 ...
- Java基础_0303:封装性初步
class Book { // 定义一个新的类 private String title; // 书的名字 private double price; // 书的价格 public void getI ...
- Python 8 - Socket编程进阶
本节内容: 1.Socket语法及相关 2.SocketServer实现多并发 Socket语法及相关 socket 概念 socket本质上就是在2台网络互通的电脑之间架设一个通道,两台 ...
- ajax传递数组,后台更新
js: var rows = $("#stu_reg_table").datagrid("getSelections"); if(rows != "& ...