传统的挖矿比如黄金,需要准备铁锹、钻机、灯、矿车等一系列设备,才能开始工作。
比特币生产被称为挖矿,是因为生产过程很像挖黄金。挖比特币也需要准备一系列的工作,比如先构建一个区块头。
△区块头
长度 | 字段 | 描述 |
4字节 | 版本 | 版本号,就是第几个版本 |
32字节 | 前区块哈希 | 可以在上一个区块找到 |
32字节 | Merkle根 | 由区块中所有的交易组成的merkle树的哈希值 |
4字节 | 时间戳 | 由Unix纪元1970.1.1开始到当下秒数,记录该区块生产的时间 |
4字节 | 难度目标 | 挖矿标准的核对目标 |
4字节 | Nonce | 挖矿就是找到该随机数 |
旷工在填写好这些信息后,会生出一个区块头,但是该区块头暂时不被比特币系统认可。
需要找到本区块的哈希值,然后广播给全网,获得全网认可后,把该区块链接到当前的区块链上,形成一个+1区块链,不断重复此过程就叫挖矿。
说简单点,任何旷工都可以填写该信息,此时每个旷工填写的区块都是“假区块”,一旦有某个旷工找到了该区块的哈希值,它的“假区块”就变成了真区块,被比特币系统认可,然后获得比特币奖励。
所以,挖矿的本质是找到本区块的哈希值,找到该哈希值的旷工会获得比特币奖励。
如何找到该区块的哈希值呢?
你猜,你猜,你猜猜猜。
其实找哈希值的过程真是靠猜。那如何猜呢?
找到区块头里Nonce的哈希值,小于难度目标的哈希值。难度目标是固定的,我们要猜的就是这个随机数Nonce,区块的哈希值就是Nonce哈希运算后得出的哈希值。
我们以277316的区块举例,难度目标为0x1745fb53,哈希计算后的哈希值为:
0x0000000000000003A30C00000000000000000000000000000000000000000000
*如何哈希计算?可以查看《精通比特币》8.7.2难度表示
我们要找到一个小于目标哈希值A的哈希值B,通过把Nonce套进公式,会得到一个哈希值B,拿该哈希值和目标哈希值A比较,小于A,那就寻找成功。
为方便理解,我把与Nonce有关的公式做了修改。你也可以查找精通比特币,8.7.1工作量证明算法,查看原公式。
公式如下:
听风很帅=》1ce654cf64656ba43247
听风很帅(1)=》512198e52aa12427531
听风很帅(2)=》101654c68d5321c9647
听风很帅(3)=》0cb82dq9846fa6c48647
听风很帅(4)=》0465464ce20cc21e7541
听风很帅(5)=》14edc1cad25121e25487
()里的数就是Nonce,公式右边是哈希值,通过不断地Nonce+1的方式套进公式,让左边哈希运算,得出右边的哈希值。
然后拿该哈希值与目标哈希值0x0000000000000003A30C00000000000000000000000000000000000000000000比较。如果运算出的哈希值小于该值,就找到了正确的Nonce。
平时我们的理解是A+1<A+2,但是A+1经过哈希运算后,就可能大于A+2。得到的哈希值与运算完全没有规律,只要输入变化一点点,得出来的哈希值就千变万化。所以要不停拿数字进去套,直到找出符合条件的Nonce。
不断拿Nonce去套的过程,也叫哈希碰撞,就是试图找到一个符合条件的Nonce。
最终套到924591752时,得出哈希值
0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
拿它与目标值比较
0000000000000003A30C00000000000000000000000000000000000000000000
左边0数量一样,1比3小,证明是我们要找的Nonce
然后旷工把924591752填入Nonce,再把区块接入区块链中,接着广播给其他节点验证是否小于目标值,其他节点验证验通过,把该区块加入区块链中。
验证过程就很简单,把得出的Nonce套进公式,就会得出一样的哈希值输出。只有同一个输入,才能得到同一个输出。
拿输出结果与目标哈希值一对比,就知道是否小于目标值。比特币的挖矿需要N亿次计算,验证答案是否正确,只需要1次计算即可。
这就是比特币的挖矿,不断把Nonce套进公式,直到找出符合条件的那个Nonce,然后经过哈希运算,把哈希值填入区块,广播给全网认证,认证通过获得比特币奖励的过程。