
fi5pool 项目将其定位为简单的 CKB solo minning 矿池,具体表现为仅支持 CKB,仅支持 solo mining,没有分账和前端页面,同时深入 CKB 的特性,拓展自定义挖矿策略和 MEV(miner extractable value)的获取能力。有了 solo mining 解决方案后,有如下好处:
目前 fi5pool 项目开发已经接近尾声,正在进行测试,后续会开源出来:https://github.com/fi5box 以下内容来自 fi5pool 团队的 David,原文链接:https://talk.nervos.org/t/topic/8598 BTC 节点通过网络收集未打包的交易,产生出 candidate block(候选区块),其 header 包含如下字段:Version 表示当前使用的 BTC 协议的版本
Previous Block Hash 前一个区块的 hash 值
Merkleroot 打包到当前区块的交易组装的 merkle tree 的 root hash
Difficulty target 当前 BTC 网络的难度值,简单说就是要成为合法的区块,区块哈希前面要有多少个 0
Timestamp 时间戳
- Nonce 32bit 的随机值,矿工可以通过搜寻合适的 Nonce 值,让区块哈希满足前面的 Difficulty target
挖矿就是通过调整区块中的内容,主要是 Nonce 值,产生出一个符合当前网络难度的合法区块。
对于 BTC 网络来说:挖矿是产生合法区块的唯一途径,保持 BTC 网络安全持续地运转下去。
挖矿经历了 CPU → GPU → FPGA → ASIC 等演进阶段。BTC 自身就带有挖矿程序,但是只支持 CPU 挖矿,所以最开始是 CPU 挖矿阶段。很快大家就发现 GPU 在挖矿上比 CPU 效率高的多,于是果断抛弃官方的挖矿程序,开发了基于 GPU 的专用挖矿软件(比如 cgminer)。通过 FPGA 过渡之后,最终进入了 ASIC(专用芯片)阶段。https://en.bitcoin.it/wiki/Category:History
Solo mining,顾名思义,就是矿工独自挖矿。只要自己运行一个 BTC 节点,运行挖矿软件就可以了(现在比较难了,后面再展开)。但是挖矿是个完全随机的过程,波动比较大。其大致遵循泊松分布,即使矿工的算力达到平均每天能挖到一个块,在具体的某天,也有高达 37% 的概率挖不到块。这对于每天都要吃饭和交电费的矿工来说风险太大了。然后矿池模式就诞生了。矿池是将一批矿工的算力聚集到一起挖矿,然后将挖矿收益根据每个矿工的贡献比例进行分配。类似于多人合伙买彩票,中奖之后按出资比例分配奖金。这样可以降低收益的波动,矿工每天可以有比较稳定的收益,降低了风险。矿池模式很快成为挖矿的主流。但是矿池模式也是有问题的。从前面的分析可知,矿池聚集的算力越多,收益波动越小。因此矿工会倾向于加入算力更大的矿池,导致矿池的头部效应,全网算力很快就集中到了几个头部的矿池。这导致了网络的中心化和潜在的 51% 攻击的风险。矿池运营方只会运行一个全节点和一个矿池服务端。矿工的挖矿设备依然自己管理,通过网络与矿池交互,从矿池那里获取任务,然后只负责尝试计算区块哈希,然后向矿池上报任务完成情况。此模式下,矿工并不运行节点,挖矿收益是直接进入矿池的账户,然后矿池收取一定比例的手续费后,根据各个矿工的贡献度进行收益分配。矿池统计矿工贡献度的方式叫 share。前面提到过,只有区块哈希前面的 0 足够多,才是一个合法的区块,才会有挖矿奖励。share 就是一个不够格的区块,其哈希前面的 0 不够多。矿池通过统计矿工提交的 share 数量来评判其贡献度。类似于我们日常的每日工作汇报,不一定要完成工作之后才去向领导汇报,每天都汇报一下工作进展(完成了一个步骤或者其中一个小任务),这样领导知道你每天都在干活,才会给你记工。https://f2pool.zendesk.com/hc/zh-tw/articles/360061042332- 收益結算模式 -PPS-PPLNS-FPPS-PPS矿机与矿池之间的网络通信逐渐形成了一套矿池协议(这个等下再展开),先回过头来说 solo mining。因为矿池模式是挖矿的主流,因此在 ASIC 时代,矿机厂商直接就在矿机的固件里集成了挖矿协议。更具体来说矿机的固件其实就是一个挖矿软件,从比特大陆很早之前开源的固件代码来看,其实就是 cgminer。对挖矿协议的支持也在 cgminer 代码里面:https://github.com/bitmaintech/Antminer_firmware/blob/master/sources/meta-antminer/recipes-bitmianer/cgminer/cgminer-1.0/cgminer-3.12.0_bak/util.c
因此矿工买到 ASIC 矿机之后,只要开机之后设置一下连接矿池的配置,马上就可以开始参与挖矿。反而自己挖矿变得困难了,因为矿机默认就是连矿池的,而不能连自己运行的节点了。当然方法也是有的,就是自己跑一个矿池服务端,相当于一个私有化部署的矿池。但是因为矿池和矿机涉及巨大的经济利益,一般都是不开源的,网上也很少有相关的技术资料。BTC 原来有一个开源的 BTCPool,但是已经废弃,很多年没有更新了。现在有一个 public pool 可以用,算是给 solo ming 保留了一丝火种:https://github.com/benjamin-wilson/public-pool
Getwork
BTC 节点最早为挖矿提供了一个 Getwork 的 RPC 接口,但是这个接口并不是返回 candidate block(候选块)的完整区块头,而是会将区块头预处理成一段 data,矿工拿到之后只是不停的尝试不同的 Nonce 值并计算哈希。前面讲过,一个区块是否有效看的是整个区块头的哈希前面是否有足够的 0,所以调整区块头的任何一个值都可以。但是 Getwrok 模式下,矿工只能修改 Nonce 值,而无法修改区块头的其他内容,而 BTC 的 Nonce 字段只有 32 位。当矿工的算力达到 4.3 Ghash/s 的时候,1 秒就可以遍历所有可能的 Nonce。剩下的时间就只能干等着节点给新的任务。如果矿池连接了多个矿工,就更惨了,多个矿工的任务完全是重复的,严重浪费了算力。GBT(Getblocktemplate)
BTC 节点提供了新的 RPC 接口——Getblocktemplate——返回更多的区块信息,让矿工可以调整的东西更多(比如 timestamp 和 coinbase 交易中的无关内容),从而增加了矿工的搜索空间。
大名鼎鼎的 Stratum (V1) 协议
Stratum 与 GBT 方案差不多时间提出,但是 Stratum 协议是由首个 BTC 矿池运营商提出的,他们明显更懂挖矿,而且在吸收了 GBT 方案的基础上进行了一些改进,因此最终成为了挖矿的事实标准。现在只要说起挖矿协议,默认指的就是 Stratum (V1) 协议。Stratum (V1) 协议非常的简单,直接基于 TCP 连接,内容是以换行隔开的,一行一个 json 字符串。非常简单易懂,且易于调试,速度快,资源占用小。最主要的是针对矿池模式进行了很多优化。比如它引入了 extranonce 的概念。前面我们提到过,一个矿池可以接入很多矿工。如果矿池给所有矿工下发同样的任务,让他们随机寻找 Nonce,那多个矿工之间可能就会重复搜寻,浪费算力。extranonce 就像 hash 分桶一样,给每个矿工分配了一个不同的前缀值,这样不同的矿工就在不同的桶里搜索,避免了重复劳动。更详细的协议内容大家可以看参考资料或者实际的交互例子:https://www.jianshu.com/p/7bfe925f3d0a
Stratum (V2) 协议
Stratum (V2) 改进了 V1 的很多缺点:V2 协议对 BTC 节点的 RPC 也提出了新要求(需要修改 BTC 节点)。它提出了一个新的概念,templateProvider。不同于原来那些 get 方法,是在 BTC 节点中新增加一个服务,采用 push 的方式主动推送,可以更及时的通知交易池重组,同步区块等信息。参见:https://github.com/bitcoin/bitcoin/commit/72b8f59b15453b7723cc22b0d002819ac62ac088 但是它至今还很少有落地实现。虽然官方做了参考实现,并且提供了兼容和升级方案,但是跟历史上很多升级换代的技术一样,因为老的技术太成熟,生态太庞大了,新的技术很难冒头。目前绝大部分矿机的固件和商业矿池都还是 V1 协议。只有 Braiins OS 提供了部分 BTC 矿机的 V2 固件,他们家的 Braiins Pool 支持 V2 协议。矿机与矿池
这两个对于挖矿来说很重要的东西,在区块链生态里面显得非常神秘。区块链生态其他部分各种开源,宣讲,有点进展恨不得满世界宣传,相比之下矿机和矿池是闷声发大财的代表。因为相互之间有博弈关系,所以大家都非常小心翼翼,好像不太想暴露太多技术细节,但是又相互依赖,需要尽量兼容。矿机要兼容尽量多的矿池,矿池也要兼容尽量多的矿机。Stratum (V1) 协议其实没有特别明确的标准文档,但是大家通过这种相互摸索,逐渐形成了一种类似行业默契的事实标准。这种默契是 Stratum (V2) 很难打破的。所以估计在之后很长一段时间,Stratum (V1) 协议的地位都很难被动摇。其他 PoW 链在挖矿方面都跟 BTC 高度相似,CKB 也不例外,所以本篇只讲 CKB 与 BTC 有差异的点。Block header 结构上,单论挖矿相关的字段,CKB 与 BTC 最大的区别是 Nonce 大小为 128bit。挖矿历史和演进方面,CKB 同样经历了 CPU → GPU → FPGA → ASIC 等演进阶段,目前都是 ASIC 矿机。CKB 在发展到 ASIC 矿机阶段之后,同 BTC 一样,矿机固件直接内置挖矿协议,只能连接矿池。Solo mining 方面,目前 CKB 没有现成的解决方案。之前有一个 grants 项目,但是已经很久没更新了:https://talk.nervos.org/t/insight-automated-stratum-v2-mining-pool-for-nervos/4870结算模式方面,CKB 的矿池基本上都是 PPLNS,即矿工需要承担较大的收益波动风险。因为 CKB 难度调整比较频繁,相比之下收益波动更大。比特币网络每产生 2016 个区块(大约两周)调整一下难度,但是 CKB 大约每隔 4 小时调整一次挖矿难度。矿池协议方面,CKB 节点提供了 GBT(Getblocktemplate)的 RPC 接口,返回完整的 candidate block(候选区块),并且允许挖矿软件任意调整区块的内容,给的自由度很大。矿池协议方面跟 BTC 一样,现在都是 Stratum (V1) 协议,但是 CKB 相比之下要简单很多。因为 CKB 的 Nonce 大小为 128bit,单单改变 Nonce,搜寻空间就足够大,不存在 BTC 在 Getwork 时期的问题,也就不需要矿工去调整区块头的其他字段。比如 BTC 中 extranonce 是 coinbase 交易中的字段,但是在 CKB 中直接就是 Nonce 的前缀,更加简单明了。因此,CKB 的矿池协议实际上只是 Stratum (V1) 的子集,很多方法和字段都不用。是套着 Stratum (V1) 壳子,但实际运行跟 Getwork 差不多。矿机发起 auth
{"id":0,"method":"mining.authorize","params":["ckb1qyqznmjpc30dw337h20l9ukkmlrfkhycgtes0p7lll.bob","X"]}
矿池返回
{"id":0,"result":true,"error":null}
矿机 subscribe
{"id":0,"method":"mining.subscribe","params":["ckbminer-v1.0.0",null]}
矿池返回
{"id":0,"result":[null,"665da3e8",12],"error":null}
矿池向矿机下发难度设置
{"id":null,"method":"mining.set_target","params":["000010c6f7000000000000000000000000000000000000000000000000000000"]}
矿池向矿机下发 job
{"id":null,"method":"mining.notify","params":["a8be81b7","65634bac6f4d59fdc355008824b45e8e0ecdc0879e00dfbbc4989099a5beb674",2156,"d2f7dc7dcffdcc03a129783d12332b0b02d0453604290f41869ff41bf9c95cef",true]}
矿机向矿池提交 share
{"id":0,"method":"mining.submit","params":["ckb1qyqznmjpc30dw337h20l9ukkmlrfkhycgtes0p7lll.bob","a8be81b7","000000000000000000967385"]}
矿池给矿机回复,确认 share 有效
{"id":0,"result":true,"error":null}
其他 PoW 链的挖矿和矿池软件都是 BTC 修改而来的,所以 BTC 没有迁移到 Stratum V2 之前,其他的链几乎不可能迁移。不过 CKB 有一个跟 Stratum v2 中 templateProvider 概念类似的机制,节点可以通过 notify 主动通知矿池有新的候选块。虽然没有 templateProvider 那么细化,但是相比于 pull 的方式已经方便很多我们团队专注于发展 Nervos 生态,涵盖挖矿、DePIN 硬件、实物销售等多个领域。挖矿业务原来都是连接大矿池的,后来想 solo mining,搜寻一圈后发现没有现成的解决方案。抱着自用加为社区做贡献的想法,开启了 fi5pool 项目。一开始我们只找到开源的 btcpool 项目,该项目已经废弃很多年了。但是之前的 grants 项目为其增加了对 CKB 的支持,只不过支持的是非常老的 CKB 版本。我们先尝试了对其进行修复,经过一些修改之后,勉强能跑起来,但是有非常多的报错,稳定性也比较差,如果要完全修复并长期维护还需要非常大的工作量。然后我们开始静下心来梳理自己的目标。我们并不想做一个完善的商业矿池,需要的工作量很大,而且竞争非常激烈;也不想做一个多币矿池(btcpool 支持很多种币),能填补 CKB 社区在这方面的空白就好。最终,fi5pool 的目标定为简单的 CKB solo minning 矿池:这个目标可以减少项目复杂度,并避免与现有的商业化矿池竞争,使项目更加聚焦和易于长期维持。代码非常精简,易于维护。
单个可行性文件,且没有持久化状态。
CKB 社区有了简单的 solo mining 解决方案后,有如下好处:矿工可以获得全部挖矿奖励:没有第三方抽成。
自主性更强:矿工可以完全控制自己的挖矿策略。
隐私保护:无需公开个人信息,确保高度的隐私安全。
- 去中心化:有助于提升整个区块链网络的安全性和分散度。
目前 fi5pool 项目开发已经接近尾声,正在进行测试,后续会开源出来,敬请大家关注我们的 GitHub:https://github.com/fi5box 目前已经开源出一个挖矿统计工具,可以统计全网的出块,算力,以及各个矿工的信息,比如:$ ckb-miner-stat history -d 20250104
show history info for date: 2025-01-04
shape: (8, 6)
┌───────────────────────────────────────────────────────────────────────────────────────────────────┬───────┬───────────────┬─────────────┬───────────┬────────────────┐
│ Miner ┆ Count ┆ User_Reward ┆ Total_Count ┆ Percent ┆ User_Hash_Rate │
│
│ str ┆ u32 ┆ f64 ┆ u32 ┆ f64 ┆ f64 │
╞═══════════════════════════════════════════════════════════════════════════════════════════════════╪═══════╪═══════════════╪═════════════╪═══════════╪════════════════╡
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqv8cuf7vzh62m9gwyv59lzha9nx6ar5d9qqkp5em ┆ 41 ┆ 25961.235496 ┆ 9600 ┆ 0.427083 ┆ 1.9077e12 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqt3vn6g67jm7g5czehcmqdcr6jwjz8pdtg59p03h ┆ 125 ┆ 78593.945498 ┆ 9600 ┆ 1.302083 ┆ 5.8163e12 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqvzz8cmjw9pqlx48d3s9nr49fhu89jk8rgycece5 ┆ 149 ┆ 93822.130516 ┆ 9600 ┆ 1.552083 ┆ 6.9330e12 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq0dn8gg6ag6uvkl0lr0xpyt0n99dsal47sm7mzyj ┆ 801 ┆ 505831.745397 ┆ 9600 ┆ 8.34375 ┆ 3.7271e13 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq22xdj8q4jdql98qkdhnqzgrsk4nqyavdcratvu9 ┆ 813 ┆ 514374.496015 ┆ 9600 ┆ 8.46875 ┆ 3.7829e13 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq0259kv0x5jez6h0l5qr52k64weapapgyscsnmhn ┆ 1249 ┆ 790547.790185 ┆ 9600 ┆ 13.010417 ┆ 5.8116e13 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqvgqh40v2g5ps3rann79tvw9gq6ewrft7gp909qk ┆ 2390 ┆ 1.5094e6 ┆ 9600 ┆ 24.895833 ┆ 1.1121e14 │
│ ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq0tpsqq08mkay9ewrfrdwlcghv62qw704s93hhsj ┆ 4032 ┆ 2.5470e6 ┆ 9600 ┆ 42.0 ┆ 1.8761e14 │
└───────────────────────────────────────────────────────────────────────────────────────────────────┴───────┴───────────────┴─────────────┴───────────┴────────────────┘
这个工具可以和 fi5pool 配套使用,因为 fi5pool 没有前端页面,矿工可以通过这个统计工具查看自己的出块,收益,占比和有效算力。