主页 > imtoken官方安卓下载 > 深度解析实现比特币减半的十五行代码

深度解析实现比特币减半的十五行代码

imtoken官方安卓下载 2023-04-15 06:08:08

作者|Mattias Geniar Translator|杨志昂策划|Tina

北京时间5月12日凌晨3点23分左右,比特币在63万区块高度完成了诞生以来的第三次减半,比特币区块奖励从12.5 BTC减少到6.@ >25 BTC,仅剩约 262 万比特币待开采。

那么,什么是比特币减半以及事件背后的代码如何运作?

让我们一起深入了解有趣的细节。

区块补贴和奖励减半

我们先简单回顾一个基础知识点。所谓“矿工”,是指此刻分布在世界各地比特币五行属什么行业,正在运行硬件和软件计算下一个比特币区块的哈希值的人。

如果矿工及时解决比特币区块链网络中的数学难题,他们将获得区块奖励。

上面的描述中有不少流行的流行语,不是吗?所以让我们一一解释。

什么是哈希值?

比特币挖矿的整个概念设计得非常巧妙。实际上,挖矿并不是一个思考问题的过程,它更像是一种猜测一个神奇数字的蛮力尝试。

比特币网络几乎在所有地方都使用 SHA256 哈希算法。世界各地的矿工都在尝试运行的挖矿函数可以用这个函数的简化版本来表示:

SHA256(    $previousBlockHash,    $newTransactionsToBeIncluded,    $magicNumber);

其中,$magicNumber 也称为随机数(nonce),在密码学中是指只使用一次的数字。通过在新区块的哈希计算中包含上一个区块的哈希值,实际上就形成了一个链式结构,将之前的每个区块一个接一个地链接起来,一直到新的区块。因此,区块链本质上是链表的高端版本。

矿工们一直在猜测magicNumber的值。他们一遍又一遍地运行相同的计算,使用增量(或随机)穷举方法来尝试magicNumber的有效值。通过这样的计算方式,矿工每次都会改变上述函数的哈希值结果。

比特币五行属什么行业

那么他们什么时候“赢”呢?

一旦他们找到一个开头有足够多的 0 的哈希值。

就是这样:开头有足够的 0。

这个答案太简单粗暴了比特币五行属什么行业,看起来不是很高。挖矿计算的难度取决于哈希值开头需要多少个零。当第一个区块被挖出时,它的哈希值仅以 8 个零开头:

00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048

并且在撰写本文时,区块链计算的第 629828 个区块的哈希在开头有 19 个 0:

0000000000000000000133e7bffe43530e508183ec48a89bad23a370692b16e8

而且一开始需要的 0 越多,猜测随机数就越困难。

这里还有一件事,比特币算法的复杂之处在于,它每 2016 个区块自动重新计算其难度目标(即一开始需要多少个 0),但本文不会对此进行详细介绍) . .

挖矿奖励

如果您猜对了这个随机数,您将获得奖励。该奖励以新铸造的比特币的形式发行。

从本质上讲,这些比特币是凭空创造的。只是它既不便宜也不容易获得。比特币网络中的挖矿需要大量的计算能力和电力。经过所有这些艰苦的工作,你得到了比特币。您因维护和巩固比特币网络而获得矿工奖励。

这些新铸造的比特币是在所谓的 Coinbase 交易中创建的。这是一个独特的交易,包含在每个区块中,作为对猜出正确哈希值的矿工的一定数量比特币的奖励。

是的,流行的“Coinbase 加密货币交易所”名称就是从这个术语衍生而来的,它最初是指对每个区块中为矿工提供奖励的特殊交易(生成的交易)的引用。

比特币五行属什么行业

对于每一个正确计算的区块,都会自动计算矿工奖励,奖励金额会随着比特币网络的发展而自动调整。它的设计也很巧妙,所以让我带你了解它背后的代码。

GetBlockSubsidy() 函数

矿工奖励减半的魔力发生在函数 GetBlockSubsidy() 中,该函数包含在源代码的 src/validt.cpp 文件中。

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)plain return 0;
CAmount nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.nSubsidy >>= halvings;return nSubsidy;}

那么,这个函数包含什么?让我们剖析一下代码。虽然我有一段时间没有接触 C,但幸运的是,这段代码相当容易阅读。

比特币减半发生了多少次?

让我们从顶部开始:

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;

上面的最后一个共识参数,consensusParams.nSubsidyHalvingInterval,在 src/chainparms.cpp 文件中定义为共识规则的一部分。这些是比特币网络上的每个人都必须遵守的一套公共规则。

这里需要注意的是,对这些共识规则的任何更改都将创建一个“硬分叉”,这是一组不再遵循原始区块链规则的新规则。

consensus.nSubsidyHalvingInterval = 210000;

这个常数意味着每生成 210,000 个区块,比特币就会减半。变量 nHeight 指的是当前块的高度(Height)。或者换句话说,已经开采的区块数量。

5 月 12 日,开采的比特币数量达到了 630,000 个区块。所以此时,方程变为:

int halvings = 630000 / 210000;

比特币五行属什么行业

这会将减半值更改为 3。这也是比特币网络第三次将其区块奖励减半。

但是如果结果是一个浮点值,显然不符合声明的变量的 int 类型怎么办?例如:

int halvings = 620000 / 210000;

这将导致 2.952380952 的计算。但是,由于变量被定义为整数类型,因此通过简单地省略小数点后的值,将其四舍五入到结果范围内的最小整数值。因此,此时的减半次数为 2。

区块奖励结束

让我们看一下这段代码片段:

// Force block reward to zero when right shift is undefined.if (halvings >= 64)    return 0;

因为nSubsidy是64位有符号整数,所以在进行右移操作时可能会出现未定义的行为,也就是说x>>65操作会变成x>>1,这会导致值循环回来,所以需要把这对留在这里。将大于或等于 64 的检查减半。这对于上面发布的后续代码很重要。

最初的比特币核心代码没有包含对这个错误的修复,并且直到 2014 年才合并拉取请求。

这部分经常被误解为“将有 64 个比特币减半”。这是不正确的。实际上只有 33 个比特币减半,我们稍后会看到对此的解释。

您可以获得多少比特币作为奖励?

“减半”一词实际上是指矿工可以获得的比特币数量的限制。每开采 210,000 个区块,此奖励金额减半。

CAmount nSubsidy = 50 * COIN;nSubsidy >>= halvings;return nSubsidy;

最初,10 多年前,矿工在网络上开采的每个区块都会获得 50 个比特币的奖励。

比特币五行属什么行业

然后,在挖出 210,000 个区块后,此奖励金额减半为 25 个比特币。在又挖出 210,000 个区块后,它变成了 12.5 个比特币。这是本次减半的情况。

本次减半后,比特币挖矿奖励将再次减半,也就是说矿工只能获得6.@>25比特币的奖励。再挖出 210,000 个区块后,奖励将变为 3.125。等等。

这段代码中有一个巧妙的位操作,我想在这里强调一下:

nSubsidy >>= halvings;

我敢打赌,您不会每天在代码中看到这样的 >>= 运算符。

让我们为每个变量填写实际值,重写代码如下:

CAmount nSubsidy = 50 * 100000000;nSubsidy >>= 3;return nSubsidy;

区块奖励有一个固定的初始值 50。根据 src/amount.h 文件中的定义,每个比特币可以分成 1 亿个更小的基本单位(Satoshi,或“satoshi”)。如果要更准确一点,矿工并不是得到1个完整的“比特币”作为奖励,而是将1个比特币平均分成1亿,然后得到“1亿”这样的基本单位作为奖励。

而这 1 亿个基本单位加起来就是 1 个比特币。

这给出了 50 亿基本单位的 nSubsidy 初始值。如果用二进制表示,可以得到以下数字:

6.0@>

表示将位右移 3 位。这给出了:

6.1@>

当您将该二进制值转换为其十进制表示时,您会得到 625,000,000。换句话说,这是 625,000,000 个基本单位或 6.@>25 个比特币。

比特币五行属什么行业

当下一次减半发生时,上述二进制值末尾的 0 再减一并向右移动一位,从而有效地将奖励金额再次减半。

由于 50 亿的初始值总共只有 33 比特,我们将在第 33 次减半后将区块奖励设为 0,这将发生在 2140 年左右。

而这个假设的前提是,到那时,交易所支付的挖矿奖励应该足以补偿矿工的电力消耗和硬件成本。

综上所述

比特币的货币供应是硬编码的,每个人都可以查看和查看此代码。

鉴于矿工的绝对数量,即使不是数百万,也有数千人,让这么多矿工以和谐的方式一起工作的想法确实令人难以置信。如果您曾经尝试过设置任何 5 节点集群,您就会明白在多个节点之间达成共识或多数仲裁是多么困难,因为您需要考虑到,例如比特币网络:

在比特币网络上,这一切都按预期工作,在未知硬件、网络速度、节点版本和软件的条件下——都是因为设计中包含的数学原理和社会共识,让每个人在这个网络上都遵循相同的规则。

这真是一项令人着迷的技术。

关于作者:

Mattias Geniar,独立开发人员,Linux 系统管理员和一般问题解决者。

参考阅读:

g-code-比特币减半/

InfoQ 读者交流群上线!各位小伙伴,可以扫描下方二维码,添加InfoQ小助手,回复关键字“入群”即可申请入群。您可以与 InfoQ 读者畅所欲言,与编辑近距离接触,并获得宝贵的技术礼品包。还有有价值的活动等你来参与。加入我们吧!

6.3@>

6.4@>

点击查看更少的错误