
2.1.1 区块数据结构
交易是区块链中最基本也最重要的数据结构。每笔交易中都封装了参与方之间的一次转账操作,经过验证的合法交易将被执行,并保存在区块链中,交易的执行是驱动区块链系统发生状态迁移的唯一途径,而区块是存储交易及相关元数据的数据结构。如图2-1所示,一般来说,区块可以分为区块头和区块体两部分,区块头存储该区块的元数据,区块体存储所有实际的交易结构。

图2-1 比特币中的区块数据结构
1. 区块头
在区块头(Block Header)中,区块哈希是对区块头进行两次SHA256(Secure Hash Algorithm,安全散列算法)运算得到的结果,区块哈希可以唯一地标识一个区块;父区块哈希为当前区块的前驱区块的哈希值,通过在区块头中存储该字段形成一种区块间的链式结构。
除区块哈希外,区块高度(Block Height)也可以用来标识区块,之所以称为“高度”,是因为我们往往将区块链视为一个垂直的栈式结构,栈底为0号区块,挖矿产生的新区块将不断加入栈顶,截止到2020年5月18日,比特币的区块高度已经到达630778。不同于区块哈希,区块高度有时无法唯一地标识某一个区块,出现这种情况表明区块链产生了分叉(Fork)。
在比特币中[1],默克尔根是通过特定算法对区块内所有交易进行计算得到的哈希值,以太坊[2]和Hyperledger Fabric[3]的区块头中除了包含交易的默克尔根,还包含一个针对账本状态的默克尔根。此外,以太坊还包含一个针对交易回执的默克尔根。在2.3节将更深入地介绍默克尔根的概念。
在比特币与以太坊这类基于PoW共识算法进行共识的公有链中,区块头还包含如难度、随机数等与共识过程相关的字段,共识算法将在第4章进行详细介绍。
此外,以太坊为了支持智能合约的执行,在区块头中加入了与Gas相关的字段,在第6章会对这部分内容进行详细介绍。
2. 创世区块
区块链中的第一个区块称为创世区块(Genesis Block),我们可以通过查找高度为0的区块或以下区块哈希值定位到比特币的创世区块
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
由于创世区块不存在任何的前驱区块,因此创世区块的结构总被静态编码在比特币客户端中,比特币创始人中本聪在创世区块的第一条交易(CoinBase)中隐藏了如下信息:“The Times 03/Jan/2009 Chancellor on brink of second bail‐out for banks.”,这是创世区块产生当天《泰晤士报》的头条报道,也是中本聪对当时脆弱的金融系统的暗讽。