世界杯2022是哪个国家_国足世界杯出线 - dtfyjq.com

  • 首页
  • 北京世界杯
  • 世界杯新秀
  • 世界杯16强名单

最新发表

  • 迅雷版本大全
  • 多邻国是跨平台的,Android,iOS,Web网页均支持,无Mac版。 我个人主要是用iOS版,其次是Web版。 免费可以使用,但会有广告,且红心有限,即无法每日一直刷下去。 如果需要会员的话,这里推荐拼车加入家庭会员,比如我这里加入了一个家庭,拼车后,
  • 360安全卫士设置默认浏览器锁定的方法
  • 风靡世界的“La Ola” – DW – 2005年6月17日
  • cf点消费记录怎么查
  • cf王者零属性 cf王者零多少钱能出
  • 用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
  • 全球油价最贵的5个地区!欧洲国家占2个,第1名香港,贵绝全球
  • word文档里文字为何全选后用backspace删除不了,只能一个一个删?
  • 为什么新版qq友谊的巨轮没了?新版QQ友谊的巨轮小船消失了

友情链接

Copyright © 2022 世界杯2022是哪个国家_国足世界杯出线 - dtfyjq.com All Rights Reserved.

这么多人聊比特币,大部分人压根不懂什么是“挖矿”?(第70讲)

世界杯16强名单 · 2025-06-17 22:30:33

《架构师之路:架构设计中的100个知识点》

70.比特币-挖矿

图片《区块链究竟是个什么系统?(第69讲)》发布后,有童鞋问:区块是啥?数据存在哪里?“挖矿”是啥?区块链和比特币是什么关系?

今天,从技术的角度,聊聊上面这些问题。

上一篇介绍了区块链,那区块链与比特币是什么关系?

区块链是分布式存储,比特币是基于该存储的应用,其他诸如莱特币,以太币都是基于区块链的电子货币应用。

图片如上图,mysql是底层存储,wechat是上层应用。

区块链挖矿的本质是啥?

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

挖矿的人,就是矿工。

什么是区块(block)?

如上一篇文章介绍,区块是一块存储空间,可以存储数据。

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

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

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

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

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

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

1. 前一个区块的哈希值;

2. 区块生成的时间戳;

3. 随机数;

什么是区块链(blockchain)?区块是怎么链起来的?

struct node{

node* prev; // 前一个节点

int time; // 时间戳

int nonce; // 随机数

void* node_body; // 存储数据

}node;

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

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

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

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

1. 历史生成的区块是无法改变的,即“区块链只能像写日志一样追加写,不能像mysql一样随机写”;

2. 只能在最新的区块后面生成新区块,即“必须先完成同步全网最新的区块链数据这项工作,才能启动新区块生成这项工作”;

3. 新区块的生成很难,必须满足一定条件的新区块才有效;

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

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

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

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

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

哈希(SHA256是一个哈希算法)是不可逆的。

例如MD5:

md5(string) = md5_result

大家都知道:

1. 由字符串,算出对应的md5值很容易,但由md5值反推出字符串是不可能的;

2. 可以认为哈希的结果是完全随机的,要得出前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”; // 挖到矿啦

}

}

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

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

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

从架构的角度出发:

1. “缓存”是无效的:每个区块的哈希值都不一样,每个时间戳都不一样,历史计算过的值无法通过“查表”来节省时间;

2. scale up是有效的:增强单CPU的计算能力,使用GPU代替CPU,使用特殊的芯片计算SHA256D等优化都是有效的,但scale up总是有极限的,单机总会遇到瓶颈;

3. scale out是有效的:单机不行,来并行,一台机器不行,搞集群,这就是为什么会有这么多的矿场;

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

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

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

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

1. 如何保证数据的一致性?

2. 这TM有病吧,挖这玩意有什么意义,不是纯浪费电吗?

3. 这和比特币有什么关系?

4. 比特币怎么保证总量有限?

5. …

这些疑惑,未来再撰文和大家解释。

知其然,知其所以然。

思路比结论更重要。

==全文完==

创业了,欢迎围观:

《41岁,一个人创业,快1个月了...》

感谢大家的支持。


盾牌 (Shield) - [MC]我的世界原版 (Minecraft) - MC百科
滴滴、优步、易到...打车哪家最省钱?测试给你答案