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

上一篇《1分钟了解区块链的本质》,介绍了什么是区块链,区块链是一个没有管理员,每个节点都拥有全部数据,高可用的分布式存储系统。

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

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

如上图,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有病吧,挖这玩意有什么意义,不是纯浪费电吗
  • 这和比特币有什么关系
  • 比特币怎么保证总量有限

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

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

转载于: 架构师之路 公众号

原文地址:https://www.cnblogs.com/xiexin2015/p/8998811.html

时间: 2024-10-20 00:17:33

1分钟了解“挖矿”的本质的相关文章

比特币的发行和挖矿

概述 挖矿的用途 1. 抢夺区块打包权 2. 验证交易事务 3. 奖励发行新币 4. 广播新区块 大家约定一个规则,共同按照这个规则竞争,竞争成功谁就有数据打包权,打包完成后广播给别人,别人验证无问题就存入自己的数据文件中. 规则------->工作量证明 难度值: 一个门槛 规定一个256位的证书,作为难度为1的目标值: X00000000FFFFFFF....... 当时全网的算力,大约需要10分钟左右的运算能得到一个符合这个难度为1的值. 0号区块的难度信息 "nonce"

区块链挖矿交易系统,数字资产交易所开发

实际上,交易即挖矿是中国人搞出来的东西.但交易即挖矿仅仅只是一种激励,其比特币挖矿本质上是对记账权的争夺,那交易即挖矿是在争夺什么呢? "交易即挖矿本质上是对交易权的争夺,完成一笔交易,即可获得相应的奖励."实际上,交易即挖矿模式也是需要提供某种"证明"的,但其只需要提供最简单的"成交证明",就是只要订单完成即可. 区块链挖矿交易系统本质上是在鼓励大家成为做市商!挖矿实际上挖的是大家认可的东西.任何需要激励的,有价值的东西都可以通过挖矿的方式来实

区块链上的共识机制

前言 区块链上的共识机制有多种,没有一种共识机制是完美无缺的,同时也意味着没有一种共识机制是适合所有应用场景的. PoW:Proof of Work,工作量证明 依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机制高.可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错1. 优缺点2: 优点:完全去中心化,节点自由进出: 缺点:目前bitcoin已经吸引全球大部分的算力,其它再用Pow共识机制的区块链应用很难获得相同的算力来保障自身的安全:挖矿

比特币——区块链

区块链: 一种实时记录全部交易的去中心化公开数据库,在区块链上进行支付时全网计算机共同查询区块链数据,共同验证这笔支付交易是否有效.确认支付后将写入区块链并产生一条不可篡改记录. 区块:区块大小是1M,包含父哈希.Merkle根.时间戳.难度目标.随机数.程序上近似每10分钟增加一个BLOCK,block就是当前账本区块,如果矿工运算高于这个时间则下次下调难度,如果低于这个时间则增加难度,难度由当前算力确定. 区块链:每一个网络中的用户不需要完整的blockchain, 不过拥有完整blockc

许子敬究竟什么才是区块链?

1 我们都知道,人类社会发展的一切障碍,从根本上来说都是由于“互不信任”导致的,因为在一个互不信任的社会里,人们会互相猜测,人心相背,人人自卫,甚至人人自危,这时社会的运转效率就会非常低下.尤其是各种经济和金融危机. 经济和金融危机的本质出现问题,其实就是一个社会的信用体系崩溃.比如美国08年次贷危机,就是因为很多机构给那些没有还款能力的人信用造假,最后导致集体违约. 回顾一下人类历史,最早的智人为什么能够统一人类呢?因为语言的出现使人们之间有了最初级的“契约”精神,人们可以互相承诺和交换,从而

linux系统瓶颈分析(精)

linux系统瓶颈分析(精) (2013-09-17 14:22:00)   分类: linux服务器瓶颈分析 1.0 性能监控介绍 性能优化就是找到系统处理中的瓶颈以及去除这些的过程,多数管理员相信看一些相关的"cook book"就 可以实现性能优化,通常通过对内核的一些配置是可以简单的解决问题,但并不适合每个环境,性能优化其实 是对OS 各子系统达到一种平衡的定义,这些子系统包括了: CPU Memory IO Network 这些子系统之间关系是相互彼此依赖的,任何一个高负载都

为什么我说IPFS社区从卖矿机开始,就是错的

要回答这个问题,首先要了解去中心化存储项目和传统的区块链项目有什么区别.其中去中心化存储项目包括IPFS,基于IPFS的FileCoin.PPIO.Storj等. 传统区块链项目没有供需问题 首先以比特币,以太坊坊为首的数字货币,他们都有一个环节叫做挖矿.从技术的角度看,之所以设立这个挖矿,是因为他们用的共识算法是POW(Proof-Of-Work). 比特币的挖矿算法本质就是决定谁出块,谁出块就意味着谁说了算.那比特币是怎么决定谁出块的呢? 很简单,设计一个密码学猜数游戏.这个游戏就是让所有的

0211 花一分钟和一辈子看透事物本质的人,过的并非同样的生活

LC297 class Codec { public: //Encode a tree to a single string. string serialize(TreeNode* root) { ostringstream out; serialize(root,out); //str() 返回ostringsteam里的临时值 return out.str(); }//es TreeNode* deserialize(string data) { istringstream in(data)

解决centos被minerd挖矿程序入侵方法

记录一次服务器被入侵的解决方法 一:问题说明 1.我的服务器是使用的阿里云的CentOS,收到的阿里云发来的提示邮件如下 然后我查看了运行的进程情况(top 命令),看到一个名为minerd的进程占用了99.5%的CPU  2.minerd是个挖矿程序,什么是"挖矿",特此百度了一下, 所谓"挖矿"实质上是用计算机解决一项复杂的数学问题,来保证比特币网络分布式记账系统的一致性.比特币网络会自动调整数学问题的难度,让整个网络约每10分钟得到一个合格答案.随后比特币网络