Skip to content

MINER 开发者:适配 RigeOS 飞行表

本文面向 MINER(锄头)开发者,说明如何把 Linux MINER 制作为 RigeOS 可下载、可配置、可监控的安装包。适配完成后,用户可以在飞行表中填写矿池、钱包、Worker、算法和附加参数,不需要手工登录每台矿机启动程序。

最短结论

一个新的 MINER 通常只需要完成四件事:提供可直接运行的 Linux 二进制、在包根目录加入 rigeos-miner.json、按要求输出日志,并可选地写入标准统计 JSON。RigeOS 负责下载、启动、停止和运行状态管理。

适用范围

以下两种情况都可以适配:

  • 拥有源码:可以完善命令行参数、停止处理和标准统计,能够获得完整体验。
  • 只有已授权使用的二进制:可以根据程序已有的命令行参数编写 Manifest;如果程序不能输出标准统计,可以先不声明统计能力。

请只打包你拥有开发权或再发布权的软件,并遵守 MINER、算法组件和第三方依赖的许可证。

飞行表如何启动 MINER

公开适配流程如下:

text
用户填写飞行表

RigeOS 渲染矿池、钱包和矿机名称

rigeos-miner.json 将字段映射为参数

直接启动 MINER 二进制

采集标准输出、错误输出和可选统计 JSON

Manifest 中的 arguments 是参数数组,不是 Shell 命令。不要使用 sh -ceval、管道、重定向或命令替换拼接启动命令。

第 1 步:准备适合飞行表的命令行

MINER 应尽量把下列信息作为独立命令行参数或普通环境变量接收:

  • 矿池地址。
  • 钱包与矿机模板渲染结果。
  • Worker 名称。
  • 矿池密码。
  • 算法名称。
  • TLS 设置。
  • 用户附加参数。

同时建议满足以下行为:

  • 启动失败时返回非零退出码,并向标准错误输出明确原因。
  • 正常日志写入标准输出或标准错误,不依赖固定的系统绝对路径。
  • 收到 SIGTERMSIGINT 后停止接收新任务、保存必要状态并及时退出。
  • 不自行常驻、后台化或启动无法回收的脱管进程。
  • 不把钱包、矿池密码、Token 或测试凭据编译进程序和安装包。

如果某个可选参数不能接受空字符串,不要直接把对应占位符绑定到必传选项。可以让 MINER 接受空值,或者把该选项交给飞行表的“附加参数”。

第 2 步:组织安装包

推荐目录如下:

text
example-miner/
├── rigeos-miner.json
├── bin/
│   └── example-miner
├── LICENSE
└── README.md

要求如下:

  • rigeos-miner.json 必须位于解压后的包根目录。
  • rigeos-miner.json 必须是有效的单个 JSON 对象,大小不得超过 64 KiB。
  • 可执行文件必须带有 Linux 可执行权限。
  • 包可以直接包含根目录文件,也可以只包含一个顶层目录。
  • 包内路径必须是相对路径,不能包含目录穿越。
  • 不能包含符号链接、硬链接、设备文件或其他特殊文件。
  • 如果依赖动态库,优先使用构建时 RPATH 或静态链接,不要依赖危险的加载器环境变量。
  • 每个发布包只放入与目标矿机架构匹配的二进制;支持多个架构时分别发布文件。

第 3 步:编写 Manifest

文件名固定为 rigeos-miner.json。下面是一个完整示例,参数名称需要按照你的 MINER 实际命令行修改:

json
{
  "schema_version": 1,
  "id": "example.miner",
  "name": "Example Miner",
  "executable": "bin/example-miner",
  "working_directory": "bin",
  "arguments": [
    "--pool",
    "{{pool}}",
    "--user",
    "{{wallet}}",
    "--password",
    "{{password}}",
    "--worker",
    "{{worker}}",
    "--algorithm",
    "{{algorithm}}",
    "{{extra_args}}"
  ],
  "environment": {
    "EXAMPLE_TLS": "{{tls}}",
    "EXAMPLE_RUNTIME_NAME": "{{runtime_name}}"
  },
  "stats_format": "rigeos_json_v1",
  "stop": {
    "signal": "TERM",
    "grace_seconds": 15
  }
}

Manifest 字段

字段说明
schema_version当前固定为 1
id适配器唯一标识。以小写字母开头,只能包含小写字母、数字、点、下划线和短横线。
name面向维护者的 MINER 名称。
executable包内可执行普通文件的相对路径。
working_directory可选。默认使用可执行文件所在目录。
arguments启动参数数组,最多 128 项。
environment可选的普通环境变量,最多 32 项。
stats_format可选。需要标准统计时填写 rigeos_json_v1
stop.signal使用 TERMINT 优雅停止。
stop.grace_seconds等待优雅退出的时间,范围为 1~120 秒。

Manifest 使用严格校验。字段拼写错误、未知字段和未知占位符都会导致准备失败,不会被静默忽略。

飞行表占位符

占位符内容
飞行表中的矿池地址。
已渲染的钱包与矿机模板。
当前矿机的可信名称。
飞行表中的矿池密码。
飞行表中的算法名称。
飞行表中的 TLS 设置。
飞行表中的 MINER 名称。
用户填写的附加参数。只能作为一个完整数组元素出现一次。

只进行普通的引号和反斜杠分词,不展开环境变量、通配符、管道、重定向或命令替换。如果飞行表可能使用附加参数,Manifest 必须声明这个占位符,否则 RigeOS 会拒绝静默丢弃参数。

第 4 步:接入日志和统计

日志

MINER 应把运行日志写到标准输出或标准错误,RigeOS 会把两者收集到当前运行实例的日志中。运行时还会提供 RIGEOS_LOG_FILE,指向当前实例的日志路径;Manifest 不能覆盖这个保留变量。通常无需自行打开该文件,以免与标准输出收集重复。

日志中不要输出完整钱包私密字段、矿池密码、Token 或其他凭据。需要打印启动参数时,应先对敏感值脱敏。

标准统计

需要在 RigeOS 中展示 MINER 算力和份额时,在 Manifest 中声明:

json
"stats_format": "rigeos_json_v1"

运行后,MINER 会收到 RIGEOS_STATS_FILE 环境变量。程序应定期把统计结果写入该路径:

json
{
  "total_hashrate_khs": 1234.5,
  "devices": [
    {
      "index": 0,
      "hashrate_khs": 1234.5
    }
  ],
  "accepted_shares": 10,
  "rejected_shares": 1,
  "algorithm": "example",
  "version": "1.0.0"
}

统计规则:

  • 算力统一使用 kH/s,不要写入带单位的字符串。
  • 设备编号必须唯一,并与 MINER 识别的设备顺序一致。
  • 算力和份额不能为负数、NaN 或无穷大。
  • 统计文件最大为 1 MiB,设备数量最多为 128。
  • 使用“同目录临时文件 → 完整写入 → 原子重命名”的方式更新,避免 RigeOS 读到半个 JSON。
  • 不要通过安装包内的 Shell 脚本临时解析日志并生成统计;优先让 MINER 自身直接写标准统计。

只有二进制且无法生成标准统计时,可以暂时省略 stats_format。此时 MINER 仍可运行并提供日志,但工作台不会获得该 MINER 的标准算力和份额统计。

第 5 步:打包并发布

在 Linux 构建环境执行:

bash
chmod +x example-miner/bin/example-miner
tar -C example-miner -czf example-miner-v1.0.0-linux-amd64.tar.gz .
sha256sum example-miner-v1.0.0-linux-amd64.tar.gz

将安装包发布到稳定的 HTTPS 地址,例如:

text
https://downloads.example.com/miners/example-miner/v1.0.0/example-miner-v1.0.0-linux-amd64.tar.gz

发布时注意:

  • 下载地址必须使用 HTTPS,并且不能依赖 URL 中的用户名和密码。
  • 单个下载包不得超过 512 MiB。
  • 新版本使用新的版本目录和文件名,不要原地覆盖已经发布的 URL。
  • 不要使用内容会变化的 latest.tar.gz 作为飞行表长期地址。
  • 在发布页提供版本、架构、文件大小和 SHA-256,方便用户独立核对。

第 6 步:配置测试飞行表

RigeOS 飞行表与 Manifest 的对应关系如下:

飞行表字段Manifest 中的使用方式
MINER用于标识本次运行,对应
MINER 下载地址填写刚发布的 .tar.gz HTTPS 地址。
钱包与矿机模板支持 %WAL%%WORKER_NAME%,渲染后对应
矿池地址对应
矿池密码对应
算法对应
TLS对应
附加参数对应

如果钱包模板已经包含 Worker 名称,不要在 MINER 参数中再次拼接 ,否则可能生成重复的 Worker 后缀。

截图待补充(S04 / S11)

建议图片: 飞行表编辑器中的 MINER 配置区域。 应标出: MINER、下载地址、钱包与矿机模板、矿池、算法、TLS 和附加参数。 脱敏要求: 钱包地址、矿池账户和密码必须打码。

第 7 步:在测试矿机验收

首次测试只选择一台不承载关键任务的矿机:

  1. 创建测试钱包和测试飞行表。
  2. 填写与目标矿机架构匹配的 MINER 下载地址。
  3. 下发飞行表并等待运行结果。
  4. 在工作台确认飞行表实际版本、MINER 状态、日志和算力。
  5. 必要时登录测试矿机执行只读检查:
bash
sudo rigectl miner status
sudo rigectl miner logs --lines 200

完成以下检查后,才能扩大范围:

  • 安装包可以下载并识别 Manifest。
  • 参数中的矿池、钱包、Worker 和算法符合预期。
  • MINER 能连续稳定运行,并能在失败时输出明确原因。
  • TERMINT 可以在声明的宽限期内完成退出。
  • 重新启动后不会留下旧进程或重复挖矿实例。
  • 声明标准统计时,工作台能持续显示合理的算力和份额。
  • 日志和错误信息没有泄露钱包私密字段或凭据。

常见适配失败

现象常见原因处理方法
提示找不到 Manifest文件没有位于解压后的包根目录调整压缩包目录结构。
提示可执行文件不合法路径错误、文件没有执行权限或使用了链接修正 executable 并在打包前执行 chmod +x
Manifest 字段不合法使用了未知字段、错误 ID 或不支持的停止信号对照本文删除扩展字段并修正取值。
提示未知占位符占位符拼写错误或自行增加了变量只使用本文列出的占位符。
附加参数被拒绝飞行表有附加参数,但 Manifest 没有 在参数数组中完整声明一次。
下载后仍是旧版本新内容覆盖了已经使用过的相同 URL为每个版本发布新的不可变 URL。
MINER 启动后立即退出参数名不匹配、动态库缺失或工作目录错误在相同 Linux 环境复现命令并查看 MINER 日志。
没有算力统计未声明统计格式、文件未原子写入或 JSON 字段错误检查 RIGEOS_STATS_FILE 和统计示例。

使用 AI 完成适配

使用前准备

把以下材料提供给 AI 编程工具:

  • MINER 源码,或者你有权使用的 Linux 二进制。
  • --help 完整输出和一条已经验证可运行的示例命令。
  • 支持的算法、架构、驱动及 GPU 厂商。
  • MINER 当前的日志与统计输出样例。
  • 期望的矿池、钱包、Worker、密码、TLS 和附加参数映射。

不要把真实钱包私密字段、矿池密码、Token 或生产凭据交给 AI。使用明确标记为测试用途的假数据。

可直接使用的提示词

复制下面的内容,并替换尖括号中的信息:

text
你是一名资深 Linux MINER 适配工程师、构建工程师和安全工程师。

目标:
将我提供的 MINER 适配为 RigeOS 飞行表可使用的安装包。最终产物必须包含
Linux 可执行文件和包根目录的 rigeos-miner.json,并提供可复现的构建、打包、
测试和发布说明。

输入资料:
- 适配模式:<拥有源码 / 只有二进制>
- 源码或二进制位置:<路径>
- 目标架构:<linux-amd64 / linux-arm64>
- MINER 版本:<版本>
- --help 输出:<粘贴完整输出>
- 已验证的启动命令:<使用测试钱包和测试矿池的命令>
- 支持的算法:<列表>
- 支持的 GPU/驱动:<列表>
- 日志样例:<粘贴脱敏日志>
- 统计或 API 样例:<没有则写“无”>

RigeOS 公开适配契约:
1. Manifest 文件名固定为 rigeos-miner.json,必须位于压缩包根目录。
2. schema_version 只能为 1。
3. id 以小写字母开头,只能包含小写字母、数字、点、下划线和短横线。
4. executable 和 working_directory 使用包内相对路径。
5. arguments 必须是独立参数数组,禁止 sh -c、eval、管道、重定向和命令替换。
6. 可用占位符只有:{{pool}}、{{wallet}}、{{worker}}、{{password}}、
   {{algorithm}}、{{tls}}、{{runtime_name}}、{{extra_args}}。
7. {{extra_args}} 只能作为一个完整数组元素出现一次。如果不支持附加参数,
   必须明确说明限制,不能静默丢弃用户参数。
8. stop.signal 只能使用 TERM 或 INT,grace_seconds 范围为 1~120 秒。
9. 如声明 stats_format: rigeos_json_v1,程序必须原子更新 RIGEOS_STATS_FILE。
   JSON 使用 total_hashrate_khs、devices[index, hashrate_khs]、
   accepted_shares、rejected_shares、algorithm、version;算力单位统一为 kH/s。
10. 普通日志写入 stdout/stderr。不得输出钱包私密字段、密码、Token 或完整凭据。
11. 不得在包中放置符号链接、硬链接、设备文件、真实凭据或未经许可的组件。
12. 新版本必须使用新的不可变 HTTPS URL,不能覆盖旧 URL 的内容。

必须完成的工作:
A. 先检查现有程序的真实命令行和退出行为,列出“已经确认”“需要修改”与
   “信息不足”三类结论。不得猜测不存在的参数。
B. 拥有源码时,补充适合飞行表的参数解析、SIGTERM/SIGINT 优雅退出、
   脱敏日志,以及可选的 rigeos_json_v1 原子统计输出。
C. 只有二进制时,只能使用它已经支持的参数。不要伪造统计能力;如果无法产生
   标准统计,省略 stats_format 并明确说明影响。
D. 生成严格合法的 rigeos-miner.json。不要添加公开契约之外的字段。
E. 生成安装包目录,确保二进制具有执行权限,并给出 tar.gz 打包和 SHA-256 命令。
F. 使用假钱包、测试矿池或本地 Mock 完成参数渲染、启动、退出、异常参数、
   统计原子更新和敏感信息泄露测试。
G. 给出 RigeOS 飞行表填写示例,逐项说明 MINER 下载地址、钱包与矿机模板、
   矿池地址、密码、算法、TLS 和附加参数应如何填写。

安全和质量要求:
- 不修改 MINER 的挖矿算法或份额计算逻辑,除非我另行明确授权。
- 不下载或执行来源不明的文件,不绕过许可证、签名或安全校验。
- 不使用真实生产凭据做测试。
- 不把“可以编译”当成“已经运行验证”。只报告实际执行过的命令和结果。
- 遇到资料不足时先列出缺少的具体信息,再完成不依赖这些信息的部分。

最终按以下顺序输出:
1. 适配结论与限制。
2. 修改文件和修改原因。
3. 最终安装包目录树。
4. 完整 rigeos-miner.json。
5. 构建、测试、打包和 SHA-256 命令。
6. RigeOS 飞行表字段填写表。
7. 实际测试结果和失败测试结果。
8. 尚未验证的事项、发布风险和回滚方式。

AI 生成结果仍需要开发者评审,并在真实但非关键的测试矿机上验收。不要因为生成了 Manifest 就直接向整个矿场发布。

发布前检查清单

相关文档