区块头是一个区块中最重要的部分。主要包括版本信息字段、父区块哈希值、Merkle树根、时间戳、Demo、难度目标和nonce值。
(1)版本信息标识了该区块中交易的版本和所参照的规则。
(2)父区块哈希值实现了区块数据间的链状连接。
(3)Merke树的根值实现了将区块中所有交易信息逐层成对地整合归纳,最终通过一个哈希值
将所有信息包含在区块头中。
(4)时间戳以UNIX纪元时间编码,即自1970年1月1日0时到当下总共流逝的秒数。
(5)难度目标定义了矿工需要进行挖矿的工作量证明的难度值,根据实际新区块挖掘出的速度,难度目标值会进行调整,最终保证平均10min-一个新区块。
(6)nonce是一个随机值,初始值为0,矿工挖矿就是找到一合适的nonce值,使得区块头的哈希值小于难度目标。
区块主体中主要存储交易信息,矿工将经过全网验证的交易通过Merkle树的方式表示。如图2-18
所示,假设有8笔交易,分别为交易1、交易2、….、交易8,Merkle树首先对交易内容进行哈希计算,每笔交易得出对应的哈希值,然后再对交易哈希值进行两个一组的哈希计算,以此类推,最后的哈希
值就是存储在区块头中的Merkle根。Merkle根通过哈希计算的方式实现了对区块中所有交易记录的
有效总结。另外,根据哈希运算的特性,Merke根能够快速验证交易数据的完整性和准确性,只要看
人对其中一笔交易进行了算改,哪怕只有一个小数点,Merkle根便会直观地显示出来
哈希性质:
(1)单向性。That is,given an input number,it is easy to calculate its hash value,but given a hash value,the original input number cannot be obtained according to the same algorithm.
(2)弱抗碰撞性。That is,given an input number,it is computationally infeasible to find another hash value to get a given number when using the same method.
(3)强抗碰撞性。That is,for any two different input numbers,it is not feasible to calculate the same hash value according to the same algorithm.
简单解释:哈希(Hash)算法,即散列函数。它是种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。
哈希算法(散列算法或者消息摘要算法)是信息存储和查询所用的项基本技术,它是一种基于Hash函数的文件构造方法,把给定的任意长关键宇映射为一个固定长度的哈希值,一般用于鉴权、认证、加密、索引等。其主要优点是运算简单,预处理时间较短,内存消耗低,匹配查找速度比较快,便于维护和刷新,支持匹配规则数多等。
// HashMap.javastatic class Node implements Map.Entry {// 定位数组索引位置final int hash;// 键final K key;// 值V value;// 链表的下一个节点Node next;Node(int hash, K key, V value, Node next) {this.hash = hash;this.key = key;this.value = value;this.next = next;}public final K getKey() { return key; }public final V getValue() { return value; }public final String toString() { return key + "=" + value; }public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value);}public final V setValue(V newValue) {V oldValue = value;value = newValue;return oldValue;}public final boolean equals(Object o) {if (o == this)return true;if (o instanceof Map.Entry) {Map.Entry e = (Map.Entry)o;// 判断key和value是否都相等if (Objects.equals(key, e.getKey()) &&Objects.equals(value, e.getValue()))// 如果key和value都相等,就返回truereturn true;}// 如果key或者value不相等,就返回falsereturn false;}}