区块链100篇之挖矿

在第四篇的时候有简单提到挖矿,但是没深入去讲解挖矿的过程,所以这一篇打算好好讲一讲。

矿机与挖矿

相信很多人一听到矿机脑海中闪过的应该是下面这种
在这里插入图片描述
而区块链中的矿机其实是长这样的:

挖矿也不是想象中开着挖掘机“坑次坑次”的挖,而是不停地的计算hash值,如下所示:
在这里插入图片描述
今天就是围绕着计算hash这个话题来展开。

比特币的结构图

在现实生活中,我们都是围绕着某一个中心来展开我们的社会活动,比如银行,我们转的每一笔账最终都是由银行来清算的,而在比特币的世界里却没有任何一个中心化机构来对系统中所产生的交易进行清算,这个听起来很神奇,比特币是如何运作的?

如下图:
在这里插入图片描述
假设现在A转1.5个比特币给B,那么他不仅要通知B已经转给他1.5个比特币了,还要将这笔交易同时广播给全网的C和D,C和D接收到这笔交易后会记录在自己的账本中(这样就可以防止B收到比特币之后赖账);同样的,假如现在B转了5个比特币给C,那么他也需要同时将这笔交易广播给全网中的A和D用户,以此类推,全网中的所有用户就拥有了同一份账本。但是这里又会有其他问题,比如A转给B比特币的时候同时将交易广播给了C和D,那么C和D凭什么要花费自己的存储空间将这笔交易记录在自己的账本中(C和D都是经济理性人)?这是第一个问题,第二个问题,理论上C和D都有权力并且都会记录网络中产生的交易,假设D如实记录了交易数据,而C由于某种原因记录的数据并不完全真实,这个时候很难去判断应该听谁的,最终会造成数据的紊乱,这个问题就是分布式系统的数据一致性问题,也就是账本“以谁为准”的问题,这是挖矿的两个核心问题。

为什么要记账

比特币是去中心化的,那么就意味着没有人有义务或者动力来维护这个系统的正常运转,所以中本聪就设计了一种激励机制,只要谁参与记账,谁就有机会获得比特币,奖励比特币有两种形式。

手续费

每笔交易或多或少需要支付一定的手续费,而且手续费越高的交易会被优先打包进区块

区块奖励

比特币前四年每个区块的奖励是50个BTC,此后每四年减半,总量是2100万个,估计到2140年挖完全部比特币

截止发文,一个比特币价值七千三百多美金,在巨大的经济利益诱惑面前就不难理解为什么那些人愿意耗费电力,带宽,磁盘来记录一些跟自己毫不相干的交易记录,

以谁为准

关于账本一致性的问题,中本聪提出了一种解决方案,就是非常著名的工作量证明机制(Proof-of-Work,简称PoW),维基百科的定义如下:

是一种对应服务与资源滥用、或是拒绝服务攻击的经济对策。一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。

看不懂没关系,举个栗子:

扫描二维码关注公众号,回复: 10496899 查看本文章

在一个班级,老师拿出一张百元大钞,对着底下的学生说:“你们谁能猜中我手上百元大钞的编号,我就把这一百块给谁”,没有谁会跟钱过不去,所以底下的学生就开始猜,因为没有任何条件可以进行推理演算,所以只能是从0开始一个一个的累加计算,最后小明因为计算速度比较快,在十分钟之内就猜到了老师手上百元大钞的编号,所以这一百块就归他了,看下图:
在这里插入图片描述
看完这个栗子再来看维基百科的定义,相信应该一下子就能理解过来了,在比特币的世界里计算的数值可不像一百块上的数值那么简单,使用的是SHA256的算法来计算,第一个计算出满足条件的hash(哈希函数是PoW最常用的技术原理)的矿工拥有记账权,那么账本的数据便是以他为准,其他人会通过P2P网络来同步最新的区块账本数据。关于哈希算法前面的博客有提到,这里就不细讲了。传送门

挖矿的步骤

解决了上面的两个问题,现在就可以讲讲挖矿的一些具体步骤了。

1.生成Merkle根哈希

矿工创建区块的第一笔交易,称为Coinbase,这笔交易与其他所有即将打包的交易一起通过Merkle树算法生成Merkle根哈希,关于Merkle树我前面也讲过了,这里就不赘述。传送门

2.组装区块头

组装区块头就很简单了,矿工会把上一步计算得到的Merkle根哈希,与随机数Nonce、上个区块hash、难度值、时间戳以及版本号组装成一个区块头。这里的随机数是矿工唯一能改变的数值,矿工会不停的改变随机数,计算区块头的hash,直到得到的hash值匹配上全网目标值为止。下图是区块头的数据结构:
在这里插入图片描述
这里有一个疑问就是Nonce值只有32位,可操作空间比较小,假如遍历完之后还是没找到合适的hash值咋办?一般的做法就是修改Coinbase的交易数据,一旦交易数据改变,那么Merkle根哈希也会跟着改变,而Merkle是256位,这样不停的循环遍历,总能找到合适的哈希值。

3.计算目标值
  • 1)通过两次SHA256计算出一个hash值,hash=SHA256(SHA256(区块头));

  • 2)判断该hash值是否小于全网目标值,即是否满足前导0个数,如果满足条件则结束;

  • 3)如果大于或者等于全网目标值,则变更随机数,继续不停的计算直到找到合适的hash值。

流程如图所示:
在这里插入图片描述
关于比特币挖矿的大概思路流程到此算是讲完了。

发布了23 篇原创文章 · 获赞 34 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_37504041/article/details/103792215