很多朋友都不知道比特币是如何产生,今天就讲一下比特币是如何产生的。两篇文章,讲述了比特币和区块链的原理。他们分别是: 《什么是比特币》 《什么是区块链》 但是始终没有说明比特币是如何产生的?我们如何获得?在上一篇文章《什么是区块链》结尾我也遗留下了一些问题和思考。 这篇文章,我们继续从底层原理出发,来揭开这些神秘的面纱(如果你没看过之前的文章,强烈建议你先看下)。 比特币是什么呢? 比特币是一种积分。 积分的作用是干嘛呢?大家知道: 在论坛上,发帖回帖可以获得积分,积分高的用户就会有特殊权限和荣誉,积分还可能可以对换实物礼品,积分是用来鼓励用户发帖回帖,增加论坛的活跃度的。 在游戏里,经验值就是积分,打怪可以获得经验值,经验值可以用来获得增加游戏角色等级和对换装备,让角色变得更加厉害,角色越厉害就越好玩。 同理,在比特币网络里,挖矿就可以获得比特币。比特币可以用来在比特币网络里转账或购买产品和服务。 不一样的是,在论坛和游戏里,论坛管理员或游戏运营商(也是管理员)可以给用户积分或扣除用户积分,管理员拥有至高无上的权限。 在比特币网络里,由于是去中心化的,没有任何管理员,应该获得多少积分是通过比特币软件来定义的,同时因为比特币软件是开源的,任何一个人都可以阅读其代码,了解比特币运行原理和奖励规则。 比特币就是比特币网络里的积分,用来奖励挖矿的。 那么,什么是挖矿呢? 挖矿是用来寻找(生产)下一个区块的过程。 在上一篇文章《什么是区块链》,我提到,区块链是通过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值为2,海哥2的Hash值等于: 7dd6b1f6790b61819192056a6c753822e01b75d435a3e6b86ee31bddc92294e2 不正确 第三次尝试: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。 同理: 难度系数为3的时候,计算的次数大概是: 16 x 16 x 16 = 4096。 难度系数为4的时候,计算的次数大概是: 16 x 16 x 16 x 16 = 65536。 ... 难度系数为10的时候,计算的次数为:1099511627776(一万亿次)。 难度系数为20的时候,计算的次数为:1千万亿亿次。 备注:在比特币里,难度系数不是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》 区块链落地系列: 《区块链的应用场景》 《比特币的危机》 《区块链如何与传统项目相结合》 《区块链的现状和未来》 —- 编译者/作者:胖胖子的无赖 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
比特币的挖矿原理(比特币是如何产生的?)
2020-04-01 胖胖子的无赖 来源:区块链网络
- 上一篇:KEY早间行情价格
- 下一篇:Calibra产品组合在巴西注册
LOADING...
相关阅读:
- 区块链巨头火币集团计划向DeFi投资数百万美元2020-08-05
- 参观这个至关重要的支持地区可能会启动比特币的下一个“月球任务”2020-08-05
- 以色列将启动区块链平台2020-08-05
- 从破产到比特币:后泛滥的破烂到丰富的故事2020-08-05
- 以太坊和Reddit:5天挑战2020-08-05