事件经过

2010年8月15日(也就是比特币诞生的第二年,创世区块于2009年1月3日诞生),有人发现,在比特币区块链的第74638块上,一笔让人惊愕的交易。这笔交易出现了184 467 440 737.09551616个比特币,其中有922亿个比特币被发送到两个地址,交易如下:

众所周知,比特币总量是2100万,那么为什么这两笔交易,会大于总比特币总量?

这恐怕是比特币史上最严重一次漏洞事件了,如果不及时修复这个问题,比特币系统或许直接被毁掉。

 溢出原理【原因】

这个问题是怎么发生的?原理其实也简单:大数溢出引起,算是编码不严谨引起的了。

在小时候,我们学数数时候,用的方法——掰手指。

从1数到10,十个手指最多可以表示到10(不考虑用脚或者半截手指情况),如果数到11,10个手指不够用,手指表示就回到1了,这算是最原始的一个大数溢出的认识吧。

计算机对数的表示也是类似,也有最大限度。

为了方便表达,我们用Go语言的uint8做例子,一个uint8 表示,uint8一个字节空间,表达的范围是:bin(00000000) 到bin(11111111),也就是0-255,如果再大,就会发生溢出,高位被抛弃掉,又会变成0开始了。

代码演示:

理解了这个,比特币的漏洞的理解就方便了。

问题修复

在漏洞被披露后的三小时内,中本聪及其他比特币开发者发布了0.3.1版本的修复程序,此更新引入了逻辑,拒绝具有溢出输出值的交易。在第74691区块时候,带补丁版本的块链终于追赶上出现漏洞的块链,也就是大约20多小时后,比特币以硬分叉情况有惊无险地解决了这次最为重大的危机事件。对于大数溢出逻辑代码如何修复,就不用讲述了,应该会coding 的伙伴都懂,可能实际编码中不太严谨而已。

我是合约养家,关注我获取更多你不知道的区块链讯息!

#比特币减半

#BTC

$BTC