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
| Component | Minimum |
|---|---|
| OS | Ubuntu 22.04+, Debian 12+, macOS 13+, Windows 10+ |
| CPU | 2 cores |
| RAM | 2 GB |
| Disk | 20 GB SSD |
| Network | Port 30300/tcp open inbound |
| Stake | 10 DOLI per bond |
$ sudo doli service stop 2>/dev/null; sudo rm -f /usr/bin/doli /usr/bin/doli-node
$ curl -sSfL https://doli.network/install.sh | sudo sh
$ doli init
$ sudo doli service install
$ doli chain
Join DOLI Discord and mention @dolifather or @isudoajl
$ doli balance
$ doli producer register --bonds 1
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:
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
| Binary | Path | Purpose |
|---|---|---|
| doli | /usr/bin/doli | CLI: 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
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
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:
- Creates a systemd unit (Linux) or launchd plist (macOS)
- Enables auto-start on boot
- 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:
- Run
doli chainanddoli infoto get your node status and address - Join the DOLI Discord and mention @dolifather or @isudoajl to claim your DOLI airdrop
- Wait for your airdrop to be processed
- Verify:
doli balance(should show 10.01 DOLI) - Register:
doli producer register --bonds 1
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
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.
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
| Flag | Description |
|---|---|
| --version <V> | Target a specific version |
| --yes | Skip confirmation prompt |
| --service <NAME> | Restart a specific service (multi-node) |
10 Command reference
Wallet
| Command | Description |
|---|---|
| doli init | Create wallet + BLS key |
| doli info | Address, public key, BLS key |
| doli balance | Spendable, bonded, total |
| doli send <doli1...> <amount> | Send DOLI (bech32 address only) |
| doli history | Transaction history |
| doli restore | Restore from 24-word seed |
Producer
| Command | Description |
|---|---|
| doli producer register --bonds N | Register with N bonds (10 DOLI each) |
| doli producer status | Your registration and bond info |
| doli producer bonds | Per-bond vesting details |
| doli producer add-bond --count N | Stake N more bonds |
| doli producer request-withdrawal --count N | Withdraw N bonds (FIFO) |
| doli producer simulate-withdrawal --count N | Preview penalties (dry run) |
| doli producer list | All network producers |
| doli producer exit | Leave the producer set |
Node & service
| Command | Description |
|---|---|
| sudo doli service install | Install, enable, and start the node |
| doli service status | Service status |
| doli service logs | Tail node logs |
| doli service restart | Restart the node |
| doli service stop | Stop the node |
| sudo doli snap | Fast-sync from verified snapshot |
| doli chain | Current height, epoch, hash |
| sudo doli upgrade | Upgrade 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
| Flag | Description |
|---|---|
| -n mainnet|testnet | Network (default: mainnet) |
| --data-dir <PATH> | Custom data directory |
| --seed <URL> | Custom seed RPC (repeatable) |
| --no-restart | Skip service stop/restart |
| --trust | Trust single seed without consensus |
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
wallet.json, wallet.seed.txt, node_key,
.env, and config.toml.
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
doli balance fails with
"Cannot connect" after snap, fix file ownership:
$ sudo chown -R $(whoami) ~/.doli/ $ doli service restartThis 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
| Item | Path |
|---|---|
| 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
| Item | Path |
|---|---|
| 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
| Variable | Effect |
|---|---|
| DOLI_DATA_DIR | Override base data directory |
| DOLI_WALLET_FILE | Override wallet path |
| DOLI_RPC_URL | Override RPC endpoint |