自己构建区块。
走这条路,你不必把矿机指向我们。你在自己的机器上运行一个 Bitcoin Knots 节点和一个 DATUM 网关;由你的节点决定哪些交易进入区块,矿池只回答一个问题——谁该拿多少。这是我们更希望你采用的方式,也是在 Bitcoin Knots 不再为矿工未自行构建的区块付款之后,仍然会付款的那条路。
- 矿池费率
- 1 %
- 普通 stratum 也一样
- 网关端口
- 28915
- 四个区域都一样
- Prime ID
- 4243
- 区块浏览器如何称呼你
- 最小支付额
- 10,000 聪
- 低于此数将结转
- 节点所需磁盘
- ~40 GB
- 裁剪模式,不是完整链
我们为什么推荐这条路。
不是因为它更难,而是因为由谁来掌握模板。
在我们普通的 stratum 端口上,区块模板由我们替你构建。这能用,支付方式一样,对桌上一台矿机来说也是合理的选择。但这意味着交易由我们挑选,而你是在信任我们的挑选——连同我们那一周恰好启用的策略。一个构建每一个模板的矿池,原则上就是一个可能被施压的矿池。
用你自己的网关,模板就是你的。你的节点的中继策略、你的内存池、你的费率下限。区块存在之前我们从未见过它,我们无法审查自己没有构建的东西。矿池只提供分配方案——你的网关写进 coinbase 的地址与金额清单。费率是 1 %,与普通 stratum 今天所付的完全相同。
诚实的代价是你要运行一个节点。它要约 40 GB,要一直开着,首次同步需要一到三天。此后它会自己照顾自己。矿池如何支付在两条路上是一样的——直接出自区块的 coinbase,没有余额,也没有什么要提取的。
开始之前需要准备什么。
- 一台长期开机的机器
- 任何 64 位 Linux 机器(x86-64 或 ARM64)、Mac 或 Windows。两个核心绰绰有余。带 SSD 的 Raspberry Pi 5 就够;SD 卡不行。
- 约 40 GB 可用空间
- 链数据,裁剪后的。单是 UTXO 集合今天就有 11 GB,而且还在增长;其余是你的裁剪预算和首次同步的余量。
- 8 GB 内存较为宽裕
- 把 dbcache 调小,4 GB 也够。它只在首次同步时才重要。
- 一到三天
- 首次同步所需。期间你可以把其他东西都配好,但在节点追上链尖之前,网关不会分发工作。
- 你的 BTCB2 地址
- 一个你自己掌握私钥的钱包里的原生 SegWit 地址(bc1q…)。矿池会把它直接写进区块——这里没有账户,也没有什么要注册的。
六个步骤。
命令以 Linux 为准。Mac 和 Windows 只在下载这两个文件的方式上不同。
01安装 Bitcoin Knots
这是认识 BLAKE2b 链的客户端。请从项目方获取并校验校验和,不要用 Bitcoin Core 的构建替代——Core 没有这个分叉。
V=29.4.2.knots20260508 cd /tmp curl -fsSLO https://bitcoinknots.org/files/29.x/$V/bitcoin-$V-x86_64-linux-gnu.tar.gz curl -fsSLO https://bitcoinknots.org/files/29.x/$V/SHA256SUMS sha256sum --ignore-missing -c SHA256SUMS sudo tar -xzf bitcoin-$V-x86_64-linux-gnu.tar.gz -C /opt sudo ln -sf /opt/bitcoin-$V/bin/bitcoind /usr/local/bin/bitcoind sudo ln -sf /opt/bitcoin-$V/bin/bitcoin-cli /usr/local/bin/bitcoin-cli bitcoind --version | head -1
在 ARM64 上把 x86_64 换成 aarch64。最后一行必须显示 29.4.2 并提到 Knots。如果 sha256sum 没有打印 OK,请停下来重新下载——通常是下载被截断了。
02配置节点
把这些写入 ~/.bitcoin/bitcoin.conf。密码不要自己想,用命令生成:openssl rand -hex 24。
~/.bitcoin/bitcoin.conf
server=1 rpcbind=127.0.0.1 rpcallowip=127.0.0.1 rpcuser=datum rpcpassword=PASTE_THE_RANDOM_HEX_HERE prune=10000 dbcache=2048 blockreservedweight=32000 blocknotify=curl -fsS -o /dev/null http://127.0.0.1:7152/NOTIFY
blockreservedweight=32000 是别人都没有写进文档的一项设置,漏掉它会悄无声息地让同池矿工损失收入。原因如下:矿池会把一份支付输出清单交给你的网关——近来是 160 到 250 个。这些输出必须放进 coinbase,而模板为 coinbase 留出的唯一空间就是这块预留。默认值是 8,000 权重单位,约合 40 个输出。超出的部分会被直接丢弃,其金额归入矿池自己的地址,事后还得人工结算。我们四个节点上都设为 32,000——实测可容纳 246 个输出而不是 153 个——不会有任何损失。只应调高,不要调低。
有些矿池会让你改用 blockmaxweight=740000 把整个区块封顶。那样也能留出空间,但会把本该填满区块余下部分的交易手续费扔掉。预留才是更便宜的那个旋钮。
其余都很常规。prune=10000 保留 10 GB 区块——这条路上没有任何环节需要旧历史,而 txindex 在这里更是纯粹浪费磁盘。blocknotify 让你的网关在不到一秒内切换到新链尖,而不是等下一次轮询;它指向的是你下一步要安装的网关。然后启动节点,让它同步:
bitcoind -daemon bitcoin-cli getblockchaininfo | grep -E 'blocks|headers|verificationprogress'
当 verificationprogress 到达 1 就完成了。在那之前网关会启动但不分发工作,这是正确的。
03安装网关
不需要编译。ratum-gateway 是一个约 2.4 MB 的静态二进制文件,完全没有依赖。
V=0.1.57 cd /tmp curl -fsSLO https://github.com/iohzrd/ratum/releases/download/v$V/ratum-gateway-$V-x86_64-linux-musl.tar.gz curl -fsSLO https://github.com/iohzrd/ratum/releases/download/v$V/ratum-gateway-$V-x86_64-linux-musl.tar.gz.sha256 sha256sum -c ratum-gateway-$V-x86_64-linux-musl.tar.gz.sha256 tar -xzf ratum-gateway-$V-x86_64-linux-musl.tar.gz sudo install -m0755 ratum-gateway-$V-x86_64-linux-musl/ratum-gateway /usr/local/bin/ ratum-gateway --version
发布包里还有 aarch64-linux-musl、x86_64-macos、aarch64-macos 和 x86_64-windows.zip。0.1.57 是我们目前看到在本池上正常工作的版本;如果你更喜欢 C 实现,CONVOY DATUM 网关读取的是同一个配置文件,我们同样接受。
04把网关指向 B2Pool
一个文件。把标注的那两行换成你自己的地址和一个你选的密码;其余可以原样保留。
gateway.json
{
"bitcoind": {
"rpcurl": "http://127.0.0.1:8332",
"rpcuser": "datum",
"rpcpassword": "THE_SAME_HEX_AS_IN_BITCOIN_CONF",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_addr": "0.0.0.0",
"listen_port": 23334,
"vardiff_min": 2048,
"require_address_username": true
},
"mining": {
"pool_address": "YOUR_OWN_bc1q_ADDRESS",
"coinbase_tag_secondary": "your-name-here"
},
"api": {
"listen_addr": "127.0.0.1",
"listen_port": 7152,
"admin_password": "PICK_SOMETHING"
},
"datum": {
"pool_host": "de.b2pool.io",
"pool_port": 28915,
"pool_pubkey": "8ba1f7693d117620b1e5a46828f1cd187efe81114e9cee6a063bfbbe2f1b6cff0fc681d3c1ca7cb19c0e0dbddfbea65d5509e974e7f0000112dd07cba744a716",
"pool_url": "https://b2pool.io",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"pooled_mining_only": true
}
}
选择到你延迟最低的主机——de、hel、ord 或 hkg,都在 .b2pool.io:28915 上。它们是同一个矿池、同一套账本,只是距离不同。若不确定,仪表盘会从你自己的浏览器测量往返时延。
公钥把连接钉死。拿错公钥的网关拿不到会话,也不会分发工作——这正是用意所在:没人能悄悄站在你和矿池之间。请原样复制。该字段也可以留空让它自动获取,但那样你就是在信任收到的第一个答复。别这么做。
coinbase_tag_secondary 是你在区块里的名字。主标签由我们自己设置——这是 DATUM 的惯例,也正是区块浏览器能把区块归属到矿池的依据——但第二个字符串是你的,我们绝不覆写。它会显示在区块浏览器上、紧挨着我们的名字,也正是你的区块显示为 DATUM miners via B2Pool 而不是只有矿池名的原因。
然后启动:
ratum-gateway -c /etc/ratum/gateway.json
跑通之后,给它配一个 systemd 单元,这样重启后会自动回来。关于 pooled_mining_only 有一点说明:保持 true 时,矿池不可达你的矿机就会空转。设为 false 它们会继续挖,而这期间挖到的任何区块会 100 % 支付到你自己的 mining.pool_address,而不是进入分配。两种都说得通:前者可预测,后者永不停机。
05把矿机指向网关
你的硬件现在是在和你自己的机器对话,而不是和我们。使用网关主机的局域网地址:
stratum+tcp://192.168.1.50:23334
- 用户名
- bc1q…你的地址.rig-01——你的收款地址,后面可以用一个点加矿机名
- 密码
- 任意填,不作校验
- 最小难度
- 2,048。低于这个难度池不予计入,所以 vardiff_min 保持原值即可
第一个点之前的部分必须是本链上的真实地址——矿池正是按这个字符串计入工作量,其他任何写法都会以 BadUsername 退回。由哪个地址收款,取决于两项网关设置:
| 网关设置 | 矿池收到的内容 | 谁收到钱 |
|---|---|---|
| pool_pass_full_users: true | 每个矿工自己的用户名,原样不动 | 分别支付到每个矿工自己的地址 |
| pool_pass_workers: true pool_pass_full_users: false |
你的 mining.pool_address,然后一个点加矿机名 | 你——矿机名只是个标签 |
上面的配置用的是第一种,这样一个网关可以放在好几个人的机器前面,各自支付到各自的地址。如果它后面的矿机都是你的,第二种更清爽。
pool_pass_full_users 优先。启用它时,pool_pass_workers 会被忽略,因此像上面的示例那样同时设置两项,得到的是第一行的结果,而不是两者的混合。矿池页面能显示什么也由此决定:矿池只能看到你的矿机发来的用户名。一台仅以裸地址登录、后面什么都不加的矿机,到达时就只是一个身份:只有一个总算力,没有矿机列表,也没有矿机数量。给每台矿机设置 <地址>.<你自己取的名字>,名字就会出现。在第二行的配置下,网关会替你完成这件事 - 它把每台矿机自己的用户名接在你的地址后面,并用局域网 IP 为没有名字的矿机命名,于是你会看到 192x168x1x50,其中的点被换成了 x,因为点是分隔符。
06确认确实跑起来了
四件事,按这个顺序。每一项排除一种不同的故障。
- 01网关建立了会话
启动后不久日志里会出现 hello ok。没有这一行,说明主机、端口或公钥有误。
- 02工作正在分发
每出现一个新链尖就有一行:Updating standard stratum job for block …。这里没有输出,说明节点还没同步完。
- 03份额被接受
你矿机自己的页面上,接受的份额在增长且没有拒绝。
- 04你出现在矿池里
几分钟之内,你的地址就会出现在矿工页面上,你自己的 /miner/<地址> 页面也会开始填充。
跑不起来的时候。
真正会出问题的五件事,以及每一件的含义。
| 你看到的现象 | 它的含义 |
|---|---|
| 完全不分发工作 | 节点还没到 BLAKE2b 规则,或者仍在同步。只要模板里还没有列出 !blake2b,网关就有意不分发任何工作,而不是把错误链的工作发出去。 |
| BadUsername | 第一个点之前的用户名不是本链接受的地址。用 bitcoin-cli validateaddress <地址> 在你自己的节点上验证一下。另外要注意这里指的是哪一个用户名:当 pool_pass_full_users: true 时,网关转发的是每台矿机自己的用户名,因此要改的是矿机,而不是 datum.pool_username - 即使网关自己的地址完全正确,只要有一台机器以 rig-3 登录,它的每一个份额都会被拒绝。在此期间不会计入任何算力,这样的矿机等于白跑。我们这一侧的日志则是反过来写的:payout address "rig-3" cannot be paid: not a valid address。 |
| NoSplit | 你的网关挖出的 coinbase 没有支付矿池发给它的任何分配。这是网关版本过旧或构建有误的迹象,不是你做错了什么——升级它。 |
| StaleBlock | 份额对应的链尖已经变了。每天几个属于正常。持续不断则说明 blocknotify 没有传到网关。 |
| 有输出没进区块 | blockreservedweight 太低,coinbase 装不下整份分配。调到 32,000 并重启节点。 |
其他情况请带上网关的日志行到 Discord。通常就是某一项设置。
值得先问清楚的问题。
我的收益会比普通端口上的矿工少吗?
不会——同样的工作量,拿得一样多。两条路都从同一个矿池近期工作量的滚动窗口里划分——网络难度的八倍——而且都直接从区块的 coinbase 支付。两者的手续费都是 1 %。你在这里得到的是模板:交易由你挑选。
能跑在我矿机旁边已有的那台机器上吗?
可以,而且这是常规做法。网关很小;需要磁盘的是节点。同一网络里任何长期开机的机器都行,包括配真 SSD 的 Raspberry Pi 5。避免用 SD 卡——chainstate 会把它写坏。
我需要对公网开放端口吗?
不需要。你的网关是向矿池主动发起出站连接,而你的矿机通过你自己的局域网找到它。外部不需要能访问任何东西,节点也不需要入站连接。
我的节点可以是裁剪模式吗?
可以。构建模板需要的是 UTXO 集合和内存池,而不是旧区块。裁剪模式正是这里推荐的配置,我们自己也这么跑。txindex 你也不需要:它占磁盘,在这条路上毫无用处。
如果我的节点或网关宕了会怎样?
它停着的时候你的矿机不会有收益——和任何矿池一样——而已经进入支付窗口的工作量会在它慢慢退出窗口的过程中继续支付给你。什么都不会丢,也没有什么要追回。给矿机配上第二个矿池槽指向我们普通的 stratum 端口,它自己就会回退过去。
矿池能看到我打包了哪些交易吗?
只有事后才知道,和其他所有人一样,等区块公布之后。矿池拿到的是待广播的区块;它从来没有决定里面装什么的机会。这正是这种安排的全部意义。
为什么主 coinbase 标签由矿池设置而不是我?
因为区块浏览器正是读这个字段来归属区块的。如果每个网关都写自己的,矿池的区块就无法被统计为矿池的。第二个标签是你的,我们从不触碰,它才是在区块里标识你的那一个。
有最低支付额吗?
10,000 聪。小于这个数额的输出,花费它的成本高于它本身的价值,因此不会写入区块——它会结转,并随你的下一份份额一起支付。矿工页面会同时显示这两个数字。