This guide sets up a Musashi testnet stake pool on a Dingo node, in two sections:
Dingo Node Setup.
Musashi Testnet Pool Registration.
⚠️ Musashi is the Leios prototype testnet. It is reset (respun) from time to time, and each respin needs a Dingo release that ships the new Musashi configuration. Check the Dingo Release Notes for Musashi compatibility before you start.
Musashi needs the cardano-cli from the Leios prototype release that matches the network. Find the network’s version in the MinNodeVersion field of the Musashi config.json. For example, 11.1.0.164-prototype-2026w42 matches the rc-2026w42 release on the ouroboros-leios releases page.
Make a directory and move into it:
mkdir -p "$DINGO_HOME/cli" && cd "$DINGO_HOME/cli"
The Leios release names its Linux builds x86_64 and aarch64. Set the release tag and your architecture, then download the archive and its checksum:
Dingo ships with embedded Cardano network configurations (genesis files and config.json) for Musashi, so it does not need them to run. cardano-cli needs the Shelley genesis file later in this guide, and Dingo needs a topology file.
Create the config directory and download the files:
mkdir -p "$DINGO_HOME/config" && cd "$DINGO_HOME/config"
Replace the RELAY_* placeholders with the addresses and ports you copied from Kleioscan, and set valency to the number of relays you added. Leave the rest of the file as downloaded; useLedgerAfterSlot changes when the network is respun.
Create the configuration directory and the database directory:
sudo mkdir -p /etc/dingo
mkdir -p $DINGO_HOME/.dingo
Create the dingo.yaml file:
The $DINGO_HOME variable will automatically expand to your home directory path.
sudo bash -c "cat <<EOF > /etc/dingo/dingo.yaml
# Global data directory for both blob and metadata storage plugins.
# Can be overridden with CARDANO_DATABASE_PATH or --data-dir.
databasePath: \"$DINGO_HOME/.dingo\"
# Network
network: \"musashi\"
relayPort: 3010
socketPath: \"$DINGO_HOME/dingo.socket\"
# Path to the topology configuration file for Cardano node
topology: \"$DINGO_HOME/config/topology.json\"
# Mempool: 25 MiB, the Leios size. Dingo v0.88.0 keeps the 1 MiB
# default on Musashi, which fills and expires transactions.
plugins:
mempool:
config:
capacity: 26214400
EOF"
💡 The plugins.mempool block raises the mempool from Dingo’s 1 MiB default to 25 MiB, the size Dingo uses for Leios. At 1 MiB the mempool fills on Musashi and transactions expire before they are included.
You can view and verify the dingo.yaml file by running:
Create the payment address and save it to payment.addr:
cardano-cli dijkstra address build \
--payment-verification-key-file payment.vkey \
--stake-verification-key-file stake.vkey \
--out-file payment.addr
Show your payment address and copy it:
cat payment.addr; echo
Go to the Musashi faucet, paste your address into the first form (address), tick its reCAPTCHA box, and submit. The faucet sends 10,000 test ada, which covers the 500 ada pool deposit, the 2 ada stake address deposit, the pledge and the fees.
Confirm the test ada arrived. You should see one UTxO entry:
The metadata URL in your pool registration can be at most 128 characters long. If you already host metadata on your own website, set METADATA_URL to that URL below and skip the GitHub steps. Otherwise, GitHub Pages hosts it for free:
Sign in to GitHub and create a new public repository named pool.
In the repository, select Add file → Upload files, upload your meta.json, and commit it to the main branch.
Open Settings → Pages. Under Build and deployment, set Source to Deploy from a branch, choose the main branch and the / (root) folder, and select Save.
After a minute or two, your metadata is served at https://YOUR_GITHUB_USERNAME.github.io/pool/meta.json.
Set the URL and check that it works and is no longer than 128 characters:
⚠️ Upload the file exactly as cardano-cli hashed it. Editing it on GitHub afterwards changes the hash, so it no longer matches the hash in your registration and wallets and explorers ignore your metadata.
A 1,000 ada pledge is too small for your pool to be selected to forge blocks. The faucet can delegate about 1,000,000 test ada to your pool.
Get your pool ID in bech32 format (pool1…):
cardano-cli dijkstra stake-pool id --output-bech32 --cold-verification-key-file cold.vkey
Go to the Musashi faucet, paste your pool ID into the second form (pool, the lower form in the screenshot in Step 3), tick its reCAPTCHA box, and submit.
The public key under blsKey should match your key. Compare it with your bls.vkey without its 4-character 5860 CBOR prefix:
jq -r .cborHex bls.vkey | cut -c5-
bksRegisteredIn is the epoch your registration takes effect in. cardano-cli reports this epoch because the node does not expose the epoch the key was registered in. Note it: the key expires a fixed number of epochs after it (see Step 15).
💡 See the Musashi Testnet Rewards Program page for details. Pools in the program report telemetry with Metsuke, an agent built for the Haskell cardano-node that reads the node’s Prometheus endpoint and its trace lines.
Restrict the signing keys so only your user can read them. Dingo refuses to load a BLS signing key that group or other users can read:
chmod 600 $DINGO_HOME/keys/*.skey
Replace your dingo.yaml with the block producer configuration, which adds your KES key, VRF key, operational certificate and BLS key to the settings from Section 1:
sudo bash -c "cat <<EOF > /etc/dingo/dingo.yaml
# Global data directory for both blob and metadata storage plugins.
# Can be overridden with CARDANO_DATABASE_PATH or --data-dir.
databasePath: \"$DINGO_HOME/.dingo\"
# Network
network: \"musashi\"
relayPort: 3010
socketPath: \"$DINGO_HOME/dingo.socket\"
# Path to the topology configuration file for Cardano node
BLS keys expire. A key is valid while the current epoch is less than bksRegisteredIn plus the network’s maximum key age, which the testnet announces. After that, your pool keeps its committee seat but cannot vote.
Rotating the key is a re-registration with a new BLS key and all other values unchanged. Rotate well before expiry: the new key takes effect at an epoch boundary.
Create the new key, keeping the old one until the rotation is on-chain:
cd $DINGO_HOME/keys
cardano-cli dijkstra node key-gen-BLS \
--verification-key-file bls-new.vkey \
--signing-key-file bls-new.skey
Build the new registration certificate with the same values as in Step 9. In a new shell, set RELAY_IP and METADATA_URL again first:
Switch Dingo to the new key only after bksRegisteredIn shows the new epoch and the following epoch boundary has passed. Then set leiosVoteSigningKeyFile in /etc/dingo/dingo.yaml to the full path of the new key (print it with echo $DINGO_HOME/keys/bls-new.skey), make it readable only by your user (chmod 600), and restart Dingo with sudo systemctl restart dingo.
Dingo serves Prometheus metrics on 127.0.0.1:12798. To chart them, follow the Grafana dashboards guide and pick musashi in the dashboards’ network selector.
To check from the command line whether your pool is voting:
dingo_metrics_leios_votes_not_emitted_total counts the endorser blocks your node did not vote on, by reason. Until your BLS key is in the on-chain stake snapshot, the count rises under reason="no_key".
Congratulations! You have a Leios Dingo Node running on the Musashi Testnet.