• 10.6 构造区块头

    10.6 构造区块头

    为了构造区块头,挖矿节点需要填充六个字段,如表10-3中所示。

    表10-3 区块头结构

    10.6 构造区块头 - 图1

    ​在区块277,316被挖出的时候,区块结构中用来表示版本号的字段值为2,长度为4字节,以小端格式编码值为 0x20000000。

    ​接着,挖矿节点需要填充“前区块哈希”,在本例中,这个值为Jing的节点从网络上接收到的区块277,315 的区块头哈希值,它是区块277316候选区块的父区块。区块277,315的区块头哈希值为:

    1. 0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569

    提示:通过选择候选块头中的先前块哈希字段指定的特定父区块,Jing正在通过确认挖矿能力来扩展区块链。 从本质上讲,这是用他的采矿权为最长难度的有效链进行的“投票”。

    ​为了向区块头填充merkle根字段,要将全部的交易组成一个merkle树。创币交易作为区块中的首个交易,后将余下的 418笔交易添至其后,这样区块中的交易一共有419笔。在之前,我们已经见到过“Merkle树”,树中必须有偶数个叶子 节点,所以需要复制最后一个交易作为第420个叶子节点,每个叶子节点是对应交易的哈希值。这些交易的哈希值逐层地、成对地组合,直到最终组合并成一个根节点。merkle数的根节点将全部交易数据摘要为一个32字节长度的值,例10-3中 merkel根的值如下:

    1. c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e

    ​挖矿节点会继续添加一个4字节的时间戳,以Unix纪元时间编码,即自1970年1月1日0点到当下总共流逝的秒数。本例 中的1388185914对应的时间是2013年12月27日,星期五,UTC/GMT。

    接下来,Jing的节点需要填充Target字段(难度目标值),为了使得该区块有效,这个字段定义了所需满足的工作量证明的难度。难度在区块中以“尾数-指数”的格式,编码并存储,这种格式称作target bits(难度位)。这种编码的首字节表示指数,后面的3字节表示尾数(系 数)。以区块277316为例,难度位的值为0x1903a30c,0x19是指数的十六进制格式,后半部0x03a30c是系数。这部分的概念在后面的“难度目标与难度调整”和“难度表示”有详细的解释。

    ​最后一个字段是nonce,初始值为0。

    ​区块头完成全部的字段填充后,挖矿就可以开始进行了。挖矿的目标是找到一个使区块头哈希值小于难度目标的 nonce。挖矿节点通常需要尝试数十亿甚至数万亿个不同的nonce取值,直到找到一个满足条件的nonce值。