Mine at Lazarus with a Ratum gateway
ratum-gateway is iohzrd's Rust rewrite of the DATUM gateway: one static binary, the same datum_gateway_config.json as the C gateway, and a status page of its own. Lazarus takes it as it is. No patch, no special setting, no approval. It is your own DATUM gateway like any other here: 0% fee. On 27 September 2026, 19 of the gateways connected to Lazarus ran it, versions 0.1.23 to 0.1.53.
We run every published line of it against our Prime on a test chain before we say it works. What that shows, version by version, is in the table at the end. The short answer: use the newest release, which is the build this guide installs.
1. What you need
- Bitcoin Knots 29.4.2 for this chain, fully synced, with
server=1. It builds your block templates, and 29.4.2 is the first release that knows the long coinbase maturity rule (consensus from block 973,440). An older node builds blocks the chain rejects. See the chain explained. - A machine that stays on: Linux, macOS or Windows, 64-bit, x86 or ARM. The gateway itself is small; the node wants about 20 GB pruned.
- An address on this chain to be paid to, from a wallet you use only here.
- BLAKE2b ASICs (any Siacoin miner) on the same network as the gateway.
2. Install ratum-gateway
Download the release for your machine from github.com/iohzrd/ratum/releases and check its checksum. On 64-bit Linux:
V=0.1.53 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
ARM Linux (a Raspberry Pi 5, say) is the aarch64-linux-musl file, a Mac the macos ones, Windows the x86_64-windows.zip. To build from source instead: git clone https://github.com/iohzrd/ratum && cd ratum && git checkout v0.1.53 && cargo build --release --bin ratum-gateway.
3. Tell the gateway about new blocks
Add this line to your node's bitcoin.conf and restart the node, so the gateway switches to a new block within milliseconds instead of on its next poll:
blocknotify=curl -fsS -o /dev/null http://127.0.0.1:7152/NOTIFY
7152 is the gateway's api.listen_port below. kill -USR1 <pid> does the same, if you prefer.
Keep data spam out of your blocks. Your node chooses the transactions, and stock Knots 29.4.2 mines the large fake-multisig data transactions that have been filling blocks. This line in bitcoin.conf refuses them:
maxscriptsize=589
Ordinary payments are untouched. It also declines very large multisig spends (about 5-of-7 and up), which other nodes still mine. It is your node and your choice.
4. The config
Save this as datum_gateway_config.json. It is the C gateway's file, so an existing one works as it stands once the datum section points here. The pubkey is ours, live from the pool.
{
"bitcoind": {
"rpcurl": "http://127.0.0.1:8332",
"rpccookiefile": "/home/YOU/.bitcoin/.cookie",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_addr": "0.0.0.0",
"listen_port": 23334,
"vardiff_min": 4096,
"require_address_username": true
},
"mining": {
"pool_address": "YOUR_XBT_ADDRESS",
"coinbase_tag_primary": "Lazarus",
"coinbase_tag_secondary": "YOUR_GATEWAY_NAME"
},
"api": {
"listen_addr": "127.0.0.1",
"listen_port": 7152,
"admin_password": "CHANGE_ME",
"miner_listen_addr": "127.0.0.1",
"miner_listen_port": 8000
},
"datum": {
"pool_host": "datum.lazarus-xbt.xyz",
"pool_port": 28915,
"pool_pubkey": "29120606bbbfdeb0dcb259d13ed1fba9e6ff198ff6a0152cffb7608dc1c266bd17532393738aee7edf9aa0c9ec93b835256971f186da878f77fb3ed273dff30a",
"pool_url": "https://pool.lazarus-xbt.xyz",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"pooled_mining_only": true
}
}
datum: our host, port and pool pubkey. The pubkey pins the connection: a gateway given the wrong one gets no session and serves no work, which we checked.pool_urlonly puts a link to our site on the gateway's status page.mining.pool_address: your address. While the gateway is connected, every coinbase it builds pays our split and our pool output, whatever this says, so it never changes what you earn. It is only paid on work mined while the gateway has lost the pool, see step 7.coinbase_tag_secondary: your gateway's name. It is what our Gateways table shows.coinbase_tag_primaryis used only when the pool is unreachable; while connected, the gateway writes our tag.pool_pass_full_users: true: each miner behind the gateway is paid at the address in its own username. Several people can share one gateway.require_address_username: true: the gateway refuses a worker whose username does not start with an address, instead of mining for a name nobody can pay.vardiff_min: 4096: where new sessions start. Faster machines climb from there.admin_passwordguards the status and settings pages on port 7152. They use plain HTTP Basic auth, so keeplisten_addron127.0.0.1or a private network.
5. Start it, and point your ASICs at it
ratum-gateway -c datum_gateway_config.json. The log says DATUM pool configuration: … tag "Lazarus" within a second or two, then Stratum job … ready (full): … coinbaser outputs, pooled. To keep it running, a systemd unit:
[Unit] Description=ratum-gateway (DATUM gateway for Lazarus Pool) After=network-online.target bitcoind.service [Service] User=YOU ExecStart=/usr/local/bin/ratum-gateway -c /home/YOU/ratum/datum_gateway_config.json Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
On each ASIC: pool URL stratum+tcp://GATEWAY-LAN-IP:23334 (the machine running the gateway, not our host), username bc1…youraddress.worker, password x. Our DATUM port, 28915, talks only to gateways; an ASIC pointed there gets nothing.
6. Check that we see it
- Our Gateways table lists it within a minute as Ratum gateway with its version and commit, under your secondary tag. The state turns to hashing after the first accepted share.
- Your address appears under Miners and in the next payout once its work is in the window. Look it up at
pool.lazarus-xbt.xyz/#bc1…. /api/gatewayscarries the same row, withsoftware: {"name": "ratum-gateway", …}, and the Lazarus MCP toolgateway_statusanswers "is my gateway connected" by name.- The gateway's own page,
http://127.0.0.1:7152/, shows the pool connection, the split it holds and every connected miner.
7. When the pool is unreachable
Every Ratum release we tested does the same thing when it loses the pool, whether the Prime restarts or the network drops: for the first 12 to 26 seconds it keeps your miners busy on work it builds alone, a coinbase paying mining.pool_address and nobody else. Then it disconnects them, and they reconnect by themselves once the pool is back. A block found in that gap is not a pool block: we never see it, so nobody in the window is paid from it. That is why pool_address should be your address. Then such a block pays you, which is fair, since it was your work. Point it at ours and it would land in the pool's wallet with nobody's name on it. We restart the Prime rarely and right after a block, and we have reported the gap to Ratum's author.
8. Troubleshooting
connecting to DATUM pool datum-beta1.mine.ocean.xyz
Thedatumsection is missing or misspelled, so Ratum fell back to its built-in default (OCEAN). Setpool_host,pool_portandpool_pubkeyexactly as above.DATUM connection endedstraight after connecting, and no gateway row on our site
Wrongpool_pubkey. The handshake is sealed to our key, so a key from another pool (or an old copy) is refused before any work flows. Copy the key from the Connect section again.no work is served until it connects/disconnecting stratum clientspooled_mining_onlyis on (keep it on) and the gateway cannot reachdatum.lazarus-xbt.xyz:28915. Check outbound TCP 28915 and DNS. Miners reconnect by themselves once it is back.- Miners connect but never get a job
The node is still syncing, or it is not a BLAKE2b Knots: Ratum serves nothing until the node's template lists the!blake2brule. Run Bitcoin Knots 29.4.2 for this chain and wait for it to catch up. Address already in useat start
Something else holds a port. Ratum also opens a miner lookup port,api.miner_listen_port, 8000 by default; move it or the API port.- Authorization refused for a worker
require_address_usernameis doing its job: the part before the first.is not an address. Usebc1…youraddress.worker. Without that check the share is accepted and credited to a name nobody can be paid for. - A few
bad-coinbase-outputsor stale rejects on our Gateways table
Normal right after the Prime restarts or the tip moves: jobs from before carry an older split. They clear in seconds and no credit is lost. - Blocks the chain rejects, or your gateway refused with a note about #419
Your node is older than Knots 29.4.2 and does not know the long coinbase maturity rule. Upgrade the node and reconnect; the refusal lifts on its own.
9. Switching to Ratum, or to Lazarus
From the stock C gateway (CONVOY, iohzrd, FlyTheElephant or StartOS): stop datum_gateway, start ratum-gateway -c with the same file, and add api.miner_listen_port if something already uses 8000. Your earnings follow your address, not the gateway, so the work already in the window stays yours. The new gateway has a new key, so it shows as a new row on our Gateways table and the old one goes offline.
From another pool's Ratum config (Omega, B2Pool, P2Block, AlphaPool): change only the datum section to the host, port and pubkey above, and pool_url if you set it. A secondary tag that names another pool's public gateway means nothing here and can stay or go. P2Block's fork has a solo mode: set mining.solo to false, or the gateway never talks to a pool. AlphaPool's port 28916 and its key do not work here; ours is 28915.
Back again is the same edit in reverse. Nothing is locked in: the work you did here is paid by the blocks we find while it is in the window.
What we measured
| Build | Blocks, payees | Pool-only full work | Pool lost |
|---|---|---|---|
| iohzrd 0.1.28 | 5 of 5 split, 13–14 payees | 4 ms of 222 s live 0.020% | unpooled 18 s |
| iohzrd 0.1.39 | 10 of 10 split, 13–15 payees | 0 ms of 230 s live 0.030% | unpooled 26 s |
| iohzrd 0.1.53 (latest release) | 7 of 7 split, 13–15 payees | 3 ms of 229 s live 0.084% (few shares yet) | unpooled 17 s |
| iohzrd master 0.1.54 | 9 of 9 split, 13–15 payees | 6 ms of 227 s live — | unpooled 19 s |
| B2Pool fork (ocminer) 0.1.25 | 9 of 9 split, 13–15 payees | 9 ms of 227 s live 0.000% (few shares) | unpooled 19 s |
| P2Block fork 0.1.29 | 7 of 7 split, 13–15 payees | 6 ms of 232 s live — | unpooled 20 s |
How: a Bitcoin Knots 29.4.2 regtest chain with BLAKE2b and the long coinbase maturity rule, a copy of our Prime (the build the pool runs), each gateway build and two CPU miners, about eight minutes per build with transactions in every template and a rival finding a block every 15 seconds. Checked: the pubkey pins the connection, each block booked split pays on chain exactly what its record says, the DATUM fee path, address.worker and address~tag.worker usernames, a restart of the Prime, and no refusal of any kind. "Live" is the share of accepted shares on a full job paying only the pool, from our Prime's own counters over every connected gateway of that version. The iohzrd C gateway sits at 0.018% on the same count. We re-run the same test on each Ratum release and update this table.