Quick Start

Quick Start

Get an UltraDAG node running in under 5 minutes. This guide covers building from source, running a single node, spinning up a local testnet, and making your first RPC calls.


Download Pre-Built Binary

The fastest way to get started. Pre-built binaries are available for Linux and macOS.

Linux (x86_64)

curl -L https://github.com/UltraDAGcom/core/releases/download/latest/ultradag-node-linux-x86_64.tar.gz | tar xz
chmod +x ultradag-node-linux-x86_64
./ultradag-node-linux-x86_64 --port 9333

macOS (Apple Silicon)

curl -L https://github.com/UltraDAGcom/core/releases/download/latest/ultradag-node-macos-arm64.tar.gz | tar xz
chmod +x ultradag-node-macos-arm64
./ultradag-node-macos-arm64 --port 9333

macOS (Intel)

curl -L https://github.com/UltraDAGcom/core/releases/download/latest/ultradag-node-macos-x86_64.tar.gz | tar xz
chmod +x ultradag-node-macos-x86_64
./ultradag-node-macos-x86_64 --port 9333

To validate (produce blocks and earn UDAG):

./ultradag-node-linux-x86_64 --port 9333 --validate
No download needed? Build from source
If you prefer to compile yourself or need a different target, see the build instructions below.

Prerequisites (for building from source)

You need a working Rust toolchain (1.75+):

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update stable

Verify your installation:

rustc --version   # 1.75.0 or newer
cargo --version
No Rust? Use Docker
If you prefer not to install Rust, see the Docker Guide for container-based deployment.

Build from Source

Clone the repository and build the node binary:

git clone https://github.com/UltraDAGcom/core.git ultradag
cd ultradag
cargo build --release -p ultradag-node

The binary is at target/release/ultradag-node (< 2 MB). You can copy it anywhere:

cp target/release/ultradag-node /usr/local/bin/

Run a Single Node

Start a standalone validator node:

cargo run --release -p ultradag-node -- --port 9333 --validate

This will:

  1. Generate a fresh Ed25519 keypair
  2. Start the P2P listener on port 9333
  3. Start the RPC server on port 10333 (P2P port + 1000)
  4. Begin producing DAG vertices as a solo validator
Solo mode
A single validator will finalize immediately since it constitutes 100% of the validator set. This is useful for local development but not representative of production finality timing.

You should see output like:

[INFO] UltraDAG node starting on port 9333
[INFO] RPC server listening on 0.0.0.0:10333
[INFO] Validator mode enabled
[INFO] Generated keypair: address=a1b2c3...
[INFO] Round 1: produced vertex abc123...
[INFO] Round 1: finalized 1 vertices

Run a Local Testnet

For a more realistic setup, run a 4-node local testnet:

#!/bin/bash
# run-local-testnet.sh

# Start 4 validator nodes
cargo run --release -p ultradag-node -- --port 9333 --validate --validators 4 --testnet &
cargo run --release -p ultradag-node -- --port 9334 --validate --validators 4 --seed 127.0.0.1:9333 --testnet &
cargo run --release -p ultradag-node -- --port 9335 --validate --validators 4 --seed 127.0.0.1:9333 --testnet &
cargo run --release -p ultradag-node -- --port 9336 --validate --validators 4 --seed 127.0.0.1:9333 --testnet &

echo "Testnet running. RPC ports: 10333, 10334, 10335, 10336"
echo "Press Ctrl+C to stop all nodes"
wait

Make it executable and run:

chmod +x run-local-testnet.sh
./run-local-testnet.sh
Seed peers
The --seed flag specifies peer addresses (host:port) for the node to connect to on startup. The first node starts without --seed and subsequent nodes connect to it.

Connect to the Public Testnet

To join the live 5-node testnet on Fly.io:

cargo run --release -p ultradag-node -- \
  --port 9333 \
  --testnet

The node will automatically discover and connect to bootstrap nodes. Omit --validate to run as an observer (no staking required).


Basic RPC Calls

With a node running (RPC on port 10333 by default), try these commands:

Check Node Status

curl http://localhost:10333/status
{
  "dag_round": 42,
  "last_finalized_round": 40,
  "peers": 3,
  "total_supply": 1050042000000000
}

Generate a Keypair

curl http://localhost:10333/keygen
{
  "address": "e7f8a9b0c1d2...",
  "secret_key": "9f8e7d6c5b4a..."
}
Testnet only
The /keygen endpoint returns private keys in plaintext. This is a testnet convenience — on mainnet, generate keys client-side using an SDK.

Get Testnet UDAG from Faucet

curl -X POST http://localhost:10333/faucet -H "Content-Type: application/json" -d '{"address":"e7f8a9b0c1d2...","amount":10000000000}'
{
  "tx_hash": "abc123...",
  "amount": 10000000000,
  "message": "Sent 100 UDAG to e7f8a9b0c1d2..."
}

Check Balance

curl http://localhost:10333/balance/e7f8a9b0c1d2...
{
  "address": "e7f8a9b0c1d2...",
  "balance": 100000000000,
  "nonce": 0,
  "staked": 0,
  "delegated": 0
}

Send a Transaction

curl -X POST http://localhost:10333/tx \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "9f8e7d6c5b4a...",
    "to": "1a2b3c4d5e6f...",
    "amount": 50000000000,
    "fee": 10000
  }'
{
  "tx_hash": "def456...",
  "status": "accepted"
}
Testnet signing
The /tx endpoint accepts secret_key for testnet convenience. For mainnet, sign transactions client-side and submit via /tx/submit. See Transaction Format.

Run the Test Suite

Verify everything works:

cargo test --workspace

This runs all 836 tests across the crates, including consensus simulation, state engine invariants, and P2P protocol tests.


Next Steps

GoalGuide
Deploy with DockerDocker Guide
Become a validatorRun a Validator
Integrate via APIRPC Endpoints
Use an SDKSDKs
Understand the consensusDAG-BFT Consensus