就在5月12日凌晨3:23,比特币成功完成众所瞩目的第三次减半。
自2009年诞生,比特币已经走过波澜壮阔的十年。从交易所、矿机、投资者到媒体,比特币已经带动加密货币行业形成一个完整的生态系统。比特币区块奖励减半从供给侧直接减少一半的货币供给,显然在边际和投资者心理上都极大彰显了比特币的稀缺性。
因此,四年一次的比特币减半成为整个加密货币行业关注的焦点。
但看了那么多比特币减半的文章,你可能还不知道比特币具体是怎么减半的,比如四年减半一次的四年是怎么来的,怎么计算当前区块的奖励等问题。
值此比特币第三次减半之际,来跟随金色财经记者看看Bitcoin Core的代码是具体怎么执行比特币区块奖励减半的。
比特币减半代码
金色晚报 | 12月8日晚间重要动态一览:12:00-21:00关键词:Mt. Gox民事诉讼、Deribit、Facebook、支付宝、稳定币总市值、CME BTC
1. 报告:Deribit控制着90%的加密货币期权交易。
2. CryptoQuant:Mt. Gox民事诉讼到期或是一个比特币看跌信号。
3. 报告:加密基金资产管理规模达 150 亿美元的历史高位。
4. Facebook高管:计划明年推出数字货币Diem和数字钱包Novi。
5. 支付宝关联企业申请“一种区块链数据的恢复方法和装置”专利。
6. 数据:稳定币总市值超250亿美元。
7. CME BTC期货本周\"18975-19205美元\"的缺口已回补。
8. 开发者Cody Burns所持ETC域名竞标结束 ETC Labs现控制相关网站。[2020/12/8 14:37:18]
比特币减半,是比特币区块奖励减半的简称。而比特币的区块奖励减半是比特币共识的一部分,直接写在比特币软件代码里。
金色财经行情播报丨BTC小幅下跌 市场整体跌后窄幅震荡:据火币行情显示,BTC于今晨小幅下跌,目前在6300USDT附近窄幅震荡,多空博弈再次考验支撑,短线方向尚不十分明朗。市场整体下行后窄幅震荡,主流币全部小幅下跌。[2020/4/1]
具体减半代码在这里,下面是截图。
比特币区块奖励减半代码 来源:Bitcoin Core github
就这6行代码定义的函数GetBlockSubsidy决定着不同区块高度下的比特币区块奖励。中本聪创造的比特币共识设置区块奖励从50个比特币开始每210000个区块比特币奖励减半,减半64次后区块奖励为0。
金色相对论|区块链企业“战疫”启示录:今晚19:00,金色相对论之 “区块链企业战役启示录”即将正式开始,金色财经合伙人佟扬对话创世资本创始合伙人孙泽宇、嘉楠科技区块链总经理邵建良、节点资本管理合伙人杨玉梅、Cocos-BCX发起人陈昊芝、火币区块链研究院副院长李慧,一起聊聊疫情当下,区块链企业该如何打赢这场“战疫”。 详情请扫描图中二维码或点击原文链接。[2020/2/13]
210000个区块的时间大约为四年,这也是币圈人说的四年一次减半的由来。因为比特币减半事件是写进比特币软件代码里并有分布在全世界的比特币全节点验证,其共识很难改变,这也是“In Code We Trust”的由来。
逐行解读比特币减半
上诉代码主要有几个函数和参数:GetBlockSubsidy、nHeight、Consensus.nSubsidyHalvingInterval、halving、nSubsidy。它们的涵义如下:
金色独家 数字彗星创始人张东谊:“黑盒加白盒”分析区块链安全:金色财经独家专访,针对近期热议的安全问题, 数字彗星创始人张东谊指出应该用“黑盒加白盒”分析一个项目或者系统的安全性,具体针对不同的项目要有不同的策略。
其中一种是黑盒分析,主要根据项目暴露的接口来测试输入数据而产生是否正确的输出信息,如果程序崩溃或者返回异常结果则需要进行下一步详细分析原因,如果程序内部本身设计有问题则可能需要通过逆向手段通过反汇编分析业务模块是否有问题;另外一种是白盒分析,主要了解程序内部逻辑结构、对所有逻辑路径进行测试,检查是否存在逻辑漏洞、缓冲区溢出漏洞、数组溢出、整数溢出、重入漏洞、处理外部调用错误、交易顺序依赖、时间戳依赖、条件竞争、权限控制等漏洞。[2018/6/18]
GetBlockSubsidy主要是活的当前区块高度下的区块奖励(nSubsidy );
nHeight为当前区块高度;
Consensus.nSubsidyHalvingInterval为比特币共识决定的区块奖励减半间隔区块,此值为一个常数,为210000。
halvings为减半次数,是一个整数变量,也就是对nHeight/210000取整;
COIN为常数,为100000000,也就是说,在比特币代码里,比特币的单位是聪。
nSubsidy为区块奖励。
1239行代码调用GetBlockSubsidy函数。
1240行代码:halvings=nHeight/Consensus.nSubsidyHalvingInterval,计算当前区块对应的减半次数。比如截止本文发稿,区块高度为629929,629929/210000=2.99,取整halvings=2。当区块高度达到630000时,halvings=3。
1242和1243行代码:if (halvings >= 64) return 0;判断减半次数是否大于64,如果减半次数大于等于64,则区块奖励为0。这也是来自比特币共识,只有64次减半,64次减半后区块奖励为0。
1245行代码nSubsidy=50*COIN,比特币软件每次执行代码都把区块奖励设置成50* COIN,也就是5000000000。
1247行代码nSubsidy>>=halvings,这一句是真正起作用的比特币区块奖励减半代码。>>= 是二进制右移操作,nSubsidy>>=halvings等价于nSubsidy=nSubsidy除以2的halvings次方。
1248行代码返回比特币当前高度的区块奖励值。
上述代码最后的实质是下面的公式:
因此,1-209999区块每个区块奖励为50/(2^0) =50枚比特币;210000-419999区块奖励减半为50/(2^1)=25枚比特币,420000-629999区块奖励减半至50/(2^2)=12.5个BTC。区块高度630000后减至50/(2^3)=6.25枚比特币。
大神也有BUG
不过,上述6行代码不是中本聪的原始代码,中本聪的原始代码如下:
尽管中本聪是大神,但不代表其代码就没有bug。因为nSubsidy是个64位的有符号整数,而>>= 超过64在C++中属于未定义行为,会导致数值环回,最终导致BTC数量不断重复2100万个比特币的释放过程,见下图。
Pieter Wuille修复了这个bug,有一个专门的比特币改进协议BIP042描述这个bug,文档见这里。
参考资料:
Where in the Code Does the Halving Take Place
BIP042
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。