结构详解

首先,区块是一种被包含在公开帐簿(区块链)里聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。区块头是80字节,而平均每个交易至少是250字节,并且平均每个区块至少包含超过500个交易信息。因而,一个包含所有交易的完整区块比区块头大1000倍不止,如下表:
区块结构

大小字段描述
4字节区块大小用字节表示的该字段之后的区块大小
80字节区块头组成区块头的几个字段
1-9 (可变整数)交易计数器交易的数量
可变的交易记录在区块里的交易信息

区块头

区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关,详见第8章。第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)。如下表:

区块头结构

大小字段描述
4字节版本版本号,用于跟踪软件/协议的更新
32字节父区块哈希值引用区块链中父区块的哈希值
32字节Merkle根该区块中交易的merkle树根的哈希值
4字节时间戳该区块产生的近似时间(精确到秒的Unix时间戳)
4字节难度目标该区块工作量证明算法的难度目标
4字节Nonce用于工作量证明算法的计数器

Nonce、难度目标和时间戳会用于挖矿过程。

区块标识符:区块头哈希值和区块高度

区块主标识符是它的加密哈希值,一个通过SHSA256算法对区块头进行二次哈希计算而得到的数字指纹。产生的32字节哈希值被称为区块哈希值,但是更准确的说是:区块头哈希值,因为只有区块头被用于计算。例如:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f是第一个比特币区块的区块哈希值。

区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。
请注意,区块哈希值实际上并不包含区块的数据结构里,不管是该区块在网络传输时,或者是它作为区块链的一部分被存储在某个节点的永久性设备上时。相反区块哈希值是当该区块从网络被接受时由每个节点计算出来的。区块的哈希值可能会作为区块元数据的一部分被储存在一个独立的数据库表中,以便于索引和更快地从磁盘检索区块。
第二种识别区块的方式是通过该区块在区块链中的位置,即“区块高度(block height)”。第一个区块,其区块高度为0,和之前哈希值:

00000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

所引用的区块为同一个区块。因此,区块可以通过两种方式被识别:区块哈希值或者区块高度。每一个随后被存储在第一个区块之上的区块在区块链中都比前一区块“高”出一个位置,就像箱子一个接一个堆叠在其他箱子之上。2014年1月1日的区块高度大约是278,000,说明已经有278,000个区块被堆叠在2009年1月创建的第一个区块之上。
和区块哈希值不同的是,区块高度并不是唯一的标识符。虽然一个单一的区块总是会有一个明确的、固定的区块高度,但反过来却不成立,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能具有相同的区块高度,在区块链里争夺同一位置。区块高度也不是区块数据结构的一部分,它并不被存储在区块里。当节点接收来自比特币网络的区块时,会动态地识别该区块在区块链里地位置(区块高度)。区块高度也可作为元数据存储在一个索引数据库表中以便快速检索。

一个区块的区块哈希值总是能唯一地识别出一个特定区块。一个区块也总是有特定的区块高度。但是,一个特定的区块高度并不一定总是能唯一地识别出一个特定区块。更确切地说,两个或者更多数量的区块也许会为了区块链中的一个位置而竞争。

创世区块

区块链里的第一个区块创建于2009年,被称为创始区块。它是区块链里所有区块的共同祖先,这意味着你从任意区块,循链向后回溯,最终都将到达创世区块。
因为创世区块被编入到比特币客户端软件里,所以每一个节点都始于至少包含一个区块的区块链,这能确保创世区块不会被改变。每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。因此,每个节点都把该区块作为区块链的首区块,从而构建了一个安全的、可信的区块链的根。
创始区块的哈希值:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

区块的链接 ##这里写图片描述

//区块通过引用父区块头哈希值的方式,以链条的形式进行相连

默克尔树(Merkle Tree)

区块链中的每个区块都包含了产生于该区块的所有交易,且以Merkle Tree表示。
Merkle Tree是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值。术语“树”在计算机学科常常用来表达具有分支的数据结构,但是树常常被道指显示(从小到大,从起始到发展这个规模我们应该能接受)。
在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点进行哈希,并将新生成地哈希节点插入到Merkle Tree中,直到只剩一个哈希节点,该节点就是Merkle Tree的根。在比特币的Merkle Tree中两次使用到了SHA256算法,因此其加密哈希算法也被称为double-SHA256。
当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。
Merkle树是自底向上搭建的,在如下例子中,我们从A、B、C、D四个构成Merkle树树叶的交易开始

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐