Getting Started for Developers
Welcome to OpenMina development! This guide will help you set up your development environment and build OpenMina from source.
Prerequisites
System Requirements
- Operating System: Officially supported platforms (build tested in CI):
- Ubuntu 22.04 LTS
- Ubuntu 24.04 LTS (x86_64 and ARM64)
- macOS (latest)
- Other Linux distributions may work but are not officially supported
- Note: While we test compilation on all platforms, the full test suite is only run on ubuntu-22.04 (for GLIBC compatibility with container tests)
- Memory: At least 8GB RAM (16GB recommended)
- Storage: At least 20GB free space
- Network: Stable internet connection for downloading dependencies
Required Tools
1. Rust Toolchain
OpenMina requires both stable and nightly Rust toolchains, plus additional tools for development:
# Install rustup (Rust toolchain installer)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
# Source cargo environment
source ~/.cargo/env
# Install Rust 1.84 (as specified in rust-toolchain.toml)
rustup install 1.84
rustup default 1.84
# Install nightly toolchain (required for some components)
rustup install nightly
# Add required components for Rust 1.84
rustup component add rustfmt clippy --toolchain 1.84
# Add required components for nightly
rustup component add rustfmt clippy rust-src --toolchain nightly
# Install taplo (TOML formatter, required for `make format`)
cargo install taplo-cli --locked
This installs:
- Rust 1.84 (stable) and nightly toolchains
- Required components:
rustfmt
,clippy
,rust-src
taplo-cli
: TOML formatter required formake format
2. System Dependencies
- Linux (Ubuntu/Debian)
- macOS
sudo apt update
sudo apt install -y \
build-essential \
libssl-dev \
pkg-config \
protobuf-compiler \
sqlite3 \
git \
curl \
shellcheck
# Install Homebrew if not already installed
if ! command -v brew &> /dev/null; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Install system dependencies
brew install \
openssl \
pkg-config \
protobuf \
sqlite \
git \
curl \
shellcheck
3. Additional Development Tools
Node.js (for documentation and frontend):
- Linux (Ubuntu/Debian)
- macOS
# Install Node.js (version 18+ recommended)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Install Node.js (version 18+ recommended) via Homebrew
brew install node@18
# Link Node.js if needed
brew link node@18
Docker (optional, for containerized builds):
- Linux (Ubuntu/Debian)
- macOS
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Clean up
rm get-docker.sh
# Install Docker Desktop for Mac
# Note: This requires manual download and installation
echo "Docker Desktop for Mac needs to be installed manually."
echo "Please download it from: https://www.docker.com/products/docker-desktop/"
echo "Alternatively, you can use Homebrew Cask:"
echo "brew install --cask docker"
# Install Docker via Homebrew Cask (user will need to start Docker Desktop manually)
brew install --cask docker
4. WASM Tools (for web node development)
# Install wasm-pack for WebAssembly builds
cargo install wasm-pack
# Install wasm-bindgen CLI tool for generating WebAssembly bindings
cargo install -f wasm-bindgen-cli --version 0.2.99
# Add WebAssembly target
rustup target add wasm32-unknown-unknown
Clone and Build OpenMina
1. Clone the Repository and Build
git clone https://github.com/o1-labs/openmina.git
cd openmina
# Download required circuits
echo "Downloading required circuits..."
make download-circuits
# Build in debug mode (faster compilation, slower runtime)
echo "Building OpenMina in debug mode..."
make build
2. Specialized Builds
For more advanced builds including release mode, WebAssembly, and specialized components:
# Build in release mode (slower compilation, faster runtime)
echo "Building in release mode..."
make build-release
# Build ledger components (requires nightly Rust)
echo "Building ledger components..."
make build-ledger
# Build WebAssembly node for browser
echo "Building WebAssembly node..."
make build-wasm
# Build testing framework with scenario generators
echo "Building testing framework..."
make build-testing
# Build VRF (Verifiable Random Function) components
echo "Building VRF components..."
make build-vrf
3. Run Tests
You can run a different set of tests. The command make help
will give you the
whole set of targets. You can also visit the file
ci.yaml
to explore the targets used for testing in our continuous integration
environment.
Development Workflow
Code Quality and Formatting
OpenMina maintains strict code quality standards:
# Set up SQLite database for heartbeats processor (required for make check/lint)
echo "Setting up SQLite database for heartbeats processor..."
sqlite3 /tmp/heartbeats.db < tools/heartbeats-processor/schema.sql
export DATABASE_URL="sqlite:///tmp/heartbeats.db"
# Format code (required before commits)
echo "Formatting code..."
make format
# Check formatting
echo "Checking code formatting..."
make check-format
# Run linter (clippy)
echo "Running linter..."
make lint
# Fix trailing whitespaces (mandatory before commits)
echo "Fixing trailing whitespaces..."
make fix-trailing-whitespace
# Check for trailing whitespaces
echo "Checking for trailing whitespaces..."
make check-trailing-whitespace
Working with Makefiles
The project's Makefile provides many helpful commands. View all available targets:
make help
Common development targets include:
# Basic builds
make build # Debug build for development
make build-release # Optimized build for production
make check # Check code without building
# Testing
make test # Run test suite
make test-release # Run tests in release mode
# Code quality
make format # Format all code
make lint # Run static analysis
make clean # Clean build artifacts
Environment Configuration
Some components require environment variables and database setup:
SQLite Database (Required for make check
)
The heartbeats processor requires an SQLite database to be initialized before
running make check
:
# Create the SQLite database with required schema
sqlite3 /tmp/heartbeats.db < tools/heartbeats-processor/schema.sql
# Set the database URL environment variable
export DATABASE_URL="sqlite:///tmp/heartbeats.db"
Additional Environment Variables
# For archive node development
export OPENMINA_ARCHIVE_ADDRESS="http://localhost:3007"
export PG_USER="openmina"
export PG_PW="openminaopenmina"
export PG_DB="openmina_archive"
Architecture Overview
For detailed information about OpenMina's architecture, Redux-style state machine pattern, and component organization, please see the Architecture Documentation.
Running OpenMina
Basic Node
# Run a basic node (after building)
./target/release/openmina node --network devnet
Archive Node
# Set up PostgreSQL database
make postgres-setup
# Run archive node
make run-archive
Development Server
For web development with the frontend:
# Build and serve documentation
make docs-serve
# The documentation will be available at http://localhost:3000
Debugging and Development Tools
Logging
OpenMina uses structured logging with different levels:
# Set log level
export RUST_LOG=debug
# Run with verbose logging
RUST_LOG=trace ./target/release/openmina node --network devnet
Frontend Development
The project includes a web-based dashboard:
# Build and run frontend (see frontend/README.md for details)
cd frontend
npm install
npm start
Testing Framework
OpenMina includes a comprehensive testing framework:
# Build testing binary
make build-testing
# Run specific test scenarios
./target/release/openmina-node-testing --help
Next Steps
- Explore the Codebase: Start with Architecture Documentation
- Run Tests: Ensure your setup works by running
make test
- Join the Community: Connect with other developers on Discord and participate in discussions on the Mina Protocol Forums
- Read CLAUDE.md: Check the project-specific development guide in the root directory
Getting Help
- Documentation: https://o1-labs.github.io/openmina/
- Discord: OpenMina Community
- Forums: Mina Protocol Forums
- Issues: GitHub Issues
- API Docs: Rust Documentation
Welcome to the OpenMina development community! 🎉