天池矿池 2018 纪实

这类故事鲜有人能体验到,今年5月就想写篇博客描绘下天池在最初的一个月的大起大落,但每个月发生的新故事又应接不暇,遂写篇年度总结记录防止遗忘。

机缘

接触区块链大约在17年的6月份,这波牛市的中间时间。大约在17年10月偶然在知乎上看到一个 Node.js 开发的公链项目 Nimiq 的描述,点开被 Demo 惊艳到了,这是首个使用 Web 就能运行全节点并且支持闪电网络的 Demo,能够在浏览器上实现不需要任何代理节点的秒级转账,并且 UX 设计相当不错。当时还写了一篇文章专门介绍这个技术实现。

这个项目的团队主体以德国、欧洲人为主,PhD 居多,十人不到的团队也依靠 Demo 和背景在 ICO 热潮的初期融资巨额数目(以 ETH 币价巅峰时期计算大约3亿人民币)。由于对 Node.js 和 Web 挖矿的兴趣,我也因此继续跟进该项目的代码。在两三个月的时间我和 zzzkky 同学断断续续的设计出了一套矿池协议、开发了能够出块的矿池节点和对应的客户端。彼时在没有看过任何矿池协议代码下开发出的这套系统也算是重走了一遍最初的比特币矿池开发者的老路。通过在社区的宣传,我的单节点 Nimiq 测试网络矿池的运行也在早期积累了一批矿工。最早的节点运行在阿里云上海机房,为了能够服务国外矿工,在还是测试网络的阶段矿池就已经改造成了包括美国、欧洲、香港、国内节点在内的分布式架构。随后的几个月里,Nimiq 的项目代码经过了大量的迭代和重构,通过跟进项目我也在几个月的时间内将主要模块的实现都了解透彻。

18年初币圈经历了疯涨,大量新人入坑,项目团队为了不错过这个新人爆发式增长的时期,计划在4月15日上线主网,彼时依然只有我一个矿池项目在测试网络上运行,期间还收到过十万刀收购系统代码的邮件,但我并没回复邮件。

启动日

4月14日的晚上,本科同学要回西安工作,在几个同学吃了送别饭后,我买了点水果和面包就回去睡觉了,做好了24小时马拉松式迎接项目启动的准备。还专门买了当时的网红巨型回车按钮,让正式上线有点仪式感。

4月15日凌晨3点左右,起床吃了点干粮检查全球各个节点服务器的状态,6点 zzzkky 带着笔记本来到我这一起准备上线,彼时的 Discord 和 Telegram 社区讨论都十分激烈。大约在7点10分左右项目的 GitHub 地址释放了主网的种子签名,我和 zzzkky 在一分钟之内启动好了全球的所有节点,在测试网络运行的矿工客户端都无缝切换到了主网,因此除了创世区块和 720 个为了防止启动分叉烧掉的块以外,从第 722 个块开始的连续 39 个块都是天池挖出的,当时的币价极高,一个块大约折合 420 元人民币。

启动后,由于配置了 Nginx 转发 WebSocket 和 Socket.io 这两个目前看来错误的技术决策,导致在连接单个节点的客户端数量上千后以后极易造成掉线,在短时间内无法修改程序发版的情况下,横向扩容了一些阿里云暂时缓解问题。

由于最初的一个星期只有天池的客户端能够做到简单易用,项目团队的客户端对 SOLO 矿工有一定的门槛,而且在中国境内由于 GFW 的影响部分地区 P2P 同步数据困难,当时的币价下极高的挖矿收益让几乎所有的矿工都选择了天池,首日的出块占比超过 90%。团队的社区负责人 Richy 私聊我关于是否能把代码开源,我回复表示只有客户端能开源后,Richy 表示理解。

在依靠横向扩容平稳的渡过了午后,疲惫的我开始睡觉,突发情况则让 zzzkky 喊我起来。然而,此时的稳定状态只是暴风雨前的宁静。

DDoS、协议攻击、勒索与私池

4月15日晚上9点半,我被喊起来了,这也是第一次 DDoS 攻击的时间。

没有抗 DDoS 经验的情况下,面对攻击难以应付,在用 Nginx 简单的清洗规则缓解了轻量级的 DDoS 后,更大规模的 DDoS 依然无力应对。根据天池群里的矿工建议,我重新部署了一套地址不公开的私池 hehe,地址只私发给了部分大矿工,hehe 私池的出块占比一度超过 85%。此后的一个月的时间里,代号为 hehe 的出块都是社区猜测和讨论的热点,不明真相的吃瓜群众以为是拥有超大算力的 SOLO 矿工。

公开的天池除了遭到 DDoS 攻击和 DDoS 攻击者的勒索以外,更大的威胁是协议攻击。由于天池的协议都是我自行设计的,存在被黑客利用的漏洞能够欺骗矿池,达到不挖矿也分收益的效果。在4、5月份由于长时间的收益低下,我和 zzzkky 发现了协议攻击者并每天封杀其钱包地址,在遭到封杀后该攻击者使用搞笑的 Discord 手动阅后即焚的方式私聊我,让我“购买”漏洞。但是通过攻击方式我也找到了协议漏洞,修改协议需要矿池节点服务和运行在矿工机器上的客户端一起更新,短时间内难以完成这项工作,因此我们只好一边封杀协议攻击者的钱包,一边寻找解决办法。整个协议攻击造成的损失数量接近千万 NIM。

除了外力攻击,程序本身和部署服务器也有诸多问题:(1)Nimiq core 的内存泄漏只有在频繁出块的天池节点上才能显现,定时的人肉重启持续了一周,后来我也给官方团队修复了该内存泄漏问题;(2)阿里云上海机房的网络受到 GFW 的影响,定期从晚上11点开始就无法和国外进行 P2P 通信持续1小时才能恢复,国内私池每天断线1小时也在当时造成了巨大的损失。

虽然存在各种攻击和勒索,但是彼时的 Nimiq 生态下,除了 SOLO 矿工以外,天池依然是唯一矿池,出块占比超过 80%,并且分布在不同的钱包地址上,不进行深入挖掘是无法知道天池拥有多少占比的算力。社区则开始渲染天池 51% 攻击论,Reddit 等论坛也有热心的矿工分享他们在天池上层封装的脚本,给天池的传播带来了很大好处。

上图:嚣张的勒索

错误决策与涅槃重生

大约在4月底,项目团队为了解决天池一家独大的问题,几乎所有开发人员都投入进去完成了一套开源的 Nimiq 矿池的框架。由于有了矿池开源代码,Nimiq 矿池在一周内如雨后春笋般涌现,巅峰时期甚至出现过二十多个同时活跃的小矿池。

被协议攻击折磨的我错误的选择了 all in 项目团队的开源矿池。开源矿池为了防止大矿池的 51% 攻击在客户端也选择了使用 P2P 协议并将客户端取名为天池 2.0,而国内大矿工的网络环境难以支撑 P2P 协议的数据同步,2.0 版本造成了天池算力的暴跌甚至归零。与此同时由于开源矿池的出现,众多小矿池在其上进行二次开发修改,各有优势特色,拉拢了一大批矿工进驻。天池在5月份初只花了一周不到的时间就从算力霸权跌落谷底。好在 hehe 私池不受协议攻击的干扰依然拥有部分稳定的算力,给予一丝心理安慰。

重新审视优势与劣势,天池当前最大的优势就是自行研发的协议与开源矿池的 P2P 协议不同,直连矿池需要的网络带宽更低、效率更高,并且更符合 GFW 控制下的中国网络。5月4日的那个周四开始,我沉静下来花了整个周末的时间持续编码重新实现了直连且不被协议攻击的 Nimiq 矿池协议,5月4日到6日只睡了几个小时。从此开始,天池的软件拥有绝对的优势,打响了王者归来的绝地反击。

上图是在5月5日天池新版协议的客户端发布后的算力分布图,其中红色和橙色分别是天池公池和 hehe 私池,蓝色是在开源矿池发布后做的最大的 Beeppool。

算力战争

5月开始,主旋律是算力战争。算力战争在比特币时代已经发生过了从 CPU、GPU、FPGA、ASIC 矿机的降维打击故事,而 Nimiq 的特殊算法设计,让算力战争之发生在软件层面。

在重新发布使用了新协议的客户端后,天池算力回到了第二名。彼时的第一大矿池 Beeppool 的主力开发者 Blub 发布了针对不同的 CPU 指令集架构优化过哈希算法的客户端,算力平均能提升 50%,在一两天的时间内我们参考了 Beeppool 的开源客户端代码,也发布了新版的天池客户端,算力达到一致。随后 Blub 又发布了闭源的新版客户端,算力再次提升,我们将其闭源客户端的核心 .node 文件复用达到了同样的算力。此时时间已到5月底,天池的算力已经和 Beeppool 不相上下。

此时除了天池和 Beeppool,其他矿池同样开始发力进行宣传和软件更新。下图是 Sushipool 的宣传图,天池是此时的 Issue#2

到了7月份,Blub 随后再次发力,新版本不仅再次提升了算力 15%,而且将客户端的核心部分进行了混淆加密。zzzkky 花了几天时间反编译破解了其优化方式并复用,再次将天池和 Beeppool 的客户端算力拉到同一水平。社区中虽然出现了质疑天池抄袭 Beeppool 的声音,然而并无软用,在之后的迭代中天池吸取了各个矿池的优点,在算力战争中站稳了位置。期间最大的门罗币和以太坊矿池 nanopool 还提出了收购合并邀请。

插曲:WebDollar 的黑暗森林与降维打击

在6月份进行 Nimiq 算力战争的同时,我们发现了一个罗马尼亚团队开发的名叫 WebDollar 的项目,同样实现了浏览器节点的区块链,主要是山寨了 Nimiq。在浏览该项目代码后发现质量奇差无比,但是只要有算力,就能有矿池。

WebD 开源的哈希算法实现是使用了发布在 npm 上的 Argon2 加密库,但是该库的本质目的是让开发者用其进行加密的,对多线程并行优化处理不佳。zzzkky 对该实现进行了优化,让同一个机器挖 WebD 的算力能够提高7倍,我又花费了几天时间实现了 WebD 的矿池节点,我们就开始从淘宝上 E5 服务器高效挖 WebD,真实的实现了降维打击

上图是6月24日的 WebD 出块分布,其中最大的一块是天池私池。

然而,WebD 的水太深。虽然其主网上线时间比 Nimiq 晚一个月左右,但掌握了算力优化客户端的不止天池,在我们挖 WebD 的时候发现经常有大量的连续区块被分叉,实质上就是存在隐藏的 51% 攻击。我们希望 51% 攻击者能够收敛从而不影响我们的收益,因此在社区发布了 51% 攻击的相关证据。百密一疏,WebD 项目团队通过域名扫描发现了天池的 WebD 私池,从而推断出是天池在宣传 WebD 存在 51% 攻击,随后天池就遭到了连续几天猛烈的 DDoS 攻击,WebD 团队就像一个罗马尼亚黑帮。在 WebD 开发团队发现确实存在 51% 攻击之后,根据天池在 Nimiq 的算力占比,反而怀疑是天池发动的攻击。

而后 WebD 团队内部发生了矛盾,有开发人员自称不想再做欺骗的事,将创世区块的币进行散播,导致该项目进行了硬分叉回滚,也导致了该项目接近失败。

在这个低代码质量的项目中发生的神仙大乱斗,包括我们在内有三波以上的神仙,而至于发动 51% 攻击的到底是 WebD 项目团队还是另有其人就如同黑暗森林,至今也不得而知。接触 WebD 的两个月时间,像一部真实的宇宙生存法则。

插曲:门罗币

在10月份天池又运营了门罗矿池,门罗项目目前是匿名区块链第一,并且社区反 ASIC,大部分算力是普通的 CPU 和 GPU。但是在这个充斥着黑算的匿名网络里,后来者比较难以做到像天池 Nimiq 一样门槛。

借助于天池在 Nimiq 的影响力,门罗矿池在10月份的门罗硬分叉后迎来了算力巅峰,但是在造到一波大规模的持续化的 DDoS 攻击牵连后,天池门罗矿池损失了大量的算力。之后的门罗破局方式,还得从开发者服务的角度入手。

独裁者与资本家

Nimiq 社区中反对天池、反对 Azard 的声音从4月中旬到年底都没有停过。从反对者的角度看,由于天池和 Azard 罪恶滔天:(1)天池算力占比较大;(2)涉嫌盗窃 Beeppool 代码;(3)开发 Nimiq 的山寨版 WebD 项目的矿池;(4)开发私有协议,不开源服务端代码。

因此扣上的头衔不仅限于 独裁者资本家叛徒小偷Bad Guybullshit 等。

资本家

叛徒

Bad Guy

DDoS、DDoS 和 DDoS

虽然从4月15日第一天开始 DDoS 就不间断,导致我在任何时间、任何地点都做过掏出笔记本连上4G的事情,甚至一度笔记本不敢离身,手机短信一响就准备掏出笔记本,人肉抗D着实艰难。

但是,除了协议漏洞和错误的 all in 开源矿池导致的滑铁卢外,天池还有一次接近遭到覆灭是10月底的超大规模的 DDoS。这次 DDoS 的规模和持续时间完全不一样。这次 DDoS 从10月20号开始,每天的攻击流量持续增大,到10月25日已经达到峰值 300Gbps 的流量攻击,没有暴露的核心服务器 IP 也同样遭到攻击。

迫于攻击,在10月25日我将 Nimiq 和 Monero 的架构重新拆分,核心服务完全只能通过内网访问,同时加增了抗 DDoS 流量包。运行了半年的数据库规模已经很大了,还需要重新部署 Docker、Kafka 等基础设施以及同步区块链数据,持续运维了36个小时后更加抗 DDoS 的天池重新复活。

凡是不能杀死你的,最终都会让你更强

这句话用在产品上,并不仅仅是鸡汤。

仅11月就有超过200次的 DDoS 攻击告警

The Future

关于未来天池的运作,计划在一定的时间内继续作为自给自足的 side project 运行下去,并且借助区块链作为基础平台,在上层应用中拓宽到站长和开发者服务。

设计中的新主页

全新 Logo

坚持原创技术分享,您的支持将鼓励我继续创作!