在比特币区块中,区块头是最为关键的一个信息。它包含整个区块的所有特征信息: 区块版本号。创建区块的比特币节点的版本信息,用于追踪比特币协议的升级和更新情况; 前一个区块的哈希值。又叫做父区块哈希,用来定位上一个区块。每一个区块都包含它的上一个区块的哈希值,针对任何一个区块的任何一个微小的改动,都会使后续区块的哈希值产生巨大的变化,如此环环相扣,确保比特币所有区块形成一条单一的链式结构,可以有效防止恶意篡改比特币区块数据的行为。 MerkleRoot 哈希。在区块的交易数据列表中,取所有交易数据的哈希值,构建 Merkle 树,这个 Merkle 树的根哈希值,即为 MerkleRoot 哈希(如下图)。 由于哈希算法的敏感性,整个交易的 Merkle 树中任何一个交易数据有微小的改动,都会产生联动效果,导致 Merkle 树的根哈希值出现巨大变化。因此交易数据的 Merkle 树根哈希值(MerkleRoot Hash)可以看作是整个交易的指纹,用来指代区块中的交易数据。 时间戳。创建预备区块的时间。 当前目标哈希值。比特币协议规定,矿工创建的预备区块的哈希值小于目标哈希值时,这个区块才算有效。 目标哈希值由挖矿难度确定,当挖矿难度变大时,目标哈希值变小,矿工要找到符合比特币网络要求的哈希值就越困难。按照当前的挖矿难度,要找到低于目标哈希值的哈希值,理论上需要一台 S17 矿机连续工作42 年时间。因此,现在基本不存在个人自建节点挖比特币的情况。 随机数。又叫 Nonce。我们可以发现,区块头信息中,区块版本号,前一个区块的哈希值,MerkleRoot 哈希值,时间戳,以及当前目标哈希,都是已知信息,相对固定,不便随意更改。因此,如果要调整预备区块的哈希值,就需要引入一个可变的数据——随机数。修改随机数,就可以调整预备区块的哈希值。 挖矿节点构建好预备区块后,就会将区块头信息下发给矿工,矿工通过不断调整区块头中随机数来变更预备区块的哈希值,当预备区块的哈希值低于比特币网络当前目标哈希值时,这个区块就是一个合法新区块。 挖矿节点会及时地向比特币网络广播新区块,比特币网络中其他比特币节点在接到广播信息后,对新区块进行验证,验证通过后,将新区块加入本地。此时,新区块创建并确认完毕,对应交易也完成了。 参考资料: 1. 比特币源码分析 2. 比特币区块头结构 3. 比特币目标哈希值 4. 比特币区块结构 5. 精通比特币 (责任编辑:admin1) |