Cao Yi

比特币的总数为何是两千一百万(21000000)个?

返回目录

比特币系统有一些预置规则(Ref):

  1. 系统一开始,每个区块奖励50BTC
  2. 每隔2016个区块调整挖矿难度,使出块时间维持在10分钟左右
  3. 每隔二十一万(210000)个区块,奖励减半
  4. 所有比特币最初的来源都是区块奖励

这些预置规则是比特币世界的「公理」,比特币的总数量可以通过它们得出。

我们通过计算区块奖励的总和便可以得到比特币的总数

所以总的区块奖励是:

\[\begin{equation} \begin{split} & \hspace{1.25 em} 50 \times 21000 + 50 \times \dfrac{1}{2} \times 21000 + 50 \times \dfrac{1}{2^2} \times 21000 + 50 \times \dfrac{1}{2^3} \times 21000 + ... \nonumber \\ &= 50 \times 21000 \times \left(1 + \dfrac{1}{2} + \dfrac{1}{2^2} + \dfrac{1}{2^3} + \cdots\right) \\ &= 50 \times 21000 \times \lim_{n \to \infty} \dfrac{1 - \left(\dfrac{1}{2}\right)^n}{1 - \dfrac{1}{2}} \\ &= 50 \times 21000 \times 2 \\ &= 21000000 \end{split} \end{equation}\]

(这里的计算用到了等比数列的求和公式)

附,查看和验证区块奖励

区块接入区块链的顺序,叫做「高度」,从0开始。所以前210000个区块对应的高度值是从0到209999, 其余以此类推。

区块高度 区块奖励(BTC) 起始时间(UTC+0800) 结束时间(UTC+0800) 起始区块 结束区块
0 ~ 209999 50 2009-01-04 02:15:05 2012-11-28 23:01:40 000000000019d6689c085a…6f 00000000000000f3819164…e1
210000 ~ 419999 25 2012-11-28 23:24:38 2016-05-09 21:56:18 000000000000048b95347e…2e 0000000000000000036f6f…ab
420000 ~ 629999 12 2016-07-10 00:46:13 2020-05-12 03:23:23 000000000000000002cce8…a1 0000000000000000000d65…1e
630000 ~ 839999 6.25 2020-05-12 03:23:43 2024-04-20 08:05:33 000000000000000000024b…6d 0000000000000000000172…ab
840000 ~ 1049999 3.125 2024-04-20 08:09:27 (2028) 0000000000000000000320…a5  

通过这张表也能看出每次奖励维持的时间大约是4年,因为过了这段时间之后,区块奖励会减半,所以一般也称「比特币的减半周期是4年」。中本聪预想的是每10种产生一个新的区块,但现实世界中矿机的运算能力是变动的,如果算力高,可能很快就能生成一个满足条件的区块,反之,超过10分钟也不一定能生成符合条件的区块。为了应对这种情况,中本聪设计了一个调节机制——每2016个区块后调整挖矿难度,如果前面生成区块太快,就提升难度降速,反之则降低难度。这就保证了生成区块的时间间隔大致在10分钟左右。我们假设现实中也是10分钟生成一个区块,则能计算出

通过这张表还课可以看到区块的 hash 值开头的0有越来越多的趋势,这反应了挖矿的难度随着时间的推移在增加。

注:

通过区块高度查区块的 hash 的方法。打开 Bitcoin Core Wallet,菜单路径是 Window -> Console, 再在命令行界面执行 getblockhash {height} 即可,如查看第一个区块和高度为630000的区块,可以通过下面的指令完成:

getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
getblockhash 630000
000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d

如果查询还未产生的区块,会报错,如:

getblockhash 840000
Block height out of range (code -8)

已知区块的 hash 值,就可以在 https://mempool.space 上查到它比较详细的信息,如 https://mempool.space/block/000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d