Consensus Proof of Stake
Bond 10 DOLI
Explorer Live ↗ Source GitHub ↗
Deterministic Ordering through Linear Iterations
Producer Guide
From zero to block producer in seven steps
Low-cost friendly. A basic VPS with 2 cores, 2 GB RAM, and 20 GB SSD — available from most providers for around $4/month — is all you need to run a full producer node.
Already running a node? Click to see upgrade instructions
$ sudo doli upgrade
Downloads the latest release, replaces binaries, and restarts your node. Your wallet and chain data are preserved. If your node is on a previous chain (pre-v5.2), run sudo doli snap after upgrading to sync the new chain.
Requirements — click to expand
ComponentMinimum
OSUbuntu 22.04+, Debian 12+, macOS 13+, Windows 10+
CPU2 cores
RAM2 GB
Disk20 GB SSD
NetworkPort 30300/tcp open inbound
Stake10 DOLI per bond
This is all you need. Copy, paste, done.
Complete setup
Prepare
0 Remove previous installation (recommended)
$ sudo doli service stop 2>/dev/null; sudo rm -f /usr/bin/doli /usr/bin/doli-node
1 Install
$ curl -sSfL https://doli.network/install.sh | sudo sh
2 Create wallet + BLS key
$ doli init
Run
3 Start the node
$ sudo doli service install
4 Verify your node is synced
$ doli chain
Earn
5 Claim your DOLI airdrop

Join DOLI Discord and mention @dolifather or @isudoajl

6 Verify you received the DOLI
$ doli balance
7 Register as producer
$ doli producer register --bonds 1
Permission model. Wallet commands (doli send, doli balance) never need sudo. System commands (doli service install, doli upgrade, doli snap) do. Everything else just works.
Step-by-step details — click to expand

02 Install

One command. Downloads the latest release, installs both binaries, creates the doli system user, and sets up standard directories, creates the doli system user and standard directories.

$ curl -sSfL https://doli.network/install.sh | sudo sh

Windows (PowerShell as Administrator):

irm https://doli.network/install.ps1 | iex

After installation, log out and back in so your user picks up the doli group membership. Then verify:

Run doli init as your own user, not as root. The installer creates a doli system user and places the service wallet at /var/lib/doli/mainnet/. From a root shell, doli init writes to /root/.doli/ instead, and the service never finds your keys. Log out of root before step 2.
$ doli --version
$ doli-node --version
BinaryPathPurpose
doli/usr/bin/doliCLI: wallet, producer ops, snap sync, upgrade
doli-node/usr/bin/doli-node (Linux), /usr/local/bin/doli-node (macOS), C:\Program Files\DOLI\doli-node.exe (Windows)Node daemon

03 Create wallet

doli init creates your wallet and BLS attestation key in a single step. No separate add-bls command needed.

$ doli init
Write down the 24-word seed phrase immediately. It is shown exactly once. If you lose both the wallet file and these words, your DOLI is gone forever.

Check your address and balance:

$ doli info
$ doli balance

If you already have a seed phrase, restore instead:

$ doli restore

04 Sync with the network

Before starting your node, sync with the network. doli snap downloads a verified state snapshot so your node starts at the current chain tip instead of replaying every block from genesis.

$ sudo doli snap
How it works. doli snap queries multiple seed nodes, verifies that at least 2/3 agree on the same state root, downloads the snapshot from a trusted source, and writes it to your data directory. Your wallet and keys are preserved.

Alternatively, you can sync block-by-block from genesis (slower, but verifies every block):

# Full sync from genesis (optional — takes longer)
$ doli-node run --yes

05 Start the node

Install the system service so the node runs persistently and starts on boot:

$ sudo doli service install

This:

  1. Creates a systemd unit (Linux) or launchd plist (macOS)
  2. Enables auto-start on boot
  3. Starts the node

Check that your node is running:

$ doli service status
$ doli service logs
$ doli chain

06 Register as producer

Once your node is synced, you need 10 DOLI to register. Follow these steps:

  1. Run doli chain and doli info to get your node status and address
  2. Join the DOLI Discord and mention @dolifather or @isudoajl to claim your DOLI airdrop
  3. Wait for your airdrop to be processed
  4. Verify: doli balance (should show 10.01 DOLI)
  5. Register: doli producer register --bonds 1
Make sure your node is fully synced before requesting your airdrop. Share your doli chain and doli info output in Discord so we can verify your node.
# Verify your balance first
$ doli balance

# Register with 1 bond (10 DOLI)
$ doli producer register --bonds 1

Registration activates at the next epoch boundary (~1 hour max). Check status:

$ doli producer status

07 Bond stacking

More bonds = more epoch rewards. All producers get equal block assignments (round-robin); bonds only affect reward distribution. Each bond costs 10 DOLI.

# Add 5 more bonds (50 DOLI)
$ doli producer add-bond --count 5

# View bond details
$ doli producer bonds

# Preview withdrawal penalties (dry run)
$ doli producer simulate-withdrawal --count 2

# Withdraw 2 bonds
$ doli producer request-withdrawal --count 2
Vesting. Bonds vest over 4 years. Early withdrawal incurs a penalty: 75% in year 1, 50% in year 2, 25% in year 3, 0% after year 4. Oldest bonds are withdrawn first (FIFO). Withdrawn funds have a 7-day delay.

08 Firewall

Linux UFW

$ sudo ufw allow 30300/tcp comment 'DOLI P2P'

Linux firewalld

$ sudo firewall-cmd --permanent --add-port=30300/tcp && sudo firewall-cmd --reload

macOS

macOS firewall is off by default. If enabled: System Settings → Network → Firewall → Options → allow doli-node.

Do not expose port 8500 to the internet. The RPC interface is unauthenticated. Use an SSH tunnel for remote access.

09 Upgrade

$ sudo doli upgrade

Downloads the latest release, replaces both binaries, and restarts the node. Or re-run the install script:

$ curl -sSfL https://doli.network/install.sh | sudo sh

Windows (PowerShell as Administrator):

irm https://doli.network/install.ps1 | iex
FlagDescription
--version <V>Target a specific version
--yesSkip confirmation prompt
--service <NAME>Restart a specific service (multi-node)

10 Command reference

Wallet

CommandDescription
doli initCreate wallet + BLS key
doli infoAddress, public key, BLS key
doli balanceSpendable, bonded, total
doli send <doli1...> <amount>Send DOLI (bech32 address only)
doli historyTransaction history
doli restoreRestore from 24-word seed

Producer

CommandDescription
doli producer register --bonds NRegister with N bonds (10 DOLI each)
doli producer statusYour registration and bond info
doli producer bondsPer-bond vesting details
doli producer add-bond --count NStake N more bonds
doli producer request-withdrawal --count NWithdraw N bonds (FIFO)
doli producer simulate-withdrawal --count NPreview penalties (dry run)
doli producer listAll network producers
doli producer exitLeave the producer set

Node & service

CommandDescription
sudo doli service installInstall, enable, and start the node
doli service statusService status
doli service logsTail node logs
doli service restartRestart the node
doli service stopStop the node
sudo doli snapFast-sync from verified snapshot
doli chainCurrent height, epoch, hash
sudo doli upgradeUpgrade to latest release

11 Snap sync reference

doli snap downloads a verified state snapshot from the seed network. It queries multiple seeds, verifies 2/3 consensus on the state root, and applies the snapshot. Your node is at the chain tip in seconds.

# Standard (queries all mainnet seeds)
$ sudo doli snap

# Testnet
$ sudo doli snap -n testnet

# Custom seed
$ sudo doli snap --seed http://192.168.1.50:8500
FlagDescription
-n mainnet|testnetNetwork (default: mainnet)
--data-dir <PATH>Custom data directory
--seed <URL>Custom seed RPC (repeatable)
--no-restartSkip service stop/restart
--trustTrust single seed without consensus
Safe by default. Snap sync preserves your wallet, keys, and configuration. Only chain data is replaced.

12 Troubleshooting

Node stuck, forked, or not syncing

$ sudo doli snap

This resets your node to the current network state. Works every time.

Node won't start

$ doli service logs # check error
$ ls -la /usr/bin/doli* # binaries exist?
$ sudo doli snap # reset state
$ doli service restart

Version mismatch

$ sudo doli upgrade --yes

Service fails to start with exit 0 (start-limit-hit)

Symptom: systemctl status doli-mainnet shows Active: failed (Result: start-limit-hit) with code=exited, status=0/SUCCESS repeating. The node starts, exits cleanly without error, systemd restarts it, loop, five times, systemd gives up.

Most common cause: data directory empty or corrupted, node can't locate chain state, exits cleanly expecting a snap sync. Fix:

$ sudo systemctl reset-failed doli-mainnet
$ sudo doli snap --yes
$ sudo systemctl start doli-mainnet

If it still exit-loops after snap, check for a stuck pending update:

$ sudo rm -f /var/lib/doli/mainnet/pending_update.json
$ sudo systemctl reset-failed doli-mainnet
$ sudo systemctl start doli-mainnet

Nuclear: full reset

Use this in order. Do not skip doli snap — starting with an empty data directory and no snapshot leads to the exit-0 loop above.

$ sudo doli service stop
$ sudo doli wipe --yes
$ sudo doli snap --yes
$ sudo doli service start
Wipe preserves your wallet and keys. Only chain data is deleted. You do not need to re-register after a wipe. The preserved files are wallet.json, wallet.seed.txt, node_key, .env, and config.toml.
Do not rm -rf your data directory. sudo rm -rf /var/lib/doli/mainnet/* destroys your wallet and private keys. Use sudo doli wipe --yes — it preserves keys by design.

Fresh start (reinstall)

If you want to start completely fresh — new install, same wallet:

$ sudo doli service stop
$ curl -sSfL https://doli.network/install.sh | sudo sh
$ sudo doli snap
$ sudo doli service install
macOS permission fix. If doli balance fails with "Cannot connect" after snap, fix file ownership:
$ sudo chown -R $(whoami) ~/.doli/
$ doli service restart
This happens because sudo doli snap creates files as root but the node runs as your user.

doli wipe says "Data directory does not exist"

If your layout is non-standard (e.g. data lives in /var/lib/doli/mainnet but you ran doli wipe as root, which defaults to /root/.doli/mainnet), pass --data-dir explicitly:

$ sudo systemctl cat doli-mainnet | grep data-dir  # find your actual path
$ sudo doli wipe --network mainnet --data-dir /var/lib/doli/mainnet --yes

13 Directory layout

You never need to think about these. The CLI and node find everything automatically. Override any path with --data-dir, -w, or the environment variables below.

Linux

ItemPath
Wallet/var/lib/doli/mainnet/wallet.json
Chain data/var/lib/doli/mainnet/state_db/
Logs/var/log/doli/mainnet.log
Service file/etc/systemd/system/doli-mainnet.service

macOS

ItemPath
Wallet~/Library/Application Support/doli/mainnet/wallet.json
Chain data~/Library/Application Support/doli/mainnet/state_db/
Logs~/Library/Logs/doli/mainnet.log
Plist~/Library/LaunchAgents/network.doli.mainnet.plist

Environment variables

VariableEffect
DOLI_DATA_DIROverride base data directory
DOLI_WALLET_FILEOverride wallet path
DOLI_RPC_URLOverride RPC endpoint