上周四我在Tinder上快速约会了一个人,周五我们就见面了。一开始约会进行的很顺利,但后来他变得越来越奇怪...当我们聊了一段时间后,我发现他实在不符合我的胃口。
回到家里,忘记这个失败的约会,我习惯性的继续做着我喜欢做的事——追踪着ICO的交易数据。
也就是在那天,我坐在电脑前观看比特币和以太币交易流程的时候,发现了那些有意思的事情:这里面包括从托管账户到卖家的交易,也有从交易所到用户的交易,还有用户到合约的交易等等。
我会标记有意思的交易记录,追踪一些行为奇怪的交易,比如说儿童色情图片交易和人口买卖等。我做这事仅仅是因为娱乐。这些天我追踪了明显是骗局的ICO交易,想看看他们把钱转移到哪儿了。
当时我正在追踪一个我已经跟了好几个星期的交易:这宗巨大的交易是从一个多重签名的钱包的智能合约发起的。其实我也不知道我为什么要做这个事情,但鬼使神差,我还是打开了Etherscan的链接,然后大概扫了一眼他们的代码。
我记得我发现有趣的一点是,Gav和Nicolas在代码上写了一个组件,是个为了调用钱包库的内部方法 internal method (initWallet)。不过 Solidity 这个语言太烂了,我并没有抱太多希望在上面。等等,真的是这样吗?难道你不能从衍生合约中调用内部方法吗?我可不知道,我又不是 Solidity 的开发者。
我想看看到底是 Gav或Nicolas傻还是我傻,所以我决定自己去试一下。我在我私网上建立了一个钱包的合约,并且引用了另一个合约并试图去调用 initWallet()。不成功!
难不住我!我又想:“如果我做了一个外部方法呢?” 于是我就去试图移除内部修饰符。但是我发现,他们竟然没有在代码里写内部修饰符!
我的天,我没看错吧?!
好吧,孩子,这意味着无论是谁,我们都可以外部调用这个方法,并可以重设钱包的所有权限,还可变更钱包的使用参数,为了确定一下,我试图调用initWallet(),并且传入外部任意的所有者的地址,比如我。这个钱包把我添加到了所有者中!我可以随意使用这个钱包里的钱了!
我并不是一个有钱人,253个以太币的确是一笔不菲的收入,足足可以抵得上半年的工资了。但是我并不想因为这253个以太币就暴露了,况且我又不认识这个人,所以我将这个钱包放在了一边。
不过... 如果有机会在20岁出头就能退休了,这种好事谁会拒绝呢?换做是你你会拒绝吗?我提到过我并不富有,但我也不是很穷,但这的确是有利可图!我终于可以将我父母的贷款还清,给我哥哥买一辆新的车,给我的妹妹交大学的学费...
停停停!我又在做白日梦了!现在我需要去找另一个有很多很多钱的钱包,该怎么做呢?
我比较擅长分析数据,测试错误和异常,甚至是在网上直接追踪人,但是我却对以太坊如何工作的了解甚少,智能合约是如何储存的,或者其他能帮我找到钱包地址的东西。我拥有的只有一个可以快速同步以太坊区块链的RAM。我试图进行最基本的搜索,但是并没有成功。是时候要更换零件了,虽然我之前在Geth做过相关的事情,但是是时候去学习一些关于以太坊的JavaScript API了。
计划如下:
1.找出原型:找到那些最基本的原型,是钱包被创建的基础。
2.找到他们的子节点:当我有了这些基本原型,我可以找到用这些原型的钱包地址。
3. 检验:将这些钱包通过随机抓取样本来进行排序,我理想的数量在1W到1W1之间
4. 抢夺:一气呵成
5.清除:花剩下的几个月时间将这些全部清除。我的工作就是抓那些和我一样的人,所以我知道如何用美元和欧元兑换这笔钱。
1.找出原型
那什么,我真的是以太坊方面的白痴。我曾认真的搜索我硬盘上的区块链数据。
我如何识别那些原型的呢?好吧,当我阅读了以太坊上的文件后,我知道了签名的方式是根据EVM计算的,像这样:
get_first_4_bytes(keccak256(“method_name(arg1_type, …, argn_type)”))
在十六进制中,这个应该是0xe46dcfeb。没有很多的熵在这里,但是还是足够从区块链中抓取到他们。我迅速的将这些代码载入到我的 Geth钱包内,然后我就要去睡觉了。
第二天,我醒来的时候是这样的:
0x4f2875f631f4fc66b8e051defba0c9f9106d7d5a
0xa657491c1e7f16adb39b9b60e87bbb8d93988bc3
0xc0ffee0505d21342cd503bc57ed33fc2cec7f225
…
…
不是很差,现在该进行第二步了!
2.找出他们的子节点
我搜寻的方法很慢,但是是有效地。从合同创建交易来搜索对我来说已经足够了。现在,我简单的只是将新发现的原型地址替换掉之前的地址。这相当直接。
我的Geth有些小问题,但是我周一要上班,实在没时间管这些事,所以我得先搁置一段时间了。
周一晚上下班回家后,我将数据从五月份开始同步。这个进行得非常迅速,我将代码上传到 Geth 并让他们运行了一晚上。当我第二天早上醒来的时候,有了一个很漂亮的钱包列表。
3.筛选
我将这些数据导入到了excel 并且将他们排序。这里面有好多以太币!我发现自己变得越来越贪婪了。为什么我要找个1W的以太币钱包而不去选择一个有2W5的钱包呢?好吧,限制是2W5,我们来看看这个
0x91efffb9c6cd3a66474688d0a48aa6ecfe515aa5.
(https://etherscan.io/address/0x9 ... 8d0a48aa6ecfe515aa5)
4.抢夺
当我学习了API后这个事情变得更加简单了,沿着这条线走
我从这个地址抢了26793个以太币,这让我乐开了花。我迅速的将这些以太币全部换成了比特币后就去睡觉了。这一觉我睡的很爽。
第二天我在工作的时候,这些钱包列表和余额清单让我心痒难耐。我已经从其他的钱包里抢了很多的以太币了,但是我还想要更多。在吃午饭的时候,我回了家又清空了两个以太币钱包。
5.清空
这个是最让我头疼的事情,将一半的钱转成官方货币的确不是一件很容易的事情。将他们转成货币非常的容易,但是如果要将我之前所说的那些想法全部实现的话可能要等到明年年底了。
----
这个故事其实是根据真实经历改编,其实就是当初Parity的漏洞。
所以说,学好代码一夜暴富不是梦,不过话又说回来,做这种事情除了道德上的问题外,真的没有什么相关法律来约束一下吗?欢迎大家留言讨论
本文作者 Mitch Brenner ,转自公众号 硅谷区块链 |