Quick Start Guide
A Cardano blockchain data node written in Go which actively participates in network communications on the Cardano blockchain using the Ouroboros Network Node-to-Node family of mini-protocols.
⚠️ This is a work in progress and is currently under heavy development
For this guide we will walk you through downloading the Dingo binary and all the steps necessary to get the Dingo node running on the Cardano Preview network. To get started follow the steps below.
✅ This guide assumes typical Linux setup. Please adjust commands and paths as needed.
Step 1 - Download Dingo Binary
Section titled “Step 1 - Download Dingo Binary”Download the latest release from the Dingo releases page.
⚠️ Adjust the version and architecture to match your system.
mkdir -p ~/dingocd ~/dingowget https://github.com/blinklabs-io/dingo/releases/download/v0.46.0/dingo-v0.46.0-linux-amd64.tar.gz -O - | tar -xzYou can verify the binary works by running:
./dingo versionStep 2 - Create dingo.yaml Configuration File
Section titled “Step 2 - Create dingo.yaml Configuration File”Dingo ships with embedded Cardano network configurations (genesis files, config.json) for preview, preprod, and mainnet. You do not need to download them separately.
Create a dingo.yaml file in your dingo directory. The $HOME variable will automatically expand to your home directory path:
cat <<EOF > ~/dingo/dingo.yaml# Databasedatabase: blob: plugin: "badger" badger: block-cache-size: 0 compression: false data-dir: "$HOME/dingo/.dingo/badger" gc: true index-cache-size: 0 metadata: plugin: "sqlite" sqlite: data-dir: "$HOME/dingo/.dingo/metadata.db"databasePath: "$HOME/dingo/.dingo"
# Mempool# `mempoolCapacity` is an optional override, not a required setting.# Default: 1 MiB for Praos mode and normal serve mode, and 25 MiB for Leios mode.# Leave the key commented or omit it to use the mode default.# mempoolCapacity: 1048576
# Mithrilmithril: aggregatorUrl: "" cleanupAfterLoad: true enabled: true verifyCertificates: true
# NetworkbindAddr: "0.0.0.0"metricsPort: 12798debugPort: 0network: "preview"privateBindAddr: "127.0.0.1"privatePort: 3002relayPort: 3001socketPath: "$HOME/dingo/dingo.socket"
# StorageblockfrostPort: 0meshPort: 0storageMode: "core"utxorpcPort: 0barkBaseUrl: ""barkPort: 0barkPrunerFrequency: 1hEOF📝 For simple setups, keep
database.metadata.plugin: "sqlite"as the default path. Onv0.46.4and newer, operators can expect smoother metadata handling with SQLite during bootstrap and normal use.
📝 If an environment uses
mysqlorpostgresqlfor metadata,v0.46.4and newer bootstrap correctly from genesis on networks and devnets whose Shelley or Conway genesis already includes pools, delegations, or DReps. This matters for preview, preprod, sanchonet, and custom devnets, while mainnet usually did not expose this issue.
📝 On
v0.46.4and newer, Dingo now keeps bootstrap state more consistent acrosssqlite,mysql, andpostgresqlduring restart, rollback, and repeated bootstrap runs. This makes resumed bootstrap runs safer for genesis origin governance state. A documented Shelley genesis stake delegation rollback limitation still remains.
📝 Leave
debugPortset to0unless profiling is required.debugPortcontrols an optional pprof listener, stays separate frommetricsPort, and remains disabled at0.
📝 Bark now derives its near tip safety window from the current ledger state. Do not look for or set a manual
barkSecurityWindowvalue in this configuration.
💡 To serve Blockfrost compatible HTTP endpoints, switch
storageModeto an API capable setting and assign a non zeroblockfrostPort.
blockfrostPort: 3000storageMode: "api"utxorpcPort: 0💡 Setting
block-cache-sizeandindex-cache-sizeto 0 withcompression: falseuses OS page cache (mmap) instead of BadgerDB’s internal caches. This dramatically reduces memory usage.
Step 3 - Open Ports
Section titled “Step 3 - Open Ports”We will cover how to add UFW firewall rules for the ports Dingo needs.
💡 Tip: UFW stands for Uncomplicated Firewall and is used for managing iptables (netfilter) firewall rules.
To see which ports are currently open:
sudo ufw status numberedAdd Port 3001 for Ouroboros Node to Node (NtN) Communication
Section titled “Add Port 3001 for Ouroboros Node to Node (NtN) Communication”sudo ufw allow 3001/tcpStep 4 - Bootstrap from Mithril Snapshot
Section titled “Step 4 - Bootstrap from Mithril Snapshot”Dingo has a built-in Mithril client that downloads and loads a snapshot automatically. This saves hours of sync time compared to replaying the chain from genesis.
Run the following command from your dingo directory:
cd ~/dingo./dingo mithril sync --config ~/dingo/dingo.yamlDingo will:
- Download the latest Mithril snapshot for your configured network
- Verify the certificate chain
- Load the snapshot into the database
This takes approximately 10-15 minutes depending on your system and network speed.
📝 On
v0.46.4and newer,./dingo mithril syncexposes dedicated Prometheus progress metrics on the configuredmetricsPortwhile the command runs. Scrape themetricsPortvalue from this guide’s configuration example to monitor download, ledger import, ImmutableDB copy, gap processing, and completion.
📝 If you skip this step, Dingo will sync from genesis when started, which takes significantly longer.
Step 5 - Start Dingo
Section titled “Step 5 - Start Dingo”Once the Mithril snapshot has loaded, start the node:
cd ~/dingo./dingo serve --config ~/dingo/dingo.yamlYou should see log output showing the node connecting to peers and syncing the remaining blocks to reach the chain tip.
Interested in using a systemd service to run a Dingo Node to maximize the uptime by automatically restarting the Dingo node when the computer reboots?
Section titled “Interested in using a systemd service to run a Dingo Node to maximize the uptime by automatically restarting the Dingo node when the computer reboots?”See our guide on how to create a startup service for Dingo.