什么是区块?
区块(Block)本质上是一个数据块。该数据块存放着一系列交易,用于验证交易信息有效性和生成下一个区块。由这样一个一个的区块按照一定规则有序链接起来的数据结构就是区块链。区块即是区块链的基本构成单位。
区块结构
概括而言,区块由区块头和区块主体构成。其中,区块头中包括一组元数据;区块主体则是一系列交易列表。因此也可以简单理解为:区块=区块头+交易。区块结构具体如下图:
区块头
区块头的长度为80字节,在整体区块中所占体量较小。其包含的元数据为:区块版本、前个区块哈希、Merkle Root哈希、时间戳、Bits难度、随机数Nonce六大部分。
字段 | 字节 | 说明 |
区块版本 | 4字节 | 区块版本号,表示本区块遵守的验证规则 |
前个区块哈希 | 32字节 | 前一区块的哈希值,由SHA256算法计算得来 |
Merkle Root哈希 | 32字节 | 当前区块中交易的Merkle Root哈希值 |
时间戳 | 4字节 | 当前区块产生的近似时间 |
Bits难度 | 4字节 | 该区块工作量证明算法的难度目标 |
随机数Nonce | 4字节 | 满足工作量证明算法难度目标的随机数 |
1.区块版本
区块版本是指区块版本号,用以标识交易版本和当前区块交易所参照的验证规则。可以理解为,类似安卓1.0,区块也拥有自己的版本号。
2.前个区块哈希
前个区块哈希,顾名思义是指对前一个区块的区块头数据进行哈希计算得来的哈希值,也被称为“父区块哈希值”。其作用是使得每个新挖出的区块都能按照秩序链接在前一个区块后面。根据该规则,从当前的区块可以一直追溯到创世区块。
3.Merkle Root哈希
区块链中的每个区块都包含了产生于该区块的所有交易,这些交易会以Merkle Tree来表示。所谓的Merkle Tree是一种树形数据结构,其作用是归纳一个区块中的所有交易,同时生成整个交易集合的数字签名,即Merkle Root哈希。其具体计算方式如下:
(1)从区块交易列表中获取每对Txid,并对它们进行两次SHA256运算,得到哈希值。
(2)如果为奇数,则复制一份凑成偶数再进行两次SHA256运算,得到哈希值。
(3)然后以此递归(1)、(2),直到区块中的所有交易运算结束,最终获得一个哈希,即Merkle Root。
4.时间戳
时间戳是指当前区块产生的近似时间,具体会精确到秒。其主要作用是保证整条链上的区块都按照时间顺序进行排列。
5.Bits难度
Bits难度是指挖矿目标难度Target的压缩形式。难度目标值是比特币区块链网络为了调节挖矿难度而设置的一种机制,以保证挖矿速度在10分钟左右。每生成2016个区块后(每两周)就重新计算一次难度目标。
6.随机数Nonce
Nonce是指满足工作量证明算法难度目标的随机数,也就是我们常说的“挖矿”随机数。节点需要对区块头数据进行不断的哈希运算,直至找到能使区块哈希小于挖矿目标难度Target的随机数。
区块主体-交易
1.Coinbase交易
每个区块中第一笔交易都是Coinbase交易,用于奖励矿工将交易打包进区块。奖励分为两部分:区块奖励+除Coinbase交易外的其他交易手续费总和。
2.交易结构
当前比特币交易存在两种交易结构,即比特币白皮书中定义的交易结构和新的隔离见证交易结构。两者的不同之处在于:白皮书定义的交易结构将签名数据放在交易输入里;隔离见证则将签名数据“分离”出来,放在交易时间锁之前。