数字货币从哪里来?浅谈挖矿

数字货币从哪里来?浅谈挖矿

数字货币是如何诞生的?我们先来看看法币(fiat money),也就是由政府发行的货币是如何诞生的。其实说白了就两个字:印钱,打开印钞机狂印即可。当然在货币高度虚拟化的今天,央行直接把自己帐上的钱改个数字也是可以的。
那么数字货币呢,数字货币诞生的方式根据具体的数字货币分为很多种,我们今天以比特币为例讲解一种资历最老,应用最为广泛的方式:挖矿(mining)。

《数字货币的两大特点》一文中我提到过,数字货币具有去中心化,分布式的特点,由很多计算机组成网络共同运行。这个网络中的所有计算机都有一个共同点,就是它们都运行了比特币的软件(客户端)。相信很多同学都有用BT下载客户端下完片以后依然保持运行客户端的经历,正所谓人人为我,我为人人,持续运行客户端,换句话说就是你在帮助运行这个网络。如果说持续运行BT下载客户端是为了通过上传帮助他人,同时获得更好的评级方便以后下载,那么运行比特币客户端的人是为了什么呢?

原因只有两个字:利益!

运行比特币客户端的人,可以选择打开“挖矿”模式。一旦打开“挖矿模式”,就可以通过客户端所在的计算机帮助比特币网络处理交易,而处理交易的代价是不菲的,因为比特币的交易原理是密码学,需要消耗计算机大量的计算性能进行运算,单单电费就是很惊人的。因此,为了奖励帮助比特币网络处理交易的人,比特币引入了“挖矿机制”,让帮助比特币网络的人可以获益。这种纯粹的基于经济学而不是理想传教性质的激励手段是很有借鉴意义的。

那么挖矿到底是怎么回事呢?在比特币网络中,每一时刻都会有新的交易发起,比如“张三给了李四0.1个比特币”,当然了在比特币中,“张三”和“李四”是用一个由字母和数字组成的字符串地址表示的。那么这些交易是怎么被处理的呢?他们是怎样被写入比特币网络的呢?每十分钟,比特币网络中的计算机会把自己通过广播接收到的过去十分钟的交易收集到一个“块”(block)里,然后通过这个块里的交易数据试图算得一个很大的数字,如果算得的数字符合要求,那么我们就说这台计算机“挖到了这个块”,或者说挖到了矿。

根据比特币的设计,算这个数字的过程是极其困难的,需要消耗大量的计算性能,而且随着网络中节点(也就是计算机)性能的提升难度还可以增加。挖到块的计算机会把自己挖到块的消息广播到比特币网络,这样大家就都得到了这个最新的块的信息,这个块里的所有交易也就被写入了比特币网络。每十分钟只能有一个新的块被写入网络,所以谁的计算机性能更强劲,谁就更有可能挖到矿。那些在这十分钟内发起,但并没有被收集到块里的交易,就只能等十分钟之后再看看能不能被收集到块里了。这就是为什么当比特币网络的交易量突增的时候,很多交易要等很久之后才能被确认的原因。

挖到矿的计算机会获得很什么好处呢?好处就是比特币!2009年1月比特币诞生的时候,挖到每个块的人会得到50个比特币,比特币一开始就是这样按照每十分钟50个的速度不断产生的。比特币的产生速率并不是恒定不变的,因为它的总量只有2100万枚,所以产生速率势必随着时间递减。这个递减的过程被称作“halving”。根据比特币规定,每产生21万个块,挖到每个块所得的比特币就会减半。生产21万个块需要大概4年时间,所以havling大约每四年发生一次,到今天为止已经发生了2次,一次在2012年11月28号,一次在2016年7月9号,也就是说今天每挖到一个块得到的比特币数量是12.5枚。感兴趣的同学可以算一下,halving总共需要发生多少次才能保证2100万枚的总量。

如果你已经看到这里,那么恭喜你,你已经掌握了99%的人都不掌握的关于比特币挖矿的知识了!如果你对数字货币的内容感兴趣请一定不要忘记关注我的公众账号,会有更多精彩的内容!下期我们会谈谈比特币的钱包,以及如何通过比特币钱包发送和接收比特币,感兴趣的同学千万不要错过了!

哈哈没想到吧,最后还有彩蛋。懂得编程的同学可以继续看。

关于比特币的货币政策(就是我们前文描述的,总量2100万枚,每21万个块生产速率减半),我们可以在比特币客户端(是用C++编写的)的代码中找到证据,感兴趣的同学可以直接去github上看源码:https://github.com/bitcoin/bitcoin/blob/a6548a47a5548b4b43510c548a9418673ab751de/src/validation.cpp#L1110-L1121

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
  int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
  // Force block reward to zero when right shift is undefined.
  if (halvings >= 64)
    return 0;

  CAmount nSubsidy = 50 * COIN;
  // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
  nSubsidy >>= halvings; // 这句话是位运算,表示nSubsidy等于nSubsidy除以2的halvings次方
  return nSubsidy;
}

这段代码里的BlockSubsidy就是我们说的挖到每个块所得的比特币,nHeight是block height,也就是当前这个块是比特币网络诞生以来被挖出的第几个块。我们可以看到block subsidy每过consensusParams.nSubsidyHalvingInterval个块就会减半,而consensusParams.nSubsidyHalvingInterval就被定义在代码库里的另一个地方:https://github.com/bitcoin/bitcoin/blob/aab1e55860dea1e40fc02bc0e535c1d1474a5ae3/src/chainparams.cpp#L73

consensus.nSubsidyHalvingInterval = 210000;

所以结论就是,比特币的生产速率会每隔210000个块减半,而halving总共会发生64次。有兴趣的同学可以算算看,210000 * (50 + 25 + 12.5 + … + 50/2^64)是不是等于2100万,其结果是一个极为接近2100万的数字。

版权声明:本文转发自微信公众号cryptotalk。

Next Post:
Previous Post:
This article was written by

发表评论

电子邮件地址不会被公开。 必填项已用*标注