共计 2471 个字符,预计需要花费 7 分钟才能阅读完成。
区块链中经常会听到挖矿这个名词,因为它和现实中的挖矿不一样,所以很多人对这个词很费解。为什么那么多人去挖矿呢?因为挖矿成功后会有奖励。为什么挖矿需要大量的矿机呢?因为有大量的哈希计算。这个计算的过程就被称为挖矿。
哈希函数
要想明白什么是挖矿,就必须要先了解计算机中的一类函数——哈希函数。比如 md5、sha256 等都是哈希函数的一种实现方式,它们最终都是将任意长度的数据都转换为固定长度的数据。就如同你去办身份证一样,不管你高矮胖瘦、贫富贵贱,给你的身份证 id 都是一个 18 为的数字,这个过程就如同进行了一次哈希。
我们来简单感受一下 sha256 哈希函数:
1. 输入长度可变,输出长度固定
不论输入的是多长,都能得到一个定长的字符串
hash(“a”)
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
hash(“hongtao”)
7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26
2. 对数据敏感
只要数据有一点变化,那么就能得到一个完全不一样的字符串
hash(“hongtao”)
7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26
hash(“hongtaofu”)
1059ac7a8f6d4eb9024231eb260bfcc30d23fdf1b461164741f71835c4968906
3. 单向性
给定一个字符串,比如“hongtao”,我们可以马上计算出他的哈希是:
“7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26”。
但是给你一个哈希:
“3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d”,
要想计算出他的一个原像,这比登天还难
4. 不可被碰撞
比如给定一个字符串“a”,他的哈希是:
“ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb”。
你不可能通过计算或者暴力破解去找到另外一个字符串,使得他的哈希也是:
“ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb”
5. 从概率的角度来分析一下哈希函数:
sha256 函数:实际上输出的值就是 256 个 bit(比特),如果我们想随机去碰撞一个哈希值,那么他的概率是多少呢?每一个 bit 可以是 0 或者 1,256 位要求全部相同,那么概率就是 $\frac{1}{2^{256}}$ ≈ 1.157 X $\frac{1}{10^{77}}$。而宇宙的总原子量是 $10^{79}$ 个,总质量 $10^{56}$g。大型计算机的速度在 $10^{20}$Hz/s,个人计算机计算哈希的速度在 $10^{10}$Hz/s。所以如果要想去碰撞哈希,这完全是不可能的。
挖矿
先上一副全网络挖矿统计图:
当前全网算力是 95.21EH/s,1EH/s = 百亿亿次哈希 / 秒。而比特币的所有矿工大概需要计算十分钟,才会有一个矿工碰巧找到满足要求的哈希
一个哈希的部分碰撞
比如有一个数据和一个随机数 (nonce),我们对它们作哈希,希望得到的哈希前面有 6 个 0
Hash("hongtao"+nonce)=000000xxxx..50...xxxx(十六进制,共 64 位);
这个时候我们修改 nonce,哈希也会发生变化,需要经过
16 x 16 x 16 x 16 x 16 x 16 = 16,777,216
次哈希计算,才能得到想要的哈希。
hash("hongtao623022891")
0000000bd07143fcbb02e54dc5b68f0e391f80a44d72f9ebe53ae7cc31434056
笔者的电脑是 2.9GHz x 6 核,大概用了 1 分钟才计算完,这个时候任何人想要修改前面的数据,比如把 hongtao 修改为 taohong,修改过后都需要进行一分钟的计算才能找到合法的随机数
如果前面要求不是 6 个 0,而是 16 个 0,就需要计算 $16^{10}$ x 1 分钟。笔者的电脑需要计算 2091917 年才能计算出来。
现在我们就可以利用一个哈希的部分碰撞去保证数据的很难修改了,最终达到个人、组织或国家无法修改的难度。当区块被链接起来过后,历史数据将达到所有国家都无法修改的难度
什么是挖矿
我们先看看比特比区块的数据:
- 难度:这个难度前面讲过,是根据以往的 2016 可区块计算出来的,表示这个区块头的哈希需要满足前面有多少个 0。
- 随机数 nonce:这个就是矿工不停修的数字,然后去得到满足相应要求的哈希,如果算出来了,就代表成功挖到这个区块的矿了。将获得这个区块的奖励
我们来看一个区块头的信息:
可以看到,当前区块的哈希和上一个区块的哈希,前面都是 0。0 越多代表挖矿难度越大,0 越少代表挖矿难度越小。现在要求的挖矿难度是 17 个 0。我们前面计算了需要 16 个 0 的话需要挖 2091917 年,所以现在的比特币,想要用个人电脑去挖矿,简直是比中彩票、比陨石撞击地球还难。
注:这里为了方便大家的理解,直接将难度说成了前面需要多少个 0,实际上对难度的定义是通过其他表达式来表示的
最后
所以挖矿需要大量的矿机,这些矿机实际上就是计算机,只是这些计算机对哈希的计算能力进行了增强。比如将哈希算法固定到硬件上面,以此来获得高速的哈希计算能力。还有的机器通过显卡挖矿,这是因为显卡也具有一定的计算能力,这样可以充分利用计算机的资源。由于计算机的速度满足摩尔定律,每过 18 个月,速度就会翻倍。而计算机内存的速度增长却很缓慢,大概每年 7%,所以有的虚拟币挖矿需要求结合内存,这样大家的挖矿就相对于平等一些。挖矿是一个很消耗资源的,尤其是电力,所以矿机一般都选择电费便宜的地方。