百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

1分钟了解“挖矿”的本质

lipiwang 2025-05-21 14:51 3 浏览 0 评论

文章的留言里,不少朋友会用比特币来解释区块链,那区块链与比特币是什么关系?

:区块链是分布式存储,比特币是基于该存储的应用,其他诸如莱特币,以太币都是基于区块链的电子货币应用。理论上,使用上层应用来解释底层存储是不合适的。


如上图,mysql是底层存储,wechat是上层应用,用wechat来解释mysql是不合适的。

今天,从技术的角度出发,聊聊什么是区块链里的“挖矿”。

先说结论,区块链挖矿的本质是啥?

:生成一个区块,链入区块链的过程,就是挖矿。挖矿的人,就是矿工。

什么是区块(block)?

:如《1分钟了解区块链的本质》里所述,区块是一块存储空间,可以存储数据。


如上图,区块分为区块头(header)和区块体(body)。

区块体(body)存了些什么?

:想存什么存什么,和上层应用有关,就像mysql里存什么依赖于上层应用。例如比特币使用的区块链,区块体里存储的是比特币交易记录。

区块头(header)存了些什么?

:区块头里存储了和这个区块,以及区块链相关的一些元数据。


如上图,区块头里的三个常见属性:

  • 前一个区块的哈希值
  • 区块生成的时间戳
  • 随机数

什么是区块链(blockchain)?

区块是怎么链起来的?

struct node{

node* prev; // 前一个节点

int time; // 时间戳

int nonce; // 随机数

void* node_body; // 存储数据

}node;


链表,节点指针可以作为这个节点的唯一标识,下一个节点通过存储上一个节点的指针,将链表链起来。


与之类似,区块的哈希可以作为区块的唯一标识,下一个区块通过存储上一个区块的哈希,将区块链起来,这就是区块链。

讲完区块与区块链的概念,接下来讲挖矿,也就是区块的生成

在此之前,先说说区块链的三个特性

  • 历史生成的区块是无法改变的,即“区块链只能像写日志一样追加写,不能像mysql一样随机写”
  • 只能在最新的区块后面生成新区块,即“必须先完成同步全网最新的区块链数据这项工作,才能启动新区块生成这项工作”
  • 新区块的生成很难,必须满足一定条件的新区块才有效

假如已经同步了最新的区块链数据,要满足什么条件,才算生成一个新的区块,才算“挖矿”成功呢?

对最新的区块头进行两次SHA256计算,得到的256bit哈希结果,高位48bit必须是0x00000000FFFF,才算挖矿成功

画外音:这句话很重要,是这篇文章的核心。

为什么大家都说“挖矿”很难?

由符合条件的哈希值,倒推出区块头,填入相应的“前一块区块哈希值”“时间”“随机数”不就可以了吗?

:额,这,,,哈希(SHA256是一个哈希算法)是不可逆的。例如MD5

md5(string) = md5_result

大家都知道:

  • 由字符串,算出对应的md5值很容易,但由md5值反推出字符串是不可能的
  • 可以认为哈希的结果是完全随机的,要得出前48bit必须是0x00000000FFFF的哈希结果,就如同连续抛48次硬币,每次都得到我们想要的结果,其概率为(1/2)^48


可以看到,这就好比在一座山上随手捡起一块石头,正好是一块金子,我猜测,这也正是把生成新区块叫做“挖矿”的原因。

那应该怎么找到符合条件的区块头呢,从而成功挖到矿呢?

:穷举法。

区块头里有个随机属性nonce,将这个属性从0开始,遍历到2^32,来计算区块头的哈希值,如果得到的哈希结果符合条件,则挖矿成功。

其伪代码如下:

byte[32] = PrevBlockHash; // 上一个区块的哈希

for(int i=0 to 2^32){ // 遍历所有整数

int time=now(); // 时间戳

blockHeader= new(byte[32], time, i); // 生成区块头

hashResult= SHA256D(blockHeader); // 计算哈希值

if(hashResult>>208 == 0x00000000FFFF){ //哈希符合预期

echo“bingo”; // 挖到矿啦

}

}

看上面的算法,只要程序运行时间足够久,总能挖到矿呀?

:错,如果别人计算能力强,在你挖到矿之前,如果别人先生成了新区块,广播到了区块链网络,你本地不是最新的区块链,你挖到的矿就作废啦,此时你要放弃之前所有的工作,先向网络同步最新的数据,再重新开始挖。

有什么方法可以提升挖矿的速度呢?

:从架构的角度出发

  • “缓存”是无效的:每个区块的哈希值都不一样,每个时间戳都不一样,历史计算过的值无法通过“查表”来节省时间
  • scale up是有效的:增强单CPU的计算能力,使用GPU代替CPU,使用特殊的芯片计算SHA256D等优化都是有效的,但scale up总是有极限的,单机总会遇到瓶颈
  • scale out是有效的:单机不行,来并行,一台机器不行,搞集群,这就是为什么会有这么多的矿场



如上图,这是西藏高原上的一个比特币矿场,廉价的电力让无数矿工趋之若鹜。

综上,区块链里,什么是挖矿?

:在最新区块链的数据上,生成一个符合条件的区块,链入区块链的过程,就是挖矿。

关于区块链与挖矿,大家或许还有不少疑问:

  • 如何保证数据的一致性
  • 这TM有病吧,挖这玩意有什么意义,不是纯浪费电吗
  • 这和比特币有什么关系
  • 比特币怎么保证总量有限

这些疑惑,下一个一分钟,再和大家解释。

希望这很短的一分钟,大家了解了挖矿的本质。

相关推荐

WIN10系统如何启用net Framework功能

当我们安装一些办公软件或是设计软件时,需要.netFramework运行环境,如果没有安装这个运行环境,软件就会无法运行了。那在哪启用呢?下面,我来和大家分享一下第一步,点击开始--设置--在查找设...

玩游戏怎能没有.NET Framework 3.5 但你会安装它吗?

前段时间NVIDIA发布的最强“煤气灶”引发的不仅仅是显卡价格的剧烈变动(其实也没啥,老的不降价,新的还死贵),还有就是随之而来的一大波游戏,一部分在STEAM平台上搞促销,另外一部分则是不停的放烟雾...

.Net Framework还是.Net Core?

大家都知道,微软在2016年推出了.NetCore框架。后来为了统一,在.NetFramework到了V4.8后便不再更新,同时.NetCore更名为.Net,版本从5.0开始,目前最新版本是....

.Net Framework详解

相信有不少小伙伴遇到过这种情况:安装软件时提示.NetFramework未安装导致软件无法打开,或者需要安装.NetFramework4.0以上的组件。那.NetFramework是什么呢?....

远离报错烦恼!深入全面掌握.NET Framework

由于Windows系统对.NETFramework这一系统组件有着极为特殊的要求,而部分应用软件及游戏对其的依赖性也近乎达到了驱动级的水准,使用或安装不当会遭遇许多“未知”的问题,因此如何掌握.NE...

系统小技巧:深入全面掌握.NET Framework

由于Windows系统对.NETFramework这一系统组件有着极为特殊的要求,而部分应用软件及游戏对其的依赖性也近乎达到了驱动级的水准,使用或安装不当会遭遇许多“未知”的问题,因此如何掌握.NE...

小菜鸟学Java--如何拿下数组

前面谈及到了引用数据类型,数组就是一种,它还是比较重要的一种,本篇就来详细说说它和向量。数组先来说说数组。那么什么是数组呢?它是在数组的基础上的。数组是一种常用的引用数据类型,相同数据类型的元素按照一...

Java Class 类文件格式看这一篇就够了

本文将揭开JavaClass文件的神秘面纱,带你了解Class文件的内部结构,并从Class文件结构的视角告诉你:为什么JavaClass字节码文件可以“写一次,遍地跑”?为什么常量池的计数从1开...

八种经典排序算法总结,妈妈再也不用担心我不会了

前言算法和数据结构是一个程序员的内功,所以经常在一些笔试中都会要求手写一些简单的排序算法,以此考验面试者的编程水平。下面我就简单介绍八种常见的排序算法,一起学习一下。一、冒泡排序思路:比较相邻的元素。...

Java 面试题问与答:编译时与运行时

在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。Q.下面的代码片段中,行A和行B所标...

Java、Set、Map集合框架知识大全,收藏备用

前言Java集合框架的知识在Java基础阶段是极其重要的,我平时使用List、Set和Map集合时经常出错,常用方法还记不牢,于是就编写这篇博客来完整的学习一下Java集合框架的知识,如有遗漏和错误,...

Java反射+注解实现Entity类与Dto类相互转换

作者:Mr_Precious链接:https://www.cnblogs.com/scale-lai/p/10164634.html序言近期在工作中管理代码时发现,在项目中从Dao层到Service层...

Java 最细的集合类总结

数据结构作为每一个开发者不可回避的问题,而Java对于不同的数据结构提供了非常成熟的实现,这一个又一个实现既是面试中的难点,也是工作中必不可少的工具,在此,笔者经历漫长的剖析,将其抽丝剥茧的呈现出...

我见过的最糟糕代码

本文最初发布于jesuisundev.com网站,经原作者授权由InfoQ中文站翻译并分享。在本文中,我将向你展示我见过的一些最糟糕的代码,它们被称为“魔鬼代码”,会带来很严重的后果。然而,我...

Java面试中最容易忽略的细节,你中了几个?避坑指南送你

今日分享开始啦,请大家多多指教~学习Java要明确自己的需求,知道自己要做什么;分析思路,知道自己要怎么做。确定步骤,每一个思路部分用到哪些方法和对象。最后用代码实现,用具体的java语言把思路体现出...

取消回复欢迎 发表评论: