传统挖矿如采金,需准备好各种设备,才可开展工作。而比特币生产过程类似挖黄金,因此也被叫做挖矿。想生产比特币,首先需要构建一个区块头。
△区块头长度 | 字段 | 描述 |
4字节 | 版本 | 版本号,即版本序号 |
32字节 | 前区块哈希 | 可在上一区块找到 |
32字节 | Merkle根 | 由区块内所有交易构成的Merkle树的哈希值 |
4字节 | 从1970.1.1起至当前秒数,用于记录该区块生成时间 | |
4字节 | 难度目标 | 挖矿的标准校验目标 |
4字节 | Nonce | 挖矿时需找到该随机数 |
矿工们在完成上述信息填充后,将生成一个区块头,但比特币系统暂未承认该区块头。要使区块头被比特币系统认可,需找到本区块的哈希值,并将其广播给整个网络。当全网认可该区块后,它会被连接到现有的区块链上,形成一个新的区块链。这种反复循环的过程就称为挖矿。
简而言之,任何矿工都可进行信息填充,此时每位矿工所填写的区块都是“假区块”。当某位矿工找到了该区块的哈希值后,“假区块”变为真正的区块,得到了比特币系统的认可并获得比特币奖励。
因此,挖矿的核心在于找到本区块的哈希值,找到该哈希值的矿工将获得比特币奖励。
如何找到区块的哈希值?您猜猜看!
实际上,找到哈希值的过程就像猜谜一般。那么该如何猜呢?
我们需要找到区块头中的Nonce的哈希值,使其小于难度目标的哈希值。难度目标是固定的,我们需要猜测的就是这个随机数Nonce。区块的哈希值就是Nonce哈希运算后的哈希值。
以277316区块为例,其难度目标为0x1745fb53,哈希计算后的哈希值为:
0x0000000000000003A30C00000000000000000000000000000000000000000000
*关于哈希计算方法,请参考《精通比特币》8.7.2章节:难度表示
我们要找到一个小于目标哈希值A的哈希值B,通过将Nonce代入公式,我们会得到一个哈希值B。将该哈希值与目标哈希值A进行比较,若小于A,则寻找到合适的Nonce。
为了便于理解,我对涉及Nonce的公式进行了简化。您还可以查阅《精通比特币》,8.7.1章节:工作量证明算法,查看原始公式。
公式如下:
听风很帅=》1ce654cf64656ba43247
听风很帅(1)=》512198e52aa12427531
听风很帅(2)=》101654c68d5321c9647
听风很帅(3)=》0cb82dq9846fa6c48647
听风很帅(4)=》0465464ce20cc21e7541
听风很帅气(5)=》14edc1cad25121e25487
()内的数字即为Nonce,公式的右侧为哈希值。通过不断增加Nonce的值并将其代入公式进行哈希运算,得出右侧的哈希值。
接下来,我们将哈希值与目标哈希值进行比较。通常我们认为A+1 < A+2,但在哈希运算过程中,A+1的运算结果可能会大于A+2。由于哈希值与其输入之间没有明显的规律,只需稍微更改输入,就会产生完全不同的哈希值。因此,我们需要不断尝试新的Nonce值,直至找到满足条件的Nonce。
通过不断尝试Nonce值,这一过程也被称为哈希碰撞,即试图找到满足条件的Nonce。
当我们尝试到924591752时,我们得到了以下哈希值:
0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
我们将该哈希值与目标值进行比较:
0000000000000003A30C00000000000000000000000000000000000000000000
左右两边0的数量相同,1小于3,表明这是我们正在寻找的Nonce。
接着,矿工将找到的Nonce值填入,并将区块添加到区块链中。之后,将区块广播给其他节点进行验证。当其他节点验证通过时,该区块将被添加到区块链中。
验证过程相对简单,只需将找到的Nonce值代入公式,即可得到相同的哈希值输出。只有相同的输入才会产生相同的输出。
比特币的挖矿需要进行数十亿次计算,以确认答案是否正确。然而,验证答案是否正确仅需一次计算。
这就是比特币的挖矿过程:不断尝试新的Nonce值,直至找到满足条件的Nonce,随后进行哈希运算,并将哈希值添加到区块中,最后广播给全网验证并获得比特币奖励。