Filecoin 的 Lotus 测试网于12月11日启动了,瞬间唤起了中国社区的热情。然而让很多朋友略失望的是,大型矿工牢牢占据了有效存储排行榜的前几位,小白用户发现利用家庭 PC 或笔记本,基本上不可能短时间内成为真正意义上的出块矿工。
Filecoin Lotus 测试网目前存在的问题
Filecoin 当初宣称的利用闲置存储和带宽挖矿,基本上在这个测试网上目前是实现不了的。还有声称找到测试网分叉攻击漏洞的,可以用和自己的有效存储不成正比的概率生成更多的区块,这对于 Lotus 来说是好事,方便官方尽早修复漏洞。
不过不用“太神话”,一方面找漏洞比修复漏洞容易得多,另一方面漏洞总会被修复,对于只想挖矿的矿工来说,找漏洞是否值得投入大量精力,那就见仁见智了。
FilCloud 团队跟踪 Filecoin 的 go-filecoin 和 Lotus 客户端代码已经有大半年了,知道开发这样一个大型区块链和去中心化存储项目的难度,其中涉及很多技术上的权衡利弊。目前 Filecoin 团队把挖矿的计算门槛提到如此之高,其实是有再三考虑的。
最重要的是保证足够的安全性,为了这个目的,目前采取的折衷办法是提高计算性能要求。我们乐观地认为,官方后续的设计改进或优化,是有可能在不丧失安全性的前提下,大大降低硬件门槛,让 Filecoin 再次成为闲置存储/带宽挖矿的标杆性去中心化落地项目。毕竟还有3个月左右时间才主网上线呢,对吧,稍安勿躁。
大矿工是如何霸占排行榜的呢?
再说回目前的测试网,大家可以看到前几名的“实力”还是很强的,和小矿工拉开了很大的差距。当然啦,这些团队或公司投入了比较大额的资金,部署大量服务器,集体挖一个矿工,得到比较好的结果,也是无可厚非的。
然而个人比较反感这些大矿工的宣传手段,好像搞得就他们能挖一样。其实大家都明白,如果只有头部几个矿工就可以霸占整个 Filecoin 网络,那么 Filecoin 这一项目一定做不起来的。比特币和以太坊上的挖矿经验告诉我们,去中心化项目最重要的群众“共识”基础,必须体现在挖矿矿工的多样性和分散性上。
如果在项目极早期就出现大矿工中心化垄断,那么这个项目肯定是走向死胡同的。我相信目前这些头部“大矿工”自己也清楚,不考虑硬件投入成本的情况下去追求所谓的排名,其实从经济效益上来说不一定是最佳的。
举个不太恰当的例子,假设(纯粹假设,别真的套用数据)你用 100 台机器和100个硬盘做到第一名大矿工的有效存储 100 TB,我用 10 台机器和 10 个硬盘(规格均一致)做到没排名的矿工的有效存储 20TB,请问谁的投入产出比高?答案不言自明。更何况大量机器组成大型矿工,对于交换机有更多要求,众所周知,带宽和高的交换机价格是贵了好多好多。
我们不希望 Filecoin 有这样的走向,所以力所能及地告诉不太明白技术细节的朋友们,其实,你们也可以做大矿工,虽然是需要投入一些价格稍贵的硬件。
成为大矿工的步骤有哪些呢?
首先准备一些机器,其中一个同时运行 lotus 全节点程序和 lotus-storage-miner 矿工程序(此节点需要配置多核 CPU 或一块显卡(用于保证 POST 时空证明的计算可以及时完成;注意如果是多核高主频 CPU,那么就可以不带显卡!),其余都作为 lotus-seal-worker 复制证明计算程序。所有 worker(也就是 lotus-seal-worker)节点都连接到 miner(也就是lotus-storage-miner),这样就可以持续获取 lotus-storage-miner 的复制证明任务。内网带宽起码 1Gb/s(100MB/s 左右),有条件提高到 10Gb/s(1GB/s 左右)。
稍微修改 lotus-storage-miner 使得进程内自动持续添加扇区,也就是 add piece,这样就会持续产生复制证明任务,worker 们就可以接收到任务然后做计算了。
复制证明任务是分两阶段的:precommit 和 commit。
precommit 阶段:worker 会自动从 miner 获取任务,并下载 staged sector,进行计算,做完后把 sealed 和 cache 目录/文件又上传给 miner。
commit 阶段:worker 又下载 sealed 和 cache 目录/文件,再次计算,把最终 sealed 文件和证明结果推给 miner。所以 worker 节点越多,并行做复制证明的任务就越多,越有利于快速提升有效存储量。
以上过程只涉及到部署,唯一需要修改代码的地方就是自动持续添加扇区(这个也可以编写脚本从外部添加扇区)。看到了吗?其实没有什么秘密,不需要太懂技术细节。
好了,以上的方式已经可以很好的“挖矿”了。
大矿工如何成为头部大矿工呢?
但如果你想成为头部大矿工,可能还需要做一些优化。其实优化思路很多,不一而足。我们这里就介绍几个比较简单容易实现的点,供大家参考。
重新审视一下上面步骤,我们发现 worker 多了以后,可能 miner 接受的下载和上传任务会很多,导致 miner 的磁盘读写压力陡增。这会导致 worker 浪费很多时间在网络传输扇区或缓存数据的时间上。而且 miner 的单个磁盘容量最多 8TB 或 16TB,会很快出现存储不够的情况。
我们很容易想到可以利用分布式文件系统,把 miner 的存储交给其他服务器。比如可以利用比较成熟的 Ceph 在所有 worker 上搭建一个 Ceph 分布式文件系统集群,然后在其上创建一个目录,同时挂载给 miner 和 worker 节点。
有意思的是,对于 miner 和 worker 程序本身并不需要做太多改动,因为 miner 和 worker 对于扇区的放置方式几乎一样,也就是说 miner 和 worker 可以轻易读取同一个文件,这样就可以省掉来回传输扇区的冗余工作(当然 Ceph 也是网络传输的,只不过不是一个层面)。只需要修改 worker 代码的一点是,把 pull 和 push 扇区和缓存数据的地方给注释掉。
还有个优化的点,是把持续生成扇区那里再改进一下,只生成一次扇区,并把 commP 结果值拿到并存起来,以后就可以省掉 generate piece commitment 和 add piece 的时间了。另外把生成的 staged 扇区只存一份到 Ceph 中,然后每次需要新的扇区时,就做个软链接,就省去了拷贝的功夫。
继续优化,我们注意到偶尔失败的扇区任务,可能留下残留文件,会占用大量存储空间,可以加一个自动周期检测清理的实现,清理冗余残留文件。
更进一步优化,上述 precommit 和 commit 阶段之间的 cache 目录中,有几个 commit 阶段完了之后会删除的文件(大概是扇区大小的 10 倍左右),那么这些中间文件是否没必要写入 Ceph?比如写入 worker 的本地磁盘,就可以减小 Ceph 的压力以及内网带宽的占用。
如果想实现这个,就必须把 precommit 和 commit 放到一个 worker 连续做,因为涉及上链交易的来回通信,这里面涉及要更改 miner 和 worker 的代码,把调度改一下,稍微复杂一点。然而这个优化可能对于整个系统的吞吐量有巨大改善。
硬件配置够好的情况下,建议挖 32GB 扇区,比挖 1GB 扇区更容易快速提升有效存储。
分布式文件系统也不是一定要用 Ceph,有很多选择,建议实测对比。
如果对 Ceph 本身的吞吐不满意,那还有更变态的优化思路,就是每个 worker 只管计算和存储分配到的扇区,miner 需要做时空证明的时候,抽到哪个扇区,就去访问相应的 worker 边读取边做时空证明。这样子就直接去掉了 Ceph 这一层,充分发挥每个 worker 自己的资源作用,非常适合目前测试网刷榜,不过有个缺点是容灾问题,某个 worker 出问题了,其上的扇区就访问不了了。而且这个需要更改的代码更多。
好了,就介绍到这里,相信有一定开发经验的朋友,很容易按上面的思路,成为“大矿工”甚至“头部大矿工”了。
其实还有很多优化思路,但目前官方的 worker 还是比较粗糙的,比如不能自动重连 miner、做成功的任务若提交失败不会自动重试等。
我们在10月份的时候针对 go-filecoin 就做过分布式挖矿的原型,效果是比目前 Lotus 的 worker 要可靠稳健得多,后续我们会考虑移植到 Lotus 上来,当然不会很快,因为我们目前重心不在 Lotus 测试网。大家都关注提供存储挖矿,那谁来考虑存储需求方,把 Filecoin 提供的存储用出去?欢迎感兴趣的朋友来交流。
我们还希望后续有精力投入的时候,推出开源的家庭式矿机软件方案,让 Filecoin 挖矿重回家庭,充分利用闲置带宽,减免托管费和运维费,而且不低于托管式挖矿的经济效益。所以还是那句话,散户矿工们不用急,主网上线还有好几个月,一切皆有可能。
非常感谢您对 IPFS&Filecoin 项目的持续支持。我们很高兴继续与您一起,为人类信息建立一个强大的,去中心化和高效的基础。
FilCloud 帮你迅速了解 IPFS 领域的热点技术和应用
公众号:filcloud