十一、抢币行动
2014-01-15 14:42,金牌客服X传来急讯:大户Q的钱包被盗。
虽然事情很紧急,但还是有必要先强行科普一下,虚拟币的钱包被盗和现实中的钱包被盗有什么区别。
简单的理解,现实中的钱包被盗之后,钱包就在小偷手里了,里面的钱一般也回不来了;但是虚拟币钱包被盗之后,钱包同时在自己手里和小偷手里,这就有挽回余地了。这有点类似网游账号密码被黑客知道了,自己和黑客同时拥有了这个账号。在以前网游安全机制不完善的时候,黑客拿到账号会先改了密码和密保问题,然后把道具,甚至账号都卖了。不过,虚拟币的特性从数学上保证了这个“密码”(私钥)是不可修改的。既然这时候的钱包同时被自己和黑客控制,那就要跟黑客拼手速了,看谁先把钱拿出来。
说得技术一些,我们通常看到的虚拟币钱包地址,是类似这样的一个字符串:1icstarNBYj6F9D8eqGXJuf2JpxTuyT9c(欢迎土豪打赏这个比特币钱包)。给别人转账的时候,就是要填别人的这个钱包地址。那么,怎么证明自己是这个钱包地址的主人呢?所有的证明信息都在wallet.dat这个本地文件中。事实上,wallet.dat存储的是私钥,而钱包地址就是对应公钥的hash。每一笔从自己钱包出去的转账,都需要自己的私钥签名才会被虚拟币网络认可。所谓钱包被盗,其实就是wallet.dat被黑客拷走了,于是黑客就有权限用里面的钱了。
到这里,其实还有个问题没解决。从直觉上想,黑客应该会在拿到虚拟币之后,马上把里面的钱都转走。一旦转走了,由于虚拟币的匿名特性,就再也不用想找回来了。如果黑客悄悄地拷走了钱包,然后把钱转走,消失,等我们反应过来的时候,钱已经没了。那这还有什么可以挽回的吗?还真有。因为里面有一部分钱,还没“成熟”,要等几个小时才能转。
这次大户被盗的是他挖矿的收款钱包,由于是在狗池挖的,所有的币都在挖矿时发放。虚拟币有个很有趣的设计,为了防止因为51%攻击,所有虚拟币都要求:挖到的币,要被N个后续的块承认后才能使用。对于质数币来说,N=3200,平均每块一分钟。也就是说,刚挖到质数币需要在两天之后才能使用。对于虚拟币而言,这种保守的设计可以大幅提高虚拟币的稳定性,也让这次抢救成为了可能。
回头看一下大户,在钱包里面还存有价值数万的未成熟的币,所以现在的最佳办法,就是一旦一个币成熟了,就马上转到自己的新钱包里。当然,黑客也知道这点,也会掐着成熟的时候,马上转到黑客自己的钱包里。
简单了解了事情的经过,大户从群里下载了一个嵌入了木马的挖矿程序,估计这个木马扫描了整个硬盘上所有的wallet.dat,并传给了黑客。现在大户所有虚拟币都在危险之中。
10分钟后,狗池提供了紧急抢救方案:提供程序化转账服务,为大户尽可能降低损失。
之后的一小时,金牌客服处于失踪状态。原来她已经完全得到了大户的信任,拿到了大户的钱包,一起帮大户手工抢币。大户和金牌客服两人应该是和一个黑客在比手速,成功率基本和参与人数成正比:70%。
在金牌客服的建议之下,大户采纳了我们提出的程序化抢救的方案。程序化抢救的要点就是在一个新币(块)刚刚成熟的时候,马上提交转账申请。提交过早会被网络拒绝,提交慢了就被黑客转走了。到这里,我们还天真的以为,程序的速度肯定比手工要快。实际上真正的瓶颈在于P2P网络的同步时间。一般虚拟币P2P网络的同步时间在两秒之内,也就是说,当有人挖到一个新块(同时意味着此前的第3200个块成熟了),通过P2P网络广播出去,大约两秒之后,全世界都知道了这条信息。对于矿工而言,知道了这条消息,就可以马上放下手中的活,开始挖下一个块了;对于此时的我们,就可以马上发出转账请求了。虽然这个延时只有短短的一两秒,但这足以让黑客手工完成转账操作。为了更快地得到这条宝贵的新币成熟的信息,我们在中美两地多个机房部署了钱包抢救程序,其中一个节点就在我们狗池的同一个机房,占尽先机。经过这一番改造,我们基本保证获取信息的时间在0.5秒之内,就算黑客比我们早0.5秒得到消息,手速也比不过程序。
大约一个半小时之后,分布式程序化抢救方案上线。抢救成功率上升至100%。最终共为大户挽回损失N万元。
p.s. 几天后,金牌客服收到大户赠送的 iPhone 5S。