Get started with DATUM

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.
STEP 1Run a BLAKE2b nodeSTEP 2Download and build the gatewaySTEP 3Configure it — point it at our PrimeSTEP 4Run itSTEP 5Register your address (CAROUSEL and CHIRP)STEP 6Point your miners at your gatewaySTEP 7Confirm you are being paid
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 -- chirp YOUR_BTC_ADDRESS
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.
The part of bitcoin.conf that matters here:
server=1 rpcuser=YOUR_RPC_USER rpcpassword=YOUR_RPC_PASSWORD rpcallowip=127.0.0.1 blockreservedweight=100000
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.
bitcoin-cli -rpcport=8342 getblocktemplate '{"rules":["segwit","blake2b"]}'

2Download and build the gateway

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.
Build dependencies (pick your distro):
Debian / Ubuntusudo apt-get update && sudo apt-get install -y git cmake build-essential libcurl4-openssl-dev libjansson-dev libmicrohttpd-dev libsodium-dev pkg-config
Fedora / RHELsudo dnf install -y git cmake gcc gcc-c++ libcurl-devel jansson-devel libmicrohttpd-devel libsodium-devel pkgconf
Archsudo pacman -S --needed git cmake base-devel curl jansson libmicrohttpd libsodium
Clone and build. The binary ends up in 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": { "rpcuser": "YOUR_RPC_USER", "rpcpassword": "YOUR_RPC_PASSWORD", "rpcurl": "127.0.0.1:8342", "work_update_seconds": 40, "notify_fallback": true }, "stratum": { "listen_port": 23334, "max_clients_per_thread": 1024, "max_threads": 4, "max_clients": 4096, "vardiff_min": 1024, "vardiff_target_shares_min": 8, "share_stale_seconds": 120, "fingerprint_miners": true }, "mining": { "pool_address": "YOUR_BLAKE2B_ADDRESS", "coinbase_tag_primary": "PyBLOCK-CHIRP", "coinbase_tag_secondary": "YOUR_NAME", "coinbase_unique_id": 4242, "pow_algorithm": "blake2b" }, "api": { "listen_addr": "127.0.0.1", "listen_port": 7152, "admin_password": "CHOOSE_A_PASSWORD" }, "logger": { "log_to_console": true, "log_to_file": true, "log_file": "chirp.log", "log_rotate_daily": true, "log_level_file": 2 }, "datum": { "pool_host": "b.pyblock.xyz", "pool_port": 28917, "pool_pubkey": "cf995bb5b975ef4b90932f0608c98a033679092e976982621243cd1226803c6417442870dff8372b11363d8f80665b1f298cc23132bf2dab23958a4bcc7d4f72", "key_file": "gateway.key", "pool_pass_workers": true, "pool_pass_full_users": true, "always_pay_self": true, "pooled_mining_only": false, "protocol_global_timeout": 60 } }
{ "bitcoind": { "rpcuser": "YOUR_RPC_USER", "rpcpassword": "YOUR_RPC_PASSWORD", "rpcurl": "127.0.0.1:8342", "work_update_seconds": 40, "notify_fallback": true }, "stratum": { "listen_port": 23334, "max_clients_per_thread": 1024, "max_threads": 4, "max_clients": 4096, "vardiff_min": 1, "vardiff_target_shares_min": 8, "share_stale_seconds": 120, "fingerprint_miners": true }, "mining": { "pool_address": "YOUR_BLAKE2B_ADDRESS", "coinbase_tag_primary": "PyBLOCK-WAVICLES-BLAKE2b", "coinbase_tag_secondary": "YOUR_NAME", "coinbase_unique_id": 4242, "pow_algorithm": "blake2b" }, "api": { "listen_addr": "127.0.0.1", "listen_port": 7152, "admin_password": "CHOOSE_A_PASSWORD" }, "logger": { "log_to_console": true, "log_to_file": true, "log_file": "wavicles.log", "log_rotate_daily": true, "log_level_file": 2 }, "datum": { "pool_host": "b.pyblock.xyz", "pool_port": 28915, "pool_pubkey": "b5e0b0326b964a92f3046c73a76b9e98173e0c3ea0e0ca771f4e6a3dd92e2935b2caad2a088fdd7bf0a48fc0c41776a9abb13c7d4c6964b53a9ceee4c775e036", "key_file": "gateway.key", "pool_pass_workers": true, "pool_pass_full_users": true, "always_pay_self": true, "pooled_mining_only": true, "protocol_global_timeout": 60 } }
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 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-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
sudo systemctl daemon-reload && sudo systemctl enable --now pyblock-gateway-chirp journalctl -u pyblock-gateway-chirp -f
sudo systemctl daemon-reload && sudo systemctl enable --now pyblock-gateway-wavicles journalctl -u pyblock-gateway-wavicles -f
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.
Something else in the log? The troubleshooting table maps each line to its cause.

5Register your address (CAROUSEL and CHIRP)

WAVICLES needs no registration: your identity in the work window is pool_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
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.
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.