首页 >  DAO的研究 >  正文
In Code We Trust:读比特币减半代码
发布日期:2020-05-11

In Code We Trust:读比特币减半代码比特币减半的代码前后一共十来行,简洁地令人发指。减半的代码如此简洁,减半事件如此瞩目。每四年的奥运会都会推迟或者取消,但是减半永远都会如期进行。

加密数字朋克们喜欢把 “Code is Law” 挂在嘴边,但是大部分时候 “代码即法律” 不过是加密朋克的理想主义口号,普通人根本无法看懂代码,大部分时候我们还是需要依赖技术的封装,接口处的人机交互部分需要傻瓜都能用才会带来大规模的普及。编程教育也许到了下一代会变为通识教育,由于机器翻译的高度发展人们不需要为了减少沟通摩擦而学习一门第二人类外语。对信息获取的摩擦将来自于机器语言盲区,第二语言将会变成机器语言。“代码即法律” 对社会整体的计算机通识教育水平要求甚高,所以在我们这一代应该是一个美好的愿景罢了。

每个人可以有减半对币价的不同解读,但是减半的本质是一个比特币货币政策的完美预期管理机制。从去年开始在很多场合我都说过对 “减半行情” 的看法

1. 聪明的资本不会因为减半这个已经预先设置好的时间点而突然蜂拥入场

2. 合约和衍生品平台全面成熟,合约主导的市场结构以及合约/现货交易量倒挂会导致价格经常性均线回归

3. 比特币要面临第一次大的经济周期,比特币是上一次全球金融危机下的产物,还没有经历过第二次全球性金融危机 (比特币在这次的表现在很长一段时间都成为了标普的高beta)

减半机制的如期、顺利进行,是比特币代表的 “机器自治经济体” 可以承担起人类货币政策或者一部分经济活动指引的的一个强大例证。之前在微博上有一个关于这个和朋友的讨论,其中一个类比是比较接近的:

  1. 国家发债(法币)依靠的是政府信用。比特币也是债,只是这个债的信用被去中心化的信任(trustless trust) 取代
  2. 区块奖励和手续费是国防预算,矿工是军队,拿着国防预算维护这个“国度” 的安全和稳定
  3. 开发者是类似立法机构和制定政策机构
  4. 全节点是国会议员,决定了开发者的出台的某项新的法案或者政策是否能被采纳接受
  5. 不同的开发团队充当了不同的党派,哪个党派的主导政策,那要看全节点最终选择了谁
  6. 持币者是这个国家中的“国民”,转账费用其实是某种意义上这个国度里的“税收”,不过税收直接给了军队,而不是通过政府进行再分配(当然政府可以有再分配的提案,譬如一些比特币的分叉币尝试过“开发者税” 就是把固定的矿工奖励直接打给属于开发者的固定钱包)
  7. 矿机厂家扮演了军火商的角色

去年比特币网络支付了52亿美元给矿工用来确保网络安全。如果比特币是一个国家,这52亿美元视作国防支出的话,那么他能在全球国防支出中能排41位,和越南乌克兰等国相当。

美元作为全世界市值最大的永续债,维系美元信用的成本也是同样的高昂。美国的军费开支已经达到了二战以来最高水平(上图)。过去60年美国继续输出自身国家的通货膨胀,国内喜乐安康,物价稳定,一片欣欣向荣。国外区域性危机不断,战乱不停,一有不听话会威胁到美元核心地位的(譬如萨达姆,譬如卡扎伊)就拿起大炮+镰刀。基本每次的区域性危机,譬如亚洲金融危机,拉美金融危机等等,我们都会 看到“美元流动性危机”在危机后厚重的影子。虽然美国政府在这些危机中是否有意收割不得知,但是美国掌握了美元流动性这个可以救命也可以杀人的管子是毫无质疑的。随着美元的流通性陷阱和信用危机涌现,这个信用成本将会只增不减。

在减半之际,我想来想去最有意义的事情应该是让更多人了解比特币减半的真实执行层面的机理。这篇文章我会尝试逐行给大家解释比特币减半代码,希望每个人都能相信的是自己理解的东西,而不是某个人,某个虚幻的概念,或者“信仰”本身。

美元本是美联储发行的永续债,在墨绿色的纸上印上In God We Trust后变得似乎异常神圣。可是每个地方,每个人的 “上帝” 都各有各的不同,该相信哪个“上帝” 呢?骨子里千百年来不相信鬼神的中华民族的上帝又是什么的?

代码真实可见,执行逻辑可被校验。与人类自发形成的社会协议不同,代码的存在让执行变得“不可逆”。所以可能更准确的说法应该是 “Code is Law Enforcement” (代码即执法) 而不是 “Code is Law”。当国家机器垄断了暴力机构,当立法执法成为了巨大的黑盒,选择相信一个可审查的“enforcement” 机制,是比特币带给我们的一个选项。

下面上代码和解释,in code we trust

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval

  • 这里定义了减半次数halvings,即“减半次数”为整数变量
  • nHeight 是当前区块高度,后面那一堆调用了共识里的一个“减半间隔区块数”,在比特币代码里是210,000
  • halvings 在每次代码执行的时候都会返回 当前区块高度/210000, 因为定义为整数变量,当不被210,000整除的时候,小数部分不会被存储,所以在5月11号晚上之前(区块高度630,000),都是2
  • 每到新的整除高度,譬如630,000 -变为3,再下次的840,000- 变为4,halvings变量都会相应增加

if (halvings >= 64) return 0;

  • 如果减半次数大于等于64,区块奖励返回0
  • 这个可以保证最多只有64次减半,到了64次之后,矿工将不再有奖励
  • 届时的比特币网络必须依靠手续费来保证网络的安全和矿工的激励制度
  • 当年有人问过中本聪,担心不担心“无奖励终局” 中本聪的回答其实非常好: “到了那个时候(100多年以后),比特币要么已经灭亡,要么挖出来的比特币已经成为大规模的流通价值载体。” 两种情况都不需要担心没有无挖矿奖励矿工拒绝挖矿的情况

CAmount nSubsidy = 50 * COIN;

  • 这里的nSubsidy = 挖矿奖励
  • 每次代码执行都会把挖矿奖励设置成50个比特币* COIN
  • COIN是常数变量100,000,000 用来把挖矿奖励变成聪的单位

nSubsidy >>= halvings;return nSubsidy;

  • 最后两行是真正的减半执行命令
  • 挖矿奖励>>= 减半数中用了C++里的一个右移操作。因为是是二进制右移,所以 x>>=y 表示 x = x除以2的y次方 
  • 当到了630,000 区块高度的时候,y在这里是减半数halvings,减半数从2变成了3
  • 所以挖矿奖励从50个比特币除以2的2次方,变成了50个比特币除以2的3次方,由此完成了减半

下面我把完整的减半代码贴上,感兴趣的同学可以去点击阅读原文的比特币源代码自行查阅 


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;

}

最后,减半不是什么大节日,你庆祝也好,看衰也罢,减半都会如期进行,直到全世界只剩下最后一个比特币全节点。安安静静找个喜欢的人,看看夜光白皮书,一起读一读完成减半的代码,聊聊人生,这也许是作为比特币爱好者你我最好的安排。Dovey

写于比特币区块高度629940