首页
学习
活动
专区
工具
TVP
发布

比特币的挖矿原理

前面写了两篇文章,讲述了比特币和区块链的原理。他们分别是:

《什么是比特币》

《什么是区块链》

但是始终没有说明比特币是如何产生的?我们如何获得?在上一篇文章《什么是区块链》结尾我也遗留下了一些问题和思考。

这篇文章,我们继续从底层原理出发,来揭开这些神秘的面纱(如果你没看过之前的文章,强烈建议你先看下)。

比特币是什么呢?

比特币是一种积分。

积分的作用是干嘛呢?大家知道:

在论坛上,发帖回帖可以获得积分,积分高的用户就会有特殊权限和荣誉,积分还可能可以对换实物礼品,积分是用来鼓励用户发帖回帖,增加论坛的活跃度的。

在游戏里,经验值就是积分,打怪可以获得经验值,经验值可以用来获得增加游戏角色等级和对换装备,让角色变得更加厉害,角色越厉害就越好玩。

同理,在比特币网络里,挖矿就可以获得比特币。比特币可以用来在比特币网络里转账或购买产品和服务。

不一样的是,在论坛和游戏里,论坛管理员或游戏运营商(也是管理员)可以给用户积分或扣除用户积分,管理员拥有至高无上的权限。

在比特币网络里,由于是去中心化的,没有任何管理员,应该获得多少积分是通过比特币软件来定义的,同时因为比特币软件是开源的,任何一个人都可以阅读其代码,了解比特币运行原理和奖励规则。

比特币就是比特币网络里的积分,用来奖励挖矿的。

那么,什么是挖矿呢?

挖矿是用来寻找(生产)下一个区块的过程。

在上一篇文章《什么是区块链》,我提到,区块链是通过Hash算法,把所有的区块数据“链接”在一起,形成了区块链。如下图:

什么是Hash算法可以阅读上一篇文章:《什么是区块链》

但是Hash算法有个特点,就是计算的速度非常快,输入原始值可以瞬间得到结果,所以,只要我知道上一个区块数据,我就可以瞬间的计算出上个区块的Hash结果,生成下一个区块。

但是这样的话,产生下个区块的成本是非常低的,通过非常低的成本就可以获得积分(比特币)奖励,那么,这个积分明显是没有价值的。

中本聪发明比特币的时候,他的愿景是:比特币可以当做货币来使用。那么,比特币就必须拥有货币的特点:

获得比特币的成本很高,不能随随便便就可以获得。

发行的速度有限,不能瞬间就产生很多比特币。

和黄金一样,总量恒定,越开采剩余的量越少。

可以模拟现实生活的转账交易(本章节不讨论)。

那怎么办呢?于是,中本聪就想出了一个办法(或叫定义了一个规范):

1、生产第一个区块的时候,奖励50个比特币,之后每四年减半。

所以2009年区块链网络运行至今,已经进行2次减半(2012年一次,2016年一次),现在每个区块的奖励是12.5个比特币。由于每4年减半,预计将在2140年达到极限,总比特币数量约为2100万个(总量恒定)。

2、大约10分钟能够生产出一个区块,生产区块的过程不能太快。

每个小时生产6个区块,每个区块奖励12.5个比特币。目前每天能够生产1800个比特币( 12.5 x 6 x 24 = 1800 )。

第一条规则通过程序代码规范就可以了,但是第二条规范如何实现呢?

如果知道上个区块的数据,通过Hash算法可以瞬间计算出第二块的HasH值,那么矿工电脑接收到交易通知,他就可以瞬间生产出下个区块,获得12.5个比特币奖励,根本不会受到10分钟的限制。

为了解决这个问题,中本聪对区块数据格式要求如下:

这个区块数据,比上一个章节讲的区块数据多了难度系数nonce值

难度系数:是要求下个区块计算出的Hash值前面有几个0,比如说难度系数是10,那么要求计算的Hash值前面必须有10个0。

但是,在上篇文章《什么是区块链》里,我们知道:固定的数据,通过Hash算法计算出来的Hash值一定是固定的,也就说原始值和Hash值是一一对应的关系。

那么,怎么会有Hash结果前面有几个0这样的要求呢?

那就需要nonce值了。

最终,区块的Hash值应该是这样计算的:上一个区块的数据 + 本区块nonce值,再去进行Hash计算,如果得到的Hash结果和上个区块要求的难度系数相同,那么表示链接成功。也就是生成了一个新的合法的区块。

上个区块的数据虽然是固定的,但是本区块的nonce值你可以随便填写呀。只要填写对了,那就说明你挖到了一个区块了。

如何填写nonce值,才能正确呢?

唯一的办法就是一个一个的尝试。

举个例子:假设上一个区块的数据是:海哥 这两个字,要求的难度系数是1,那么可以让计算机这样去尝试nonce值:

第一次尝试:nonce值为1,海哥1的Hash值等于: c280c187c153782b542b2ae7110d71aab33d8c2d732f8aaaa06564f03b4a6b52 不正确

第三次尝试:nonce值为3,海哥3 的Hash值等于:

2b27abb39ca314f3dcc1bee13c35df0f49bfa0b8fa55b5a02d2079387b191c90 不正确

...

第十九次尝试:nonce值为19,海哥19 的Hash值等于:

f17c24e8bcbdf8dd5ca658142b7ed70c0fcabb6c817aa96fb2006a7d2d5e9b5c 不正确

第二十次尝试:nonce值为20,海哥20 的Hash值等于:

0def78fd007911beac1a7cfa9b2b47381875e687fe7c1978b988f3e36df9d3b9正确:难度系数是1,hash值前面有1个0了

如果上个区块的值是海哥这两个字,要得到难度系数为1的nonce值,计算20次可以得到。

实际上:以上Hash结果是16进制(0~F),所以理论平均16次会计算出难度为1的nonce值。

所以:难度系数1的时候,概率为 1/16(十六分之一)。

因此,难度系数为2(两个0相连)的概率为 1/16 x 1/16 = 1/256。也就说:当难度系数为2的时候,计算的次数大约是 16 x 16。

同理:

备注:在比特币里,难度系数不是0-64的值,而是通过一个公式计算得到的值,值越小难度系数越大,但是文章能够让大家理解难度系数和nonce的关系,可以认为难度系数为1就表示前面有一个0,难度系数为2就表示前面有两个0。

同时注意:在比特币网络里,难度值是不断变化的,它通过监测区块链的生成速度,不断的修改难度系数的值,难度值在每2015个区块调整一次。

如果区块平均生成时间小于10分钟,说明比特币网络的计算能力在增加,难度值也会增加,如果区块平均生产的时间大于10分钟,说明计算能力在减少,难度值也会降低。因此,难度值随着全网算力的增减进行动态调整,从而保证大约每10分钟能产生一个区块。

备注:本来,中本聪计划约每两周(14天)调整一次难度系数,每个10分钟生产一个区块,一个小时生产6个区块,一天生产144区块,14天 = 2016个区块,但是由于比特币代码的一个bug,造成实际周期为2015个区块。

当难度系数为20的时候,如果你的计算机每秒钟可以计算1000万次(现在的办公用笔记本,计算速度大概为每秒1万~100万次),那么要计算出下一个区块的nonce值,需要7610350076(76亿)年。

所以,如果你想用办公笔记本挖矿,还是洗洗睡吧,真正的挖矿应该是这样的。

(鄂尔多斯的比特币挖矿设施,图片来之网络)

当某个节点(矿工)成功找到新区块后,他会立刻向区块链网络广播该区块,告诉其他节点,我已经挖到新的区块了,其他节点在收到广播消息后,会对新区块进行验证,如果有效,就把新区块添加到本节点区块链的尾部。然后开始下一轮的计算...

就这样,比特币通过其每年减半、难度系数动态调整、nonce计算等一些列的逻辑组合,从而保证了:

1、获得比特币的成本很高,不能随随便便就可以获得。

2、发行的速度有限,不能瞬间就产生很多比特币。

3、和黄金金矿一样,总量恒定,越开采剩余的量越少。

等这些货币特征,从而让比特币产生了价值。

但是,还有很多问题没有解决,比如:

1、我挖到新的区块了,这个区块的奖励如何证明是我的?

2、我挖到新的区块了,我向全网广播的时候,如何保证我的劳动成果不被窃取?

3、我挖到新的区块了,别人同时也挖到了怎么办?

下一篇文章,我们继续。

如果你持续关注我,你应该可以阅读我后续的系列文章,以下是我的计划。

基础系列(读过初中就能看懂):

《什么是比特币》(点击可访问)

《什么是区块链》(点击可访问)

《比特币如何产生的及其挖矿原理》

《区块链的去中心化交易原理》

《区块链的不可修改原理》

《区块链的支付原理》

《区块链的智能合约》

《如何开始使用比特币》

高级系列(读过高中就能看懂):

《区块链的hash算法原理》

《区块链的非对称加密算法原理1》

《区块链的非对称加密算法原理2》

《区块链的数字签名原理1》

《区块链的数字签名原理2》

开发系列(是程序员就能看懂):

《以太坊Ethereum简介》

《Solidity面向对象编程1》

《Solidity面向对象编程2》

《Solidity面向对象编程3》

《Solidity面向对象编程4》

《Solidity面向对象编程5》

《使用truffle、web3js和OpenZepplin从零开始创建自己的加密币1》

《使用truffle、web3js和OpenZepplin从零开始创建自己的加密币2》

《使用truffle、web3js和OpenZepplin从零开始创建自己的加密币3》

《使用truffle、web3js和OpenZepplin从零开始创建自己的加密币4》

《使用truffle、web3js和OpenZepplin从零开始创建自己的加密币5》

《使用基于以太坊和IPFS的Embark框架开发DApp1》

《使用基于以太坊和IPFS的Embark框架开发DApp2》

《使用基于以太坊和IPFS的Embark框架开发DApp3》

《使用基于以太坊和IPFS的Embark框架开发DApp4》

《使用基于以太坊和IPFS的Embark框架开发DApp5》

区块链落地系列:

《区块链的应用场景》

《比特币的危机》

《区块链如何与传统项目相结合》

《区块链的现状和未来》

理工男海哥

About Me

海哥,一个 IT 理工男、技术架构师、开源爱好者,其开源的软件:Afinal、Jboot在开源中国社区上被评选为“最受欢迎的开源中国软件”。喜欢科技产品和钻研新技术,擅长把晦涩难懂的技术简单化,并乐于分享。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180318G0ZQSQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券