剖析导致比特币减半的代码

2020-05-12 04:41:13

再过几个小时,比特币网络将经历第三次“腰斩”。那么它是什么,它是如何在引擎盖下工作的呢?

简单回顾一下:此时此刻,世界各地的矿工都在运行硬件和软件,以计算下一个比特币区块的哈希值。

如果他们设法及时解开这道数学难题,他们就可以索要整笔奖金。

这里有很多流行语,不是吗?让我们把它分解一下。

采矿的整个概念是非常聪明的。实际上并没有什么难题需要解决,它更多的是一种暴力尝试,试图猜出一个神奇的数字。

比特币网络几乎在任何地方都使用SHA256哈希。简而言之,世界各地的矿工都在尝试运行这个功能:

$magicNumber也称为现时值,这是一个曾经使用过的数字。通过将先前块的散列包括在新的散列计算中,形成将每个块链接到新块的实际链。区块链本质上是类固醇上的链表。

矿工们正在猜测$magicNumber的价值。它们反复运行完全相同的计算,递增(或随机化)$magicNumber值。通过这样做,它们每次都会更改函数的结果。

它是如此简单,几乎是愚蠢的。计算的难度取决于前面需要多少个零。当第一个区块被开采时,它的前面只有8个零:

在撰写本文时,当计算出最后一个散列时,它的前面有19个零。

前面需要的零越多,就越难猜出这个神奇的数字。

旁注:这个算法的卓越之处实际上在于它每隔2016个模块就会自动重新计算难度目标(也就是:需要多少个零),但这是为了另一次写入。

如果你猜对了数字,你就会得到奖励。这一奖励以新铸造的比特币的形式出现。

这些比特币基本上是凭空创造出来的。只不过它既不薄也不空气。努力以计算能力和能量的形式投入到网络中。结果,你得到了比特币。作为一名矿工,您的奖励是保护网络安全的结果。

这些新创造的比特币是在所谓的Coinbase交易中创造的。这是一个独特的交易,包括在每个区块中,它向猜到正确散列的矿工支付一定数量的比特币。

(是的,这可能就是广受欢迎的加密货币交易所“Coinbase”得名的原因,它指的是矿工奖励交易。)

每个正确区块的奖励都是自动计算的,并随着比特币网络的推进而自动调整。这种工作方式非常漂亮,我很乐意带您来一次代码之旅。

CAmount GetBlockSubsidy(int nHeight,const Consensus::params&;consensusParams){int halvings=nHeight/consensusParams。nSubsidyHalvingInterval;//未定义Right Shift时强制块奖励为零。如果(Halvings&>;=64)返回0;CAmount nSubsidy=50*硬币;//补贴每210,000块削减一半,大约每4年发生一次。nSubsidy>;>;=减半;返回nSubsidy;}。

那里面是什么?让我们把它分解一下。我写C已经有一段时间了,但幸运的是,它的可读性相当好。

最后一个参数conensusParams.nSubsidyHalvingInterval在src/chainparams.cpp中定义为共识规则的一部分。这是比特币网络上的每个人都需要遵守的一套规则。

附注:对这些共识规则的任何更改都将创建一个“硬分叉”,即一套不再遵循原有链条的新规则。

nHeight指的是当前块的“高度”。或者,换句话说,就是已经发生的块数。

这将使减半的价值为3。这将是该电视网第三次将其整体奖励减半。

但是,如果有一个浮点结果值,显然它不适合整型变量,会发生什么呢?

这将导致2.952380952。但是,由于变量被定义为整数,因此通过删除小数将其四舍五入为最低整数值。然后,减半变成2。

//未定义右移位时强制块奖励为零。如果(Halvings>;=64)返回0;

这是一种我不太理解的条件的安全代码:如果出于某种原因,consensusParams.nSubsidyHalvingInterval太低或nHeight非常高,则会导致变量减半的值也很高。

我认为这张支票无关紧要,因为我们会看到下面的代码?

更新:多亏了@niobos,我现在知道Shift-by操作数被屏蔽了。这对于本文中较低的代码很重要,但这意味着x>;>;65变为x>;>;1,因此需要保留对>;=64的检查。

这部分经常被误解为“会有64个比特币腰斩”。这是不正确的。比特币将减半33个,我们将看到更低的部分。

“减半”这个词指的是限制你作为矿工可以获得的比特币数量的过程。每21万个街区,这个数字就会减半。

在一开始,10多年前,每在网络上发现一个区块,就会奖励50个比特币。

然后,在21万个街区之后,这个数字被削减了一半,只有25个。再过21万个街区,就变成了12.5。这就是我们今天所处的位置。

几个小时后,它将再次被砍成两半,只有6.25个比特币奖励给矿工。再快进210,000个数据块,就变成了3.125个。诸若此类。

我想要强调的是,该代码中正在进行一个聪明的按位操作:

块奖励的起始值固定为50。每枚硬币可以分为100,000,000个单位,在src/mount t.h中定义。如果我们想要正确的话,一个矿工得到的不是“一枚比特币”作为奖励,而是一枚比特币的“一亿块”作为奖励。

这为我们提供了初始值nSubsidy为5,000,000,000。如果你用二进制编写,你会得到。

nSubsidy>;>;=3表示:将位向右移动3位。这就给我们留下了:

当您将该二进制值转换为其十进制表示形式时,您将获得625,000,000。换言之:“625,000,000 mBTC”或“6.25 BTC”。

在下一次减半时,在小数表示的末尾又减少了一个零,有效地再次减半了奖励值。

因为总共只有33位,我们将在第33次减半后(大约在2140年)用完块奖励减半。

(假设在这一点上,支付的交易费应该足以补偿矿工的电力消耗和硬件。)。

一个由数千名(如果不是数百万名)矿工组成的网络可以和谐工作的整个想法令人振奋。如果你曾经尝试过建立一个由5个节点组成的集群,你就会知道达成共识或法定人数是很困难的。

这一切都适用于比特币网络,在未知的硬件上运行,在未知的网速和未知的节点版本和软件上运行-这一切都是因为数学和社会共识,即每个人在网络上都遵循相同的规则。

它以最新的新闻、指南和教程以及新的开源项目为特色。您可以通过下面的电子邮件注册。