Cao Yi

比特币挖矿终结之日:2140年?

返回目录

按比特币系统的设定大约每四年区块奖励减半,当减半后的奖励小于比特币的最小单位「聪(sat, Satoshi)」时,就无法再生成区块奖励了,这时便可以认为比特币挖完了。一个比特币等于一亿聪,即 $1 BTC = 10^8 sat$

2024年4月区块奖励将从 6.25 BTC 减半为 3.125 BTC,我们来用表格推一下哪年区块奖励将小于 1 sat.

区块奖励(sat) 开始时间(年) 结束时间(年) 起始区块高度 最后区块高度 新增量(sat) 累计开采量(sat) 剩余开采量(sat)
5,000,000,000 2009.01 2012.11 0(第一个区块) 209999 1,050,000,000,000,000 1,050,000,000,000,000 1,049,999,997,690,000
2,500,000,000 2012.11 2016.07 210000 419999 525,000,000,000,000 1,575,000,000,000,000 524,999,997,690,000
1,250,000,000 2016.07 2020.05 420000 629999 262,500,000,000,000 1,837,500,000,000,000 262,499,997,690,000
625,000,000 2020.05 2024.04 630000 839999 131,250,000,000,000 1,968,750,000,000,000 131,249,997,690,000
312,500,000 2024.04 2028 840000 1049999 65,625,000,000,000 2,034,375,000,000,000 65,624,997,690,000
156,250,000 2028 2032 1050000 1259999 32,812,500,000,000 2,067,187,500,000,000 32,812,497,690,000
78,125,000 2032 2036 1260000 1469999 16,406,250,000,000 2,083,593,750,000,000 16,406,247,690,000
39,062,500 2036 2040 1470000 1679999 8,203,125,000,000 2,091,796,875,000,000 8,203,122,690,000
19,531,250 2040 2044 1680000 1889999 4,101,562,500,000 2,095,898,437,500,000 4,101,560,190,000
9,765,625 2044 2048 1890000 2099999 2,050,781,250,000 2,097,949,218,750,000 2,050,778,940,000
4,882,812 2048 2052 2100000 2309999 1,025,390,520,000 2,098,974,609,270,000 1,025,388,420,000
2,441,406 2052 2056 2310000 2519999 512,695,260,000 2,099,487,304,530,000 512,693,160,000
1,220,703 2056 2060 2520000 2729999 256,347,630,000 2,099,743,652,160,000 256,345,530,000
610,351 2060 2064 2730000 2939999 128,173,710,000 2,099,871,825,870,000 128,171,820,000
305,175 2064 2068 2940000 3149999 64,086,750,000 2,099,935,912,620,000 64,085,070,000
152,587 2068 2072 3150000 3359999 32,043,270,000 2,099,967,955,890,000 32,041,800,000
76,293 2072 2076 3360000 3569999 16,021,530,000 2,099,983,977,420,000 16,020,270,000
38,146 2076 2080 3570000 3779999 8,010,660,000 2,099,991,988,080,000 8,009,610,000
19,073 2080 2084 3780000 3989999 4,005,330,000 2,099,995,993,410,000 4,004,280,000
9,536 2084 2088 3990000 4199999 2,002,560,000 2,099,997,995,970,000 2,001,720,000
4,768 2088 2092 4200000 4409999 1,001,280,000 2,099,998,997,250,000 1,000,440,000
2,384 2092 2096 4410000 4619999 500,640,000 2,099,999,497,890,000 499,800,000
1,192 2096 2100 4620000 4829999 250,320,000 2,099,999,748,210,000 249,480,000
596 2100 2104 4830000 5039999 125,160,000 2,099,999,873,370,000 124,320,000
298 2104 2108 5040000 5249999 62,580,000 2,099,999,935,950,000 61,740,000
149 2108 2112 5250000 5459999 31,290,000 2,099,999,967,240,000 30,450,000
74 2112 2116 5460000 5669999 15,540,000 2,099,999,982,780,000 14,910,000
37 2116 2120 5670000 5879999 7,770,000 2,099,999,990,550,000 7,140,000
18 2120 2124 5880000 6089999 3,780,000 2,099,999,994,330,000 3,360,000
9 2124 2128 6090000 6299999 1,890,000 2,099,999,996,220,000 1,470,000
4 2128 2132 6300000 6509999 840,000 2,099,999,997,060,000 630,000
2 2132 2136 6510000 6719999 420,000 2,099,999,997,480,000 210,000
1 2136 2140 6720000 6929999 210,000 2,099,999,997,690,000 0
0 2140 2144 6930000 7139999 0 2,099,999,997,690,000 0

参比特币减半时间表:https://docs.google.com/spreadsheets/d/1cGOvp7TzT-2D8cdadCBIjHQdhv70ZSeDQj8zGZr-KpI/edit?usp=sharing

从表格中我们可以看到,随着时间推移,区块奖励逐渐减少,直到2140年时降至零。这是因为减半后的奖励将小于1 sat,而系统只能发放大于或等于1 sat的奖励。此时矿工的收益将完全依赖交易手续费。到本世纪末,一年将不足以产生一个完整的比特币,而在最后几十年,总共也只能挖出约1个比特币。

因为区块是大致按照每十分钟产生的,并不是精确的,虽然每2016个区块(大约2周时间)会调整一次挖矿难度,尽量把区块的生成时间维持在10分钟。以上只是基于当前规则的理论预估,每次区块奖励减半具体时间可能会有一定的出入。从现有的历史记录也可以看出,区块奖励减半的周期只是大致在4年左右而已。虽然如此,减半发生的区块高度是确定的,它们是 210000, 420000, 630000, …

随着区块奖励在2140年左右归零,挖矿将不再产生新比特币,矿工将完全依赖交易手续费维持生计。这标志着比特币经济模型的一次转型,而非终结。手续费可能因交易量上涨而增加,以激励矿工,但若费用不足,算力下降或将影响网络安全。未来,比特币的命运将由矿工、用户和技术共同塑造。

减半的代码解释

因为 sat 是比特币的最小单位,所以从2052年开始,区块奖励以 sat 为单位时出现的小数会用「向下取整」的方式丢弃。「向下取整(round down)」是指出现小数时,直接把小数位去掉(抹零),而不是按四舍五入做近似。比如

上面的小数位全部直接去掉。

以下是比特币核心代码 validation.cpp 中的函数 GetBlockSubsidy,它决定了每个区块的奖励。 代码中COIN表示1 BTC(即1亿sat),>>=是右移运算符,相当于除以2。因为它是整数运算,会自动丢弃小数部分,天然带有向下取整的效果。

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;
    return nSubsidy;
}