Your node builds the block, your gateway talks to the pool, your miners hash into your gateway. Seven steps, in this order — each one ends with how you know it worked.
Which pool? The steps are the same; only the port, the key and the payout rule change.
Do not skip ahead. A gateway whose node is not ready will connect to us, sit at zero and look perfectly healthy from the outside. Finish each step before starting the next one.
In a hurry? For CAROUSEL and CHIRP one command does steps 2 to 5 for you — it finds your node, installs the build tools if you let it, clones and builds the gateway, writes the config, starts it as a service and registers your address. Read the steps anyway: it is what the script does, and it is what you will need when something looks wrong.
curl -fsSL https://b.pyblock.xyz:8443/gateway | sh -s -- carousel YOUR_BTC_ADDRESS
curl -fsSL https://b.pyblock.xyz:8443/gateway | sh -s -- chirp YOUR_BTC_ADDRESS
Useful variables: PYBLOCK_CLI="bitcoin-cli -datadir=/data" if your node is not auto-detected · PYBLOCK_STRATUM=23334 the port your miners will use · PYBLOCK_INSTALL_DEPS=1 let it install build dependencies · PYBLOCK_NO_SYSTEMD=1 run with nohup instead of a service.
WAVICLES has no installer yet: follow the steps by hand, they take about ten minutes.
1Run a BLAKE2b node
DATUM needs a Bitcoin Knots node following the BLAKE2b fork (Knots ≥ 29.4), fully synced. A stock Knots or Core will not do: it does not know the blake2b rule and returns no usable work.
Fully synced. A node still catching up returns no template.
RPC reachable from wherever the gateway runs — same machine or your LAN — with rpcuser/rpcpassword or the cookie file.
blockreservedweight=100000. Without it the template can leave no room for the payout outputs and the block pays only the pool.
Your node, your rules. Which transactions go into your blocks is decided by your node’s mempool policy, not by us. Our own gateways run Plumb (Knots with extra data filters, built by us from the signed tag); your gateway uses whatever node you point it at.
How you know it worked: this returns a template instead of an error. If it says unknown rule blake2b, the node is not on the fork; if it errors otherwise, fix the node first — the gateway will never work without it.
The gateway is a small C program that sits between your node and the pool: it asks your node for work, hands it to your miners and tells us who did the work so the block pays them. There is no binary to download — you build it from source in a couple of minutes.
Which source. For CAROUSEL and CHIRP: gitlab.com/astrolexis-group1/datum-carousel, PyBLØCK’s fork — the one the installer builds, tested daily against these Primes. For WAVICLES: CONVOYMining/datum_gateway at commit 7491a509 or later — earlier builds miscount the BLAKE2b coinbase bytes and truncate the payout list, so we refuse them at the handshake.
Clone and build. The binary ends up in build/datum_gateway:
git clone --depth 1 https://gitlab.com/astrolexis-group1/datum-carousel.git ~/pyblock-gateway/src
cd ~/pyblock-gateway/src
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
ls -l build/datum_gateway
git clone --depth 1 https://github.com/CONVOYMining/datum_gateway.git ~/pyblock-gateway/src
cd ~/pyblock-gateway/src
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
ls -l build/datum_gateway
How you know it worked:./build/datum_gateway --help prints the usage. If it also mentions key_file, your build keeps a persistent gateway identity (good — see step 3).
3Configure it — point it at our Prime
One JSON file. Everything below is what the installer writes; only the parts in CAPITALS are yours to fill. Click the block to copy it, save it as carousel.json next to the binary and chmod 600 it — it holds your node’s RPC password.One JSON file. Everything below is what the installer writes; only the parts in CAPITALS are yours to fill. Click the block to copy it, save it as chirp.json next to the binary and chmod 600 it — it holds your node’s RPC password.One JSON file. Everything below is what the installer writes; only the parts in CAPITALS are yours to fill. Click the block to copy it, save it as wavicles.json next to the binary and chmod 600 it — it holds your node’s RPC password.
bitcoind — your node’s RPC user, password and host:port (BLAKE2b nodes usually listen on 8342). A cookie file works too: user and password are the two halves of .cookie.
stratum.listen_port — the port your miners will connect to (23334 here). vardiff_min is the share floor: 1 for GPU / CPU, 1024 or more if only ASICs will hash into it — DATUM’s default of 16384 is SHA-256 scale and a BLAKE2b GPU never reaches it.
mining.pool_address — your BLAKE2b address. Required: with an invalid one the gateway exits in under a second. It is where your node-runner share is paid, and it collects any block you find while the pool is unreachable.
coinbase_tag_secondary — your name. It goes on-chain in the scriptsig of every block your gateway publishes.
datum — our Prime: pool_host b.pyblock.xyz, pool_port28916 and the 128-hex pool_pubkey above. pool_pass_full_users: true credits each miner to the address it logs in with. key_file keeps the same gateway identity across restarts — the pool credits the node-runner by that key; delete the line only if your build does not support it.datum — our Prime: pool_host b.pyblock.xyz, pool_port28917 and the 128-hex pool_pubkey above. pool_pass_full_users: true credits each miner to the address it logs in with. key_file keeps the same gateway identity across restarts — the pool credits the node-runner by that key; delete the line only if your build does not support it.datum — our Prime: pool_host b.pyblock.xyz, pool_port28915 and the 128-hex pool_pubkey above. pool_pass_full_users: true credits each miner to the address it logs in with. key_file keeps the same gateway identity across restarts — the pool credits the node-runner by that key; delete the line only if your build does not support it.
pooled_mining_only — what happens if the pool is unreachable. false: the gateway keeps mining and any block found pays 100% to pool_address. true: it waits for the pool instead.
How you know it worked:python3 -m json.tool carousel.json prints the file back without complaint — a missing comma is the most common reason the gateway refuses to start.python3 -m json.tool chirp.json prints the file back without complaint — a missing comma is the most common reason the gateway refuses to start.python3 -m json.tool wavicles.json prints the file back without complaint — a missing comma is the most common reason the gateway refuses to start.
4Run it
First in the foreground, so you see the log. Within a few seconds it should print the pool’s DATUM Pool MOTD — that is the handshake done: your gateway proved its key, the Prime accepted it.
cd ~/pyblock-gateway && chmod 600 carousel.json
./src/build/datum_gateway -c carousel.json
cd ~/pyblock-gateway && chmod 600 chirp.json
./src/build/datum_gateway -c chirp.json
cd ~/pyblock-gateway && chmod 600 wavicles.json
./src/build/datum_gateway -c wavicles.json
Then make it a service so it survives reboots. The installer writes this unit; adapt the paths and user:
/etc/systemd/system/pyblock-gateway-carousel.service[Unit]
Description=PyBLOCK carousel DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/carousel.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
/etc/systemd/system/pyblock-gateway-chirp.service[Unit]
Description=PyBLOCK chirp DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/chirp.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
/etc/systemd/system/pyblock-gateway-wavicles.service[Unit]
Description=PyBLOCK wavicles DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/wavicles.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Logs: journalctl -u pyblock-gateway-carousel -f (or the log_file from the config). The gateway also serves a small dashboard on http://127.0.0.1:7152/ — the Clients tab lists every miner hashing into it.Logs: journalctl -u pyblock-gateway-chirp -f (or the log_file from the config). The gateway also serves a small dashboard on http://127.0.0.1:7152/ — the Clients tab lists every miner hashing into it.Logs: journalctl -u pyblock-gateway-wavicles -f (or the log_file from the config). The gateway also serves a small dashboard on http://127.0.0.1:7152/ — the Clients tab lists every miner hashing into it.
How you know it worked:your gateway shows up in node runners connected on the pool within a minute. Connected with zero shares is normal at this point: nothing is hashing into it yet.your gateway shows up in node runners connected on the pool within a minute. Connected with zero shares is normal at this point: nothing is hashing into it yet.your gateway shows up in node runners connected on the pool within a minute. Connected with zero shares is normal at this point: nothing is hashing into it yet.
On these two Primes the node-runner’s cut is credited to the gateway key, so the pool has to know which address that key pays to. The installer does this for you; by hand it is two requests from the machine running the gateway (the claim is only accepted from the same IP the gateway is connected from — that is what stops anyone else from claiming your key).
1 · Ask the pool which gateway key it sees from your IP:
How you know it worked: the answer says "ok": true. Re-running with the same address is harmless; changing a registered address is done by hand — ask on Telegram.
WAVICLES needs no registration: your identity in the work window ispool_address.
6Point your miners at your gateway
Every miner connects to your own gateway, on its stratum port — any BLAKE2b miner works: GPU, CPU or a Sia-class ASIC. The gateway address is your machine’s, on your LAN or the internet, not ours.
URL stratum+tcp://YOUR_GATEWAY_IP:23334
Username YOUR_BLAKE2B_ADDRESS.rig-01
Password x
Username = a BLAKE2b address (bc1q… or 1…), a worker name after a dot is fine. With pool_pass_full_users: true that is the address each miner is paid to.
Password: x. It is ignored.
The gateway does not check the username. It forwards it as typed; we reject anything that is not a payable address, and that miner’s share falls to pool_address.
Never point a miner at the pool.b.pyblock.xyz:28916 is where your gateway talks to us. A miner sent there will not mine.b.pyblock.xyz:28917 is where your gateway talks to us. A miner sent there will not mine.b.pyblock.xyz:28915 is where your gateway talks to us. A miner sent there will not mine.
How you know it worked: the gateway’s Clients tab lists the miner, and your row in node runners connected starts counting shares within a few minutes.
7Confirm you are being paid
From here it is the pool’s job. Everything is on-chain, in the coinbase of the block itself: nothing is held, nothing to withdraw.
CAROUSEL: when your gateway publishes a block, its finder keeps 99% and PyBLØCK takes 1% — with your own node there is no separate node-runner cut, it is all yours. Until then you earn nothing: solo is solo.
CHIRP: every block found by any member pays every eligible member by standing (7-day tenure + 24h power) — 100% to the syndicate, 0% PyBLØCK. Your miners join the registry with their first accepted share.
WAVICLES: every block pays the whole work window (8 × network difficulty) by work done — 100% to the window, 0% PyBLØCK. Minimum 1,000 sats accrued; below that your share is spread over the miners who clear it, never to the pool.
How you know it worked: your address shows up on its own page — hashrate, workers, and every coinbase output it received.
That is the whole setup. The pool never holds a sat: the block’s finder pays you directly, in the block. Keep gateway.key and your config backed up — they are your gateway’s identity.
No node yet? Start today anyway
Mine through PyBLØCK’s node while you set yours up. Same products, same payout rules — the block is just built by our node and submitted by our gateway instead of yours. Every port and the three fields are on the start page.
On WAVICLES and CHIRP that path is 0% fee too (CAROUSEL keeps its split). Your own node is still the better way: you build the block, and more independent templates keep the chain decentralized.