以太坊(Ethereum)上的黄金大劫案

神秘消息

三周前(北京时间2018年3月18日11点38分)以太坊区块链上出现了一则消息,颇为耐人寻味。这则消息的背后,是以太坊上有史以来最大的一笔钱包盗窃案。

这则消息第一次出现在这笔交易中:

0x020fa89e0cbd8eeaf2cda762eb50d9ff88cc5b6c5e31e3c500fa57973c9054a2

交易的Input如下:

乍一看,似乎没有什么特别的,解码一下,居然是一封公开信:

On December 15, 2015, 41,234 ether was stolen from address 0x1757a569de8525aa8f1990095aa5e4ec8cccdae1 and moved to address 0x5696ae5ad2c22a4afc03bbae5bf18ca9278ae5c5.

2015年12月15日,41,234个以太币从地址0x1757a569de8525aa8f1990095aa5e4ec8cccdae1被偷走,并转移至地址0x5696ae5ad2c22a4afc03bbae5bf18ca9278ae5c5。

These funds were from an Ethereum Foundation DEVGrant and were meant to fund a project to benefit the community.

这些资金来自以太坊基金会下属的开发者资助计划DEVGrant,用来资助造福社区的项目。

This is a message for whoever controls address 0x5696ae5ad2c22a4afc03bbae5bf18ca9278ae5c5:

这是给地址0x5696ae5ad2c22a4afc03bbae5bf18ca9278ae5c5控制者的公开信。

From now until March 30 2018, we are making the following offer:

从现在开始直到2018年3月30日,我们开出如下条件:

If you return at least 50% of the funds to address 0x2ba90431EfaF7877AEE212a2330235FcfcA9CbeD, we will finalize your ownership of the remaining 50% of the stolen funds.

如果你返还至少50%的被盗资金至地址0x2ba90431EfaF7877AEE212a2330235FcfcA9CbeD,我们将会承认你对其余被盗资金的所有权。

URL: medium.com/@taptrust/1b

Email: recovery@taptrust.com

41,234个以太币,在巅峰时期,价值超过1.5吨黄金,这可真是名副其实的“黄金大劫案”了。


故事

泡杯茶,故事开始了。

维塔利克·布特林(以太坊创始人,俗称V神)发布以太坊白皮书后不久,詹姆斯·利维(James Levy)邀请V神来家中做客,这是他们的第一次见面。

维塔利克·布特林
詹姆斯·利维

詹姆斯·利维被以太坊的概念和潜力深深的迷住了,他倾尽全力地学习相关知识,融入社区。他希望可以做一些事儿,不仅仅为了自己,他也想为整个以太坊的生态系统作出贡献。

不久后,詹姆斯·利维发起了一个叫Agreemint的项目,向普通开发者们传授以太坊的相关知识。他使用一个叫Mintchalk的在线合约平台,示范智能合约的开发,并录制成视频,供其他开发者学习、参考。

当时,以太坊尚在开发中,甚至未来以太坊上用来开发智能合约的语言都没有最终确定。早期,詹姆斯·利维使用的是Mintchalk平台上的Serpent语言来做智能合约的示范,直到2014年,以太坊才最终确定使用Solidity作为智能合约的开发语言。

时间一晃就到了2015年3月,此时的以太坊已经完成了众筹。詹姆斯·利维收到了以太坊基金会的邮件,表示将会对他的Agreemint项目进行资助,具体金额超过4w以太币。

由于以太坊钱包尚未正式上线,詹姆斯·利维使用了以太坊官方提供的一个临时脚本pyethtool生成自己的钱包,并把地址发送给了以太坊基金会。

2015年8月,以太坊正式上线后不久,詹姆斯·利维又收到了以太坊基金会的邮件,表示之前承诺的资助金额已经准备就绪,将在不久后发送到他之前留下的地址。

接下来的几个月,詹姆斯·利维时不时的会打开钱包软件查看,检查以太坊基金会的资助是否到账,但是,他的账号迟迟没有收到任何交易。

2016年1月,詹姆斯·利维又一次查看时,发现了奇怪的事儿。他的账户余额依然是0,但是却有了两条交易记录:

  1. 2015年11月24日,以太坊基金会转入的以太币。
  2. 2015年12月16日,这些资助的资金又被转到了另一个地址。

詹姆斯·利维简直不敢相信自己的眼睛,他非常自信自己没有泄露私钥,钱包一直是处于冷钱包状态。

然而,区块链上的数据是不会骗人的,黑客是如何盗走数量如此庞大的以太币的呢?


探寻

要想知道究竟发生了什么,我们还要从詹姆斯·利维生成钱包的过程开始说起。

前面我们说过,他生成钱包地址时,以太坊尚在开发中,他使用的并不是我们现在使用的geth生成钱包,而是使用了一个临时的脚本pyethtool。该脚本曾经是ethereum/pyethereum项目的一部分,现在已经被移除,不过你可以在github的提交历史中找到它:pyethtool


让我们来看看这个脚本是如何使用的:

首先,需要用户提供一个短语,比如我们用hero这个词来做示范:

pyethtool sha3 hero

得到输出:f2de8dfd543154155ebe73b77637eeea045e4e844a4b5c1933eb2db1877bfcf9

这就是你的私钥。

然后,用户使用私钥导出钱包地址:

pyethtool privtoaddr f2de8dfd543154155ebe73b77637eeea045e4e844a4b5c1933eb2db1877bfcf9

得到输出:0x9f94c9cdc0dc0a6f854babab1fe7c4ed4b8dc8d2

这就是你的钱包地址了。

实际上,这个工具是对输入的短语进行哈希运算,得到的结果作为私钥,进而使用私钥导出地址。

詹姆斯·利维就是这样生成接收款项的地址的。

发现问题了吗?这种生成钱包的方式,其安全性完全取决于用于生成私钥的短语。

pyethtool这个工具是公开的,只要猜到了用于生成私钥的短语,再次使用pyethtool,就可以得到同样的私钥,进而偷走相应账户下的以太币。

詹姆斯·利维使用了一个非常容易猜到的弱口令作为生成私钥的短语,黑客无意中猜中了这个短语,于是,他获得了私钥,盗走了全部的以太币。


给大家留个小思考题,如果我使用pyethtool生成了一个地址0xe46e59667e4ad2c20523ecb7c5661a418f56de39,你能找到我的私钥吗?


协议

发现资金被盗后,詹姆斯·利维做了个工具,实时监控着区块链上的变化,只要这个保存着被盗资金的地址有任何变化,他都会在几秒内收到通知。

然而,这个地址再也没有任何变化,哪怕是1 Wei以太币的变动也没有。

也许这个盗走资金的黑客只是为了炫耀一下,也许他已经丢失了保存被盗资金的钱包私钥,也许他担心暴露身份,也许,他已经不在人世。

为了尝试取回被盗资金,詹姆斯·利维在以太坊中发布了这封公开信。

他希望用这种方式,和盗走资金的黑客达成协议,取回部分资金,黑客也可以从此光明正大的拥有剩下的资金,可以说是双赢的局面。

不过,一直到截止日期到来的那一刻,黑客没有作出任何回应,4w多以太币还是静静地躺在那个神秘的地址上。


共识

区块链是建立在“共识”基础上的,因为有“共识”,所以区块链上的内容获得大家的承认,区块链系统得以运行下去。

我们常说“区块链具有不可篡改的特点”,这并不是说区块链上的内容是不能修改的。“篡改”与“修改”一字之差,意思却相差千里,这二者之间最重要的区别便是,“修改”是得到大多数参与者认可的,而“篡改”不是。当对区块链内容的修改是能够形成新的“共识”的时候,这种修改便可以发生。

最著名的便是“The DAO”事件,黑客盗走了超过360w个以太币。好在社区紧急行动起来,在大多数人的支持下,新的“共识”很快打成,以太坊进行了一次硬分叉,将被盗的以太币通过修改代码的方式强行夺回。这次“修改”区块链的行为,遭到了小部分人的抵制,他们认为无论是“修改”还是“篡改”,都不应该发生在区块链上,链上的数据应该是亘古永恒的。于是,他们拒绝承认新的分叉,坚持不夺回被盗资金的“共识”版本,这就是今天的以太坊经典(ETC)。

在Github上,我们可以看到一个以太坊改进提议(EIP):EIP 867

这个提议的主要目的是:为通过分叉方式找回丢失的以太币提供一个标准化的流程

故事中的主角詹姆斯·利维便是这个提议的起草人之一。

他计划推动这个提议,使社区接受,作用按这个提议规定的流程,在以太坊社区中达成“共识”。通过硬分叉的方式,取回那4w个被盗的以太币,看来他是不达目的誓不罢休了。


故事到这里就讲完了,对加密货币投资人来说,我们应该吸取到什么教训呢?

脑钱包这类从一个短语生成私钥的方法一定要谨慎使用,因为一旦短语被别人猜到,资金就会遭受损失。正确的做法应该是,从有足够熵的随机源生成私钥,并尽可能使私钥处于冷钱包状态。每次连网使用后,都要重新生成冷钱包,并把剩余资金转入冷钱包中。


如果你喜欢这篇文章,就请收藏或点赞吧。

欢迎关注我的知乎,听李明阳用人话讲区块链

未来还有更多实用有趣的知识带给大家。

文章被以下专栏收录