什么是挖矿?

更新日期: 2019-10-11阅读: 2.5k标签: 区块链

区块链中经常会听到挖矿这个名词,因为它和现实中的挖矿不一样,所以很多人对这个词很费解。为什么那么多人去挖矿呢?因为挖矿成功后会有奖励。为什么挖矿需要大量的矿机呢?因为有大量的哈希计算。这个计算的过程就被称为挖矿。


哈希函数

要想明白什么是挖矿,就必须要先了解计算机中的一类函数——哈希函数。比如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位要求全部相同,那么概率就是1 / 2^256 ≈ 1 / 10^77。而宇宙的总原子量是10^79个,总质量10^56 g。大型计算机的速度在10^20 Hz/s,个人计算机计的速度在10^10 Hz/s,个人电脑哈希计算速度在10^5 H/s。所以如果要想去碰撞哈希的话,这完全是不可能的。


挖矿

先上一副全网挖矿统计图:

当前全网算力是95.21EH/s,1EH/s = 百亿亿次哈希/秒。而比特币的所有矿工大概需要计算十分钟,才会有一个矿工碰巧找到满足要求的哈希

1. 一个哈希的部分碰撞

比如有一个数据和一个随机数(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年才能计算出来。

现在我们就可以利用一个哈希的部分碰撞去保证数据的很难修改了,最终达到个人、组织或国家无法修改的难度。当区块被链接起来过后,历史数据将达到所有国家都无法修改的难度

2.什么是挖矿

我们先看看比特比区块的数据:

  • 难度:这个难度前面讲过,是根据以往的2016可区块计算出来的,表示这个区块头的哈希需要满足前面有多少个0。
  • 随机数nonce:这个就是矿工不停修的数字,然后去得到满足相应要求的哈希,如果算出来了,就代表成功挖到这个区块的矿了。将获得这个区块的奖励

注:(nonce定义的空间比较小,后面需要修改币基交易的信息才能继续挖矿)

我们来看一个区块头的信息:

可以看到,当前区块的哈希和上一个区块的哈希,前面都是0。0越多代表挖矿难度越大,0越少代表挖矿难度越小。现在要求的挖矿难度是17个0。我们前面计算了需要16个0的话需要挖2091917年,所以现在的比特币,想要用个人电脑去挖矿,简直是比中彩票、比陨石撞击地球还难。

注:这里为了方便大家的理解,直接将难度说成了前面需要多少个0,实际上对难度的定义是通过其他表达式来表示的


最后

所以挖矿需要大量的矿机,这些矿机实际上就是计算机,只是这些计算机对哈希的计算能力进行了增强。比如将哈希算法固定到硬件上面,以此来获得高速的哈希计算能力。还有的机器通过显卡挖矿,这是因为显卡也具有一定的计算能力,这样可以充分利用计算机的资源。由于计算机的速度满足摩尔定律,每过18个月,速度就会翻倍。而计算机内存的速度增长却很缓慢,大概每年7%,所以有的虚拟币挖矿需要求结合内存,这样大家的挖矿就相对于平等一些。挖矿是一个很消耗资源的,尤其是电力,所以矿机一般都选择电费便宜的地方。


链接: https://fly63.com/article/detial/5913

从概念到底层技术,一文看懂区块链架构设计(附知识图谱)

区块链作为一种架构设计的实现,与基础语言或平台等差别较大。区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设计的角度谈谈区块链的技术实现。

200行JS代码实现超级简单的区块链,带你入门区块链

本文通过JavaScript源码实现一个简单的区块链框架,带你入门区块链的相关知识。区块链的基本概念非常简单:一个分布式数据库维持不断增长的有序记录列表。

用JavaScript写一个区块链

几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的

初识区块链_用JS构建你自己的区块链

区块链太复杂,那我们就讲点简单的。用JS来构建你自己的区块链系统,寥寥几行代码就可以说明区块链的底层数据结构、POW挖矿思想和交易过程等。当然了,真实的场景远远远比这复杂。本文的目的仅限于让大家初步了解、初步认识区块链。

刚入门区块链的程序员应该看些什么?

区块链有很多的定义,大家的说法都不一样,业界都还没有统一。每个人心中都有自己的哈姆雷特。所以此处就不做定义了。那么我主要推荐一些关于区块链概念的学习资料,看完我所推荐的资料,你应该对这门技术有一个自己的了解

区块链 PoW 与 PoS 的纷争

有关注区块链的,肯定会经常看到这两个名词 -- PoW 与 PoS。但是很多人对他们的含义的理解存在很多偏差。那么他们的含义与区别是什么呢?简单而言,PoW 和 PoS 是 2 种不同的对记账权利的分配方式。

使用javascript实现小型区块链

区块链概念狭义:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码方式保证的不可篡改和不可伪造的分布式账本。

NodeJS实现简易区块链

很多区块链接在一起,就组成了一条链。这条链,也用class来表示。并且其中实现了很多方法:按照加密规则生成hash,插入新块和检查操作,批量插入块和检查操作以及可信度计算

区块链开发中使用的最流行的编程语言

我们目前正处于一个新兴的区块链开发行业中。区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣。由于许多资金充足的项目现在急于建立区块链网络并在其上部署分散的应用程序

探索区块链的原理

之前经常听别人说,挖矿、比特币、区块链之类的东西,听起来好高大上呀,后来在网上了解相关知识,但是网上大部分都是转载,没一个能讲明白的,后来不知不觉接触到了一些易懂的点

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!