国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > Mt.Gox破产,都是错误编程惹的祸

Mt.Gox破产,都是错误编程惹的祸

来源:程序员人生   发布时间:2014-09-12 00:13:14 阅读次数:2455次

全球最大的比特币交易平台MT.GOX正陷入破产边缘,这无疑给还在火热的中国比特币市场泼了一盆冷水。不过冷静思考一下,这濒临倒闭的背后原因是什么?是不是无法避免?本文作者Ken Shirriff 就结合2011年Mt.Gox出现的问题分析一下这个全球最大的比特币交易平台的技术问题。


在2011年10月份的时候,Mt.Gox因为突发事故导致超过2609个比特币的损失。(当时2609个比特币的总价值是8000美元。如果是现在的话,这2609个比特币价值约超过150万美元。)不过当时在比特币论坛上就有相关的猜想,具体原因没有官方说明。所以说,这次Mt.Gox被盗事件也不是空穴来风,主要原因还是软件上的漏洞给黑客份子以可乘之机。当然这也暴露了Mt.Gox对之前事故的疏忽和软件编程错误之严重。

问题结症在哪?

当你向一个地址发送比特币的时候,在比特币交易过程中所要发生的事情远比你想象的复杂得多。交易程序里包含一个微型计算机程序,而这个程序是由Bitcoin Script语言编写的,它的任务主要是执行这个比特币能否交易的出去进行判断。这个程序还能检查公开密钥是否和你发送比特币的地址相吻合,如果实名验证是有效的,那样就能证实发送者是比特币的真正拥有者,交易也就可以顺利进行。

你可能会想知道为什么比特币交易平台要使用这么一个复杂的系统来进行交易信息验证。其实他们的想法是,通过这种编程语言编写出来的程序,比特币就会允许多种不同类型的交易方式,例如第三方交易或者是更加复杂的合同交易。

这里可以讲述的更详细一点,一种典型的ScriptPubKey编程语言看起来就像这样:

code_snippet_id="216060" snippet_file_name="ptcms_1393899010_0.js">OP_DUP OP_HASH160 f2e63314c350094550c703fcdcd4850ad37d8310 OP_EQUALVERIFY OP_CHECKSIG

这些就是将比特币发往指定地址(1P9LHy6K2c9cwbfSfdaaoYVAprqUYtcFnB,十六进制形式是 f2e633...)的程序。如果想要用这个地址兑换比特币的话,卖家必须提供这个地址的公开密钥1P9L...,同时在交易协议上签名(这主要是证明他们拥有私人密钥)。走过这些程序之后,首先是要复制提供的公开密钥,计算160位散列,并验证公开密钥是否和所提供的公钥地址相等同。然后检查实名验证的有效性。如果一切顺利,比特币就可以交易了。如果有问题,交易就会被拒绝。


但是不难发现,在Mt.Gox一些失败的交易中,程序里出现了一个很小但很致命的错误:

code_snippet_id="216060" snippet_file_name="ptcms_1393899010_1.js">OP_DUP OP_HASH160 0 OP_EQUALVERIFY OP_CHECKSIG

我们可以看到在项目地址的散列中,交易行中有一个0字节,表现为OP_0,还增加了一个空的字节数组。因为160位散列不可能匹配一个空数组,所以这个脚本不可能成功地执行任务,因此比特币也不可能被交易出去。

为什么Mt.Gox允许蹩脚的比特币交易存在?

也许你很想知道为什么Mt.Gox平台允许有些比特币交易无法完成。至于准确的答案无法考究,或许我们可以猜测:因为众口难调,比特币交易平台所制定的交易规则根本无法让所有的买卖双方感到满意。比特币的设计理念就是用Bitcoin Script语言编写一个可以给人们带来更灵活、更便利的虚拟产物,即使是这样,在条件不成熟的情况下还是会搬起石头砸自己的脚,正如现在遇到的事情一样。另外,如果仅仅因为一个复杂的语法问题就拒绝一笔比特币交易的话,这是很危险的,因为用户会质疑比特币的有效性,无疑会引起混论。

计算机科学家们可能会在这个时候说是因为“计算机设备停机问题”导致了现在这种结局。然而,这根本就说不通,因为Bitcoin Script没有循环体,程序是不会停下来的。

如果你没有私人密钥而去使用一个地址的话,那么丢掉比特币是很常见的事情,并且也没有软件能够检查出这一缺陷。但是有一个很奇怪的现象就是有些交易故意向一个有问题的地址发送少量的比特币,这样就能在blockchain里面隐藏文本和图片了。这个漏洞应该不算小吧!?


另一个很有趣的脚本Bug

上面只是分析了基于比特币交易层面上的问题,不过还有另外较为有趣的可以丢失比特币的bug,有些交易记录里包含毫无意义且不可修改的脚本错误:

code_snippet_id="216060" snippet_file_name="ptcms_1393899358_2.js">OP_IFDUP OP_IF OP_2SWAP OP_VERIFY OP_2OVER OP_DEPTH

原来这些脚本都是ASCII文本脚本,本来是应该将赎回脚本放入交易当中的,可是有些P2Pool淘币者一不小心将文字脚本放了进去,这就导致相关的比特币由于这个错误而不知不觉就没了。

总结

由于软件编程错误导致比特币丢失是一件并不复杂的事情,Mt.Gox在之前就已经因为同样的错误使得数千个比特币丢失。但是Mt.Gox并没有吸取教训对自身技术进行改进加固,所以说这次Mt. Gox因交易系统存在缺陷令黑客盗取大量比特币,最终崩溃是一件不足为奇的事情。(编译/薛梁  责编/付江)

原文:RighTo

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生