遥测 · 模式 1 ·

FearMiner 收集什么

每台矿机一份匿名上报:默认开启,一个开关即可关闭。这里列出它携带的每个字段,说明为什么发送、如何处理,也列出它永远不会携带的一切。

本页由每个发布版本都附带的模式文件生成(telemetry-schema.json,模式 1);矿工的测试会拒绝任何含有模式之外字段的上报。本页带日期的修改历史在页面底部。

目录
  1. 01概要
  2. 02逐字段
  3. 03算力区间
  4. 04功能标志
  5. 05绝不发送
  6. 06时机
  7. 07去向
  8. 08隔离墙
  9. 09大型矿场
  10. 10查看与关闭
  11. 11历史

01 · 概要

概要 #

内容
共 22 个字段,分为 12 组,也就是启动时 egress 行列出的那些组:event、install、format、version、system、mining、hardware、hashrate、features、uptime、errors、pool。算力以宽区间发送,绝不发送具体数值。
绝不
钱包、矿工名、登录名或密码、机器名、IP 地址、序列号、路径、配置值、驾驶舱的任何信息。完整列表见下文。
时机
运行开始后、每 15 分钟一次、正常停止时;最频繁也不超过每 5 分钟一次。
去向
telemetry.fearminer.com,一个独立的服务,与驾驶舱及其中继隔离。保留国家,绝不保留地址。
保留
原始数据点约 3 个月;不含任何安装 ID 的每日计数保留更久。
关闭
--no-telemetry 或 FEARMINER_NO_TELEMETRY=1:不生成也不保存安装 ID,什么都不发送,矿工也不失去任何功能。
查看
fearminer telemetry show 打印本机会发送的定期上报,不发送任何东西。

02 · 逐字段

发送什么,逐字段说明 #

先是每一组,再是组内每个字段:发送什么、为什么、如何处理。没有理由的字段不会发送。

一次定期上报离开矿机时的样子:

{
  "schema": 1,
  "kind": "beat",
  "first": false,
  "previous_version": null,
  "install": "5f0c3b8e2a9d4c71b6e8f0a1d2c3b4a5",
  "interval": 15,
  "version": "1.5.1",
  "build": "f6f9d649c",
  "os": "linux",
  "os_release": "debian-13",
  "mining_os": null,
  "algo": "quantus",
  "engine": "1.0.1",
  "engine_build": "linux-x86_64-cuda",
  "driver": {"nvidia": 575, "cuda": 12},
  "gpus": [{"model": "GeForce RTX 4070 Ti", "count": 2}],
  "cpu": {"vendor": "amd", "model": "Ryzen 9 9950X", "cores": 16},
  "rate": {"bucket": "1G-2G", "unit": "H/s"},
  "features": ["doh", "failover", "helper", "service", "tls"],
  "uptime": "lt1d",
  "errors": {"E116": 3},
  "pool_host": "pool.example.com"
}

接收端按模式检查每份上报,加上国家,写入一个数据点;从数据点读出的只有计数,例如每个版本、系统或算法各有多少个安装在运行。最后一列说明每个字段最后变成什么。

事件 event #

这份上报是哪个时刻:启动、定期上报还是停止。

字段发送内容原因如何处理
kind"beat"start、beat 或 stop。启动记一次运行,定期上报表示矿机仍在运行,停止表示是有意结束。定期上报中断而没有停止,意味着崩溃或断网。随数据点存储:据此统计启动次数、运行中的矿机和正常停止。
firstfalse新安装启动、ID 刚生成时为 true;其他情况为 false。区分新安装与重启。存储为 1 或 0:据此统计新安装。
previous_versionnull启动时,本安装上次运行的版本(若与本次不同);否则为 null。显示用户从哪些版本升级、跳过了哪些版本。随数据点存储:据此跟踪每个版本的采用情况。

安装 ID install #

一个随机数,代表这次安装,除此之外什么也不代表。

字段发送内容原因如何处理
install"5f0c3b8e2a9d4c71b6e8f0a1d2c3b4a5"32 个十六进制字符:首次启动时生成的 16 个随机字节,保存在状态目录的 telemetry-id 文件中,仅你的账户可读。它不由任何东西推导:不来自硬件、钱包、时间,也不来自驾驶舱。只有两个用途:统计矿机数量而不重复计算,以及跟踪新版本的采用速度。作为数据点的索引,以便统计不同的安装;每日计数中不含它。fearminer telemetry rotate-id 会生成一个新的。

格式 format #

如何读取上报的其余部分。

字段发送内容原因如何处理
schema1模式编号:1。新版本的上报可以被旧的读取方读取:新增字段不会破坏什么,读取方会跳过它不认识的字段。由接收端检查,读不懂的上报会被拒绝;不存储。
interval15两次定期上报之间的分钟数:默认 15,范围 5 到 1440(--telemetry-interval)。告知下一次定期上报何时到来。接收端再次检查下限,然后存储该数值。

版本与构建 version #

运行的是矿工的哪个版本。

字段发送内容原因如何处理
version"1.5.1"矿工的发行版本号。一个版本被采用的速度,以及还有多少矿机运行着某个修复所涉及的版本。随数据点存储;按版本计数。
build"f6f9d649c"构建的短提交 ID。区分同一版本的两个构建。随数据点存储。

系统 system #

矿工在哪里运行。

字段发送内容原因如何处理
os"linux"linux、windows 或 macos。打包和测试的精力应投向哪里。随数据点存储;按系统计数。
os_release"debian-13"仅系统简称和主版本号:debian-13、ubuntu-24、windows-11、macos-15;未知时为 linux-other。绝不是内核字符串,绝不是主机名。支持的平台实际需要覆盖哪些系统版本。随数据点存储。
mining_osnull在 HiveOS 或 mmpOS 下运行时为 hiveos 或 mmpos;否则为 null。HiveOS 和 mmpOS 集成是否有人在用。随数据点存储。

挖什么 mining #

算法、挖它的引擎,以及驱动的主版本号。

字段发送内容原因如何处理
algo"quantus"算法名称,与算法目录中的一致;不挖矿时为 null。矿机都在挖哪些算法,内核工作在哪里最重要。随数据点存储;按算法计数。
engine"1.0.1"正在挖矿的引擎版本;没有引擎时为 null。跟踪引擎自己的发布,它们不随矿工版本发布。随数据点存储。
engine_build"linux-x86_64-cuda"引擎的平台构建,例如 linux-x86_64-cuda;没有引擎时为 null。实际在用的是哪些构建:CPU 还是 CUDA,在哪个平台上。随数据点存储。
driver{"nvidia": 575, "cuda": 12}NVIDIA 驱动的主版本号及其支持的最高 CUDA 主版本号,仅主版本号(没有时为 null);以后可能增加其他键(ROCm、Metal)。可以把最低驱动版本提高到哪里而不弄坏现有的矿机。存储为一个标签,例如 nvidia575 cuda12。

硬件 hardware #

型号与数量;绝不包含序列号或显卡标识。

字段发送内容原因如何处理
gpus[{"model": "GeForce RTX 4070 Ti", "count": 2}]每个 GPU 型号及其数量,名称经过规范化(无厂商前缀、无显存容量),排好序,最多 16 个型号。绝不含 UUID、序列号或 PCI 总线 ID。内核应优先针对哪些显卡调优,以及某个受支持的型号是否真有人在用。存储为一个标签(GeForce RTX 4070 Ti x2)和显卡总数。
cpu{"vendor": "amd", "model": "Ryzen 9 9950X", "cores": 16}厂商(amd、intel、apple 或 other)、型号的市场名称,以及物理核心数。MSR 预设和内存布局应优先服务哪些 CPU 系列。存储为厂商、型号和核心数。

算力区间 hashrate #

一个宽区间,绝不是具体数值;区间见下文。

字段发送内容原因如何处理
rate{"bucket": "1G-2G", "unit": "H/s"}矿机在其算法上的总算力,以 1-2-5 序列的区间表示,并带上算法的单位;不挖矿时为 null。FearMiner 整体的算力规模,以及同一硬件上两个版本之间的变慢,但绝不给出某个矿场的精确数值。存储为区间和单位。

在用的功能 features #

哪些设置在用,以命名标志表示,绝不含其取值;标志列表见下文。

字段发送内容原因如何处理
features["doh", "failover", "helper", "service", "tls"]本矿机在用的标志名称,排好序,最多 48 个:只表示某项设置在用,绝不含其取值。哪些功能在真实矿机上运行,而不只是发布了哪些:下一步精力该投向哪里。存储为一个标签;按标志计数。

运行时长区间 uptime #

本次运行持续了多久,绝不精确到秒。

字段发送内容原因如何处理
uptime"lt1d"lt1h、lt1d、lt1w 或 ge1w:不到一小时、不到一天、不到一周、一周及以上。矿工在实际运行中到底有多稳定,与监督进程统计的重启次数互为参照。随数据点存储。

错误码 errors #

自上一份得到应答的上报以来矿工打印过的稳定错误码及次数;绝不含消息。

字段发送内容原因如何处理
errors{"E116": 3}自上一份得到应答的上报以来矿工打印过的每个稳定错误码(E116 之类)及其次数,最多 64 个;一份完全没有得到应答的上报会把它们留给下一份。绝不含消息、堆栈、路径或主机。那些没人报告的 bug:一天看到三次 E116 的用户会换矿工,而不是提交工单。总数随数据点存储,每个错误码另有一个数据点,带版本、系统、算法和国家,用来按次数和受影响矿机的比例给错误码排序。

矿池主机 pool #

矿机都在哪些矿池上挖。

字段发送内容原因如何处理
pool_host"pool.example.com"第一个矿池的主机名,小写,其后什么都没有(无端口、路径、用户、查询参数),且仅当它是公共 DNS 名称时才发送:IP 地址、只有一段的名称、.lan 或 .local 之类的私有后缀,或 onion 地址,都发送 null。每次发布时矿工需要针对哪些矿池做测试。随数据点存储。

03 · 算力区间

算力,以区间表示 #

矿机在其算法上的总算力以区间发送,使用该算法自己的单位,绝不发送具体数值。区间遵循 1-2-5 序列:

00-11-22-55-1010-2020-5050-100100-200200-500500-1k1k-2k…500M-1G1G-2G2G-5G5G-10G…

0 表示算力为零的矿机,0-1 表示低于 1;其余每个区间从序列中的一个值到下一个值:1、2、5、10、20、50、100,依此类推,用 k、M、G、T、P 表示,不带小数。几个算力及其各自的发送内容:

0 H/s{"bucket": "0", "unit": "H/s"}
5.4 kH/s{"bucket": "5k-10k", "unit": "H/s"}
618.4 MH/s{"bucket": "500M-1G", "unit": "H/s"}
1.29 GH/s{"bucket": "1G-2G", "unit": "H/s"}
7.74 GH/s{"bucket": "5G-10G", "unit": "H/s"}
不挖矿null

足以看出矿机的规模,以及同一硬件上变慢的版本;又宽到无法给出某个矿场的精确数值。

04 · 功能标志

功能标志 #

features 字段携带下列标志中在该矿机上启用的那些名称;模式 1 共有 46 个标志。标志只说明某项设置在用,绝不含其取值:proxy 表示设置了代理,但绝不说是哪个。

标志含义
api-publicAPI 不只监听 127.0.0.1(--api-bind)。
background矿工在没有控制台的情况下运行(--background)。
cert-pin按指纹固定了某个矿池的证书(--tls-fingerprint);绝不含固定值本身。
cockpit矿机已加入驾驶舱:只表示是,绝不说明哪个矿场或哪台矿机。
config-file读取了配置文件(fearminer.toml);绝不含其内容。
cpuCPU 线程在挖矿。
cpu-affinityCPU 线程是手动绑定的(--cpu-affinity);绝不说明绑定到哪里。
doh用 DNS over HTTPS 解析矿池,系统解析器作为后备(--dns doh)。
doh-strict只用 DNS over HTTPS 解析矿池,不回退到系统解析器(--dns doh-strict)。
engine-pinned某个引擎被固定在某个版本(--engine ALGO=VERSION)。
failover配置了不止一个矿池。
gpu至少一个 GPU 在挖矿。
heartbeat定时 ping 一个心跳 URL(--heartbeat-url);绝不含该 URL。
helper特权辅助程序安装在矿工能找到的位置(fearminer-helper,Linux)。
hooks事件发生时运行程序(--hook);绝不说明是哪些程序。
hugepagesRandomX 的数据集得到了所需的全部大页内存。
hugepages-1gRandomX 的数据集位于 1 GiB 大页上(--1gb-pages)。
igpu集成显卡也参与挖矿(--igpu)。
ipv4-only只通过 IPv4 连接矿池(--ipv4-only)。
ipv6-only只通过 IPv6 连接矿池(--ipv6-only)。
log-file日志同时写入文件(--log-file);绝不含其路径。
msr为 RandomX 应用了 MSR 预设(--msr)。
no-api统计端点和 API 已关闭(--no-api)。
no-history矿机不保留自己的历史(--history off)。
no-nvml不读取 GPU 传感器(--no-nvml)。
no-supervisor单一进程,没有负责重启它的监督进程(--no-supervisor)。
no-verifyGPU 解在提交前不再用 CPU 复核(--verify-shares off)。
no-wallet-check钱包未经检查就发给矿池(--ignore-wallet-check)。
no-watchdog看门狗检查已关闭(--no-watchdog)。
notify-discord通知发往 Discord(--notify-discord);绝不含 webhook。
notify-telegram通知发往 Telegram(--notify-telegram);绝不含令牌或聊天。
notify-webhook通知发往用户自己的 URL(--notify-url);绝不含该 URL。
oc矿工在至少一张显卡上设置了频率、功耗上限或风扇(--cclock、--mclock、--pl、--fan)。
oc-script挖矿前为每张显卡运行一个程序(--oc-script);绝不说明是哪个。
proxy通过 SOCKS5 代理连接矿池(--proxy);绝不含代理地址。
root矿工以 root 身份运行(--allow-root)。
service矿工作为已安装的服务运行,属于某个账户或整台机器(fearminer service install)。
service-system该服务属于整台机器(fearminer service install --system)。
skip-preflight启动检查只报告结果,不据此采取行动(--skip-preflight)。
spki-pin按公钥固定了某个矿池的证书(--tls-spki);绝不含固定值本身。
tls至少一个矿池通过 TLS 连接(stratum+ssl)。
tls-insecure矿池证书不被验证(--tls-insecure):TLS 端口转发或代理。
tofu矿池证书在首次使用时信任(--tls-tofu)。
tui显示全屏面板。
unrestricted-apiAPI 接受的不只是可撤销的命令(--unrestricted-api)。
watch-config监视配置文件,文件改变时重新加载(--watch-config)。

05 · 绝不发送

哪些永远不会发送 #

任何版本、任何选项下都不会:不发送任何能识别个人或账户的信息。以下是模式文件公布的原文列表(英文),附译文:

  • 钱包wallet
  • 矿工名worker name
  • 矿池登录名或密码pool login or password
  • 机器名machine name
  • MAC 地址MAC address
  • 显卡或硬盘序列号card or disk serial number
  • GPU UUID 或 PCI 总线 IDGPU UUIDs or PCI bus ids
  • 文件路径file paths
  • 配置内容或配置值configuration contents or values
  • IP 地址(接收端从 Cloudflare 读取国家,从不读取地址)IP address (the ingestion reads the country from Cloudflare and never the address)
  • 驾驶舱或中继的任何信息(矿机指纹、密钥、代码)anything of the cockpit or relay (rig fingerprint, keys, codes)

矿工的测试会用模式检查每一份上报:出现模式之外的字段,构建即失败;在上报任何位置出现测试配置中的钱包、矿工名、密码、主机名或路径,构建同样失败。

06 · 时机

何时发送 #

三个时刻,中间没有别的。

start每次启动一次,在运行已经开始之后:第一个份额被接受时,最迟在启动一分钟后;无矿可挖时立即发送。绝不推迟第一个份额。携带 first 和 previous_version。
beat默认每 15 分钟一次。--telemetry-interval(FEARMINER_TELEMETRY_INTERVAL,或配置文件 [output] 下的 telemetry_interval)可设为 5 到 1440 分钟:低于 5 提高到 5,超过一天降为一天,日志会说明;接收端也检查同样的下限。自上一份得到应答的上报以来矿工打印过的错误码随它一起发送。
stop仅在正常停止时发送,最多让退出等待 2 秒。
  • 崩溃时什么也不发送:缺失的定期上报本身就说明了问题。
  • 发不出去的上报就此丢失:不排队、不重发,之后也不会成批补发。只有其中的错误计数会留给下一份上报。
  • 矿工从不读取应答,失败也只在 debug 级别记日志:无论 telemetry.fearminer.com 应答、拒绝还是停机数周,挖矿都一样。
  • 在统计中,当前在线的矿机是指最近 20 分钟内出现过的矿机,所以在默认间隔下,一次迟到的定期上报不会让它掉线。

为什么不是每分钟一次:矿机的算法、显卡和国家不会每分钟都变,每分钟上报会让数据量增加十五倍,却不多提供任何信息。逐分钟跟踪一台矿机,是驾驶舱为其主人做的事,而不是匿名计数的用途。

07 · 去向

发往哪里,保留什么 #

上报由 telemetry.fearminer.com 接收,这是一个独立的服务:一个 Cloudflare Worker,检查每份上报并记录下来。

请求一次几百字节 JSON 的 HTTPS POST,发往 https://telemetry.fearminer.com/v1/beat,User-Agent 为 fearminer/<version>,最多五秒,与矿池走同样的代理和解析器;接收端拒绝超过 8 KiB 的内容。应答只有状态码,别无其他:绝不含设置,绝不含指令。
国家从承载请求的 Cloudflare 读取:两个字母,Tor 为 T1,未知为 XX。绝不精确到城市、地区或时区;矿工本身不发送任何位置信息。
地址接收端从不读取,也从不存储,日志里也没有:该 Worker 的日志是关闭的。Cloudflare 为了传递请求会看到它,就像你连接的任何服务器一样。
写入每份上报在 Cloudflare Workers Analytics Engine 中写一个数据点:上面的字段加上国家,以安装 ID 作为数据点的索引。每个错误码另外写一个小数据点。
保留原始数据点保留约 3 个月,之后删除。每天把前一天汇总为每个取值对应的不同安装数,不含任何安装 ID,这些每日计数保留更久。计数比原始数据点保留得久,绝不相反。
查看者FearMiner 的维护者,在一个有访问控制的内部面板上:当前在线的矿机,按国家、版本、算法、系统和 GPU 型号;一个版本被采用的速度;哪些功能在用;最常见的错误码。
停机这个服务可以停几个星期:没有矿机会察觉,恢复时也不会有矿机成批补发。

08 · 隔离墙

与驾驶舱之间的隔离墙 #

驾驶舱的中继和本遥测是两个永不相交的服务:代码、密钥、存储和日志各自独立,能访问其中一个,并不能因此得到另一个的任何东西。

  • 驾驶舱的任何信息都不会发到这里:没有矿机指纹,没有矿场或矿机的密钥,没有加入代码,没有中继地址。cockpit 标志只说明矿机已加入驾驶舱,绝不说明加入了哪里。
  • 安装 ID 是随机生成的,不由任何东西推导:不来自矿机在驾驶舱中的名称,也不来自密钥、哈希或日期。
  • 两者从不关联:没有任何表、查询、导出或客服工单会把驾驶舱中的矿机与遥测中的安装放在一起。
  • 中继从不作为遥测来源:它对所连矿机的了解只留在它自己那里。

原因是结构性的。驾驶舱承诺它的中继不持有任何它能读懂的东西。如果中继能认出它的某台矿机就是某个国家里那台有六张显卡、某个算力的安装,它持有的恰恰就是它承诺不持有的东西。所以两者保持分离,即使它们统计的矿机数不一致。

09 · 大型矿场

大型矿场:风险与开关 #

直说:算力区间、GPU 型号和国家放在一起,可能指向一个大型矿场,因为同一个国家里不会有十个装着 400 张同型号显卡的安装。正因为如此,算力以宽区间发送,位置只到国家为止,安装 ID 也不携带任何别的东西。这降低了风险;对最大的矿场来说,并不能消除它。

不想发送任何东西的矿场使用 --no-telemetry。它关闭一切:不生成也不保存安装 ID,没有启动上报、定期上报、停止上报和错误计数;矿工也不失去任何功能:挖矿、驾驶舱、API 和通知都照常工作。

$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --no-telemetry
$ FEARMINER_NO_TELEMETRY=1 fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET
# fearminer.toml
[output]
no_telemetry = true

10 · 查看与关闭

查看、重置、关闭 #

命令作用
fearminer telemetry show打印运行中的矿工此刻会发送的定期上报,不发送任何东西;把运行时的选项交给它(例如 --config fearminer.toml)。若还没有安装 ID 就生成一个,但遥测关闭时绝不生成。只有运行中的矿工才能测量的内容按启动时的样子显示:算力区间 "0"(无矿可挖时为 null),运行时长 lt1h,没有错误,引擎为 null,gpu、cpu、oc、msr 和 hugepages 标志关闭。--json 只打印 JSON;遥测关闭时打印一句说明(配合 --json 时为 null)。
fearminer telemetry rotate-id生成一个新的安装 ID:从矿工下次启动起,本机被计为一个新安装。旧 ID 不与任何东西关联,它的数据点随原始数据点一起过期。
--no-telemetry关闭一切:不生成也不保存安装 ID,什么都不发送,也没有任何其他选项能重新打开其中任何一部分。等同于 FEARMINER_NO_TELEMETRY=1,或在配置文件的 [output] 下写 no_telemetry = true。矿工不失去任何功能。
--telemetry-interval两次定期上报之间的分钟数,5 到 1440,默认 15:低于 5 提高到 5,超过一天降为一天。也可用 FEARMINER_TELEMETRY_INTERVAL,或配置文件 [output] 下的 telemetry_interval。
egress每次启动都会打印的那一行。遥测开启时,其中这一部分为 telemetry.fearminer.com (telemetry every 15 min: event, install id, format, version, system, mining, hardware, hashrate bucket, features, uptime bucket, errors, pool host; fearminer telemetry show, fearminer.com/telemetry);关闭时为 no telemetry (--no-telemetry)。
telemetry-id安装 ID(32 位随机十六进制数字)及其上次运行的版本,位于状态目录(默认 ~/.cache/fearminer,FEARMINER_STATE_DIR 可移动它),仅你的账户可读;使用 --no-telemetry 时从不写入。

默认开启,因为只有具有代表性的数字才值得收集:改成需要主动开启的话,大部分上报会丢失,每一个不常见的系统、后端或错误都会被掩盖。这个选择的代价,就是这个页面、egress 行,以及一个能关掉一切的开关。

11 · 历史

修改历史 #

发送内容的每一次改动都会在这里记下一行,带日期和模式编号,矿工的 egress 行和 readme 也随之一起更新。

  1. 模式 1 新增标志 tls-insecure,模式仍为 1:只表示矿池证书未被验证,从不说明是哪个矿池。
  2. 模式 1 遥测和本页的第一版,模式 1。