Files
MESH2/docs/specs/MESH-Dev-Environment-Specification.md
anthonyrawlins f2d62fa03d Initial workspace: scaffold + constitution + spec documents
Rust workspace with 5 crates (mesh-types, mesh-crypto, mesh-network,
mesh-validator, mesh-wallet), PROJECT_CONSTITUTION.md for CHORUS
automated ingestion, and the full MESH protocol specification suite.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 20:49:44 +11:00

34 KiB

MESH PROTOCOL

Development Environment Specification

Toolchains, Images, and Setup for VM-Based Development

Version 1.0 | March 2026

1. Overview

This document specifies the complete development environment for the MESH protocol reference implementation. It is designed for a single developer working in a virtual machine environment, using official Docker images and standard package managers wherever possible.

The environment is structured as a primary development VM running Docker, with containerised toolchains for build, test, and formal verification. This ensures reproducibility: any developer on any host OS can recreate the identical environment from this document.

1.1 Host VM Requirements


Requirement Specification

Operating System Ubuntu 24.04 LTS (Noble Numbat), server or desktop edition. This is the reference OS. All commands in this document assume Ubuntu 24.04. Other Linux distributions will work but package names may differ.

Architecture x86_64 (amd64). ARM64 (aarch64) is supported but some Docker images may require emulation. All specified images have amd64 variants.

CPU Minimum: 4 cores. Recommended: 8+ cores. Rust compilation and TLA+ model checking are both CPU-intensive.

RAM Minimum: 8 GB. Recommended: 16 GB. The TLC model checker is a JVM application and benefits from large heap sizes. Rust's linker (mold/lld) also benefits from available RAM.

Disk Minimum: 50 GB free. Recommended: 100 GB. Rust's target/ directory grows quickly. Docker images consume 5--10 GB. The cargo registry cache uses 1--5 GB.

Network Internet access required for initial setup (pulling images, crates). Subsequent development can be done offline if all dependencies are vendored.


1.2 Environment Architecture

The development environment consists of three layers:

  • Layer 1 --- Host VM: Ubuntu 24.04 with Docker Engine, Git, and an editor (VS Code or Neovim). This is where you write code and run docker compose commands.

  • Layer 2 --- Build Container: Official Rust Docker image with additional system dependencies. This is where Rust code compiles. Mounted as a volume so source files live on the host.

  • Layer 3 --- Auxiliary Containers: TLA+ tools, Tamarin Prover, and the multi-validator testnet. These run as separate Docker containers orchestrated by docker compose.

2. Host VM Setup

2.1 Base Packages

Install the following packages on the host VM. These are all available from Ubuntu's default APT repositories.

sudo apt update && sudo apt upgrade -y

sudo apt install -y \

build-essential pkg-config libssl-dev \

git curl wget ca-certificates \

docker.io docker-compose-v2 \

jq tmux htop \

clang lld mold


Package Version Purpose

docker.io ≥24.0 Container runtime. Ubuntu's official Docker package. Alternatively install Docker CE from docker.com --- both work.

docker-compose-v2 ≥2.24 Multi-container orchestration for the testnet and auxiliary tools. Uses the docker compose (v2, no hyphen) syntax.

git ≥2.43 Version control. Standard.

build-essential current GCC, make, libc headers. Needed for some Rust crate build scripts that compile C code.

pkg-config current Helps Rust crates find system libraries (e.g., OpenSSL headers).

libssl-dev current OpenSSL development headers. Required by the quinn QUIC library for TLS 1.3.

clang ≥17 Alternative C/C++ compiler. Some crates prefer clang for cross-compilation.

lld ≥17 LLVM linker. Faster than GNU ld for large Rust binaries.

mold ≥2.4 Even faster linker than lld. Recommended for development builds. Set via .cargo/config.toml.

jq current JSON processor. Useful for parsing benchmark output and test vectors.

tmux current Terminal multiplexer. You will want multiple panes when running 4 validators.


2.2 Docker Post-Install

Add your user to the docker group so you can run Docker without sudo:

sudo usermod -aG docker $USER

newgrp docker # apply group change without logout

docker run hello-world # verify it works

2.3 Rust Toolchain (Host-Native)

While compilation happens inside Docker containers for reproducibility, you will also want a native Rust installation on the host for IDE integration (rust-analyzer), quick cargo check cycles, and running individual tests without the container overhead.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \

--default-toolchain stable \

--profile default \

--component rust-analyzer clippy rustfmt

source "$HOME/.cargo/env"

rustup --version # verify: rustup 1.28+

cargo --version # verify: cargo 1.85+

rustc --version # verify: rustc 1.85+

Pin the Rust version in the project root to ensure all developers and CI use the same compiler:

# In the project root, create rust-toolchain.toml:

[toolchain]

channel = "1.85.0"

components = ["clippy", "rustfmt", "rust-analyzer"]

targets = ["x86_64-unknown-linux-gnu"]

2.4 Cargo Configuration

Create .cargo/config.toml in the project root to set the fast linker and compilation flags:

# .cargo/config.toml

[target.x86_64-unknown-linux-gnu]

linker = "clang"

rustflags = ["-C", "link-arg=-fuse-ld=mold"]

[build]

# Use all available cores for compilation

jobs = 0

[profile.dev]

# Speed up dev builds at the cost of optimisation

opt-level = 0

debug = true

[profile.test]

opt-level = 1 # Some crypto tests are too slow at opt-level 0

[profile.release]

opt-level = 3

lto = "thin"

codegen-units = 1

strip = true

WHY mold?: The default GNU linker (ld) can take 5--15 seconds to link a medium-sized Rust binary. mold reduces this to under 1 second. Over hundreds of compile-test cycles per day, this saves hours of cumulative wait time. It is the single highest-impact developer experience improvement.

2.5 Editor / IDE

Either of the following is fully supported:

  • VS Code + rust-analyzer extension: Install via the Extensions marketplace. rust-analyzer provides inline type hints, go-to-definition, auto-completion, and integrated test running. Add the Even Better TOML extension for Cargo.toml editing.

  • Neovim + rust-analyzer via nvim-lspconfig: If you prefer terminal-based editing. Requires Neovim 0.9+ and the nvim-lspconfig plugin configured for rust_analyzer.

Whichever editor you choose, ensure it is configured to run rustfmt on save. The project enforces formatting via CI --- unformatted code will be rejected.

3. Docker Images

All containerised toolchains use official images from Docker Hub or well-established community images. No custom base images. Every image is pinned to a specific tag for reproducibility.

3.1 Image Registry


Image Tag (pinned) Purpose

docker.io/library/rust 1.85.0-bookworm Primary build image. Debian Bookworm base with full Rust toolchain. Used for compiling all MESH crates. ~1.4 GB.

docker.io/library/rust 1.85.0-slim-bookworm Slim build variant. No GCC, no man pages. Used for CI builds where image pull time matters. ~800 MB.

docker.io/library/debian bookworm-slim Runtime base image. For the final validator and wallet binaries. Minimal: ~80 MB.

docker.io/library/eclipse-temurin 21-jre-jammy Java 21 runtime for TLA+ tools (TLC model checker, SANY parser). Eclipse Temurin is the official successor to AdoptOpenJDK. ~220 MB.

ghcr.io/tamarin-prover/tamarin-prover 1.8.0 Tamarin Prover for cryptographic protocol verification. Official GitHub Container Registry image.

docker.io/library/python 3.12-slim-bookworm Python runtime for test vector generation scripts, benchmarking scripts, and the Jupyter-based TLA+ environment. ~150 MB.

docker.io/jupyter/minimal-notebook latest Jupyter notebook environment for interactive TLA+ specification development using tlaplus-jupyter kernel. ~1.2 GB.


3.2 Pull All Images

Run the following to pre-fetch all images. This will consume approximately 5 GB of disk space and takes 5--15 minutes depending on bandwidth.

docker pull rust:1.85.0-bookworm

docker pull rust:1.85.0-slim-bookworm

docker pull debian:bookworm-slim

docker pull eclipse-temurin:21-jre-jammy

docker pull ghcr.io/tamarin-prover/tamarin-prover:1.8.0

docker pull python:3.12-slim-bookworm

docker pull jupyter/minimal-notebook:latest

3.3 Build Container (Dockerfile.build)

This Dockerfile extends the official Rust image with the additional system libraries and tools needed to compile MESH crates:

# Dockerfile.build

FROM rust:1.85.0-bookworm

# System dependencies for crypto crates and QUIC

RUN apt-get update && apt-get install -y --no-install-recommends \

pkg-config libssl-dev clang lld mold \

cmake \ # some crates need cmake

&& rm -rf /var/lib/apt/lists/*

# Install additional Rust tools

RUN rustup component add clippy rustfmt rust-analyzer

RUN cargo install cargo-audit cargo-deny cargo-nextest

# cargo-nextest: faster test runner with better output

# cargo-audit: checks dependencies for known vulnerabilities

# cargo-deny: checks licenses and advisories

WORKDIR /workspace

VOLUME /workspace

Build and tag it:

docker build -f Dockerfile.build -t mesh-build:latest .

Usage --- compile the project inside the container with host source mounted:

docker run --rm -v $(pwd):/workspace -v cargo-cache:/usr/local/cargo/registry \

mesh-build:latest cargo build

# Run tests:

docker run --rm -v $(pwd):/workspace -v cargo-cache:/usr/local/cargo/registry \

mesh-build:latest cargo nextest run

# Run clippy:

docker run --rm -v $(pwd):/workspace -v cargo-cache:/usr/local/cargo/registry \

mesh-build:latest cargo clippy -- -D warnings

CARGO CACHE VOLUME: The -v cargo-cache:/usr/local/cargo/registry flag creates a named Docker volume that persists the cargo registry cache across container runs. Without this, every docker run would re-download all crates. The volume survives container restarts and typically grows to 1--3 GB.

3.4 Runtime Container (Dockerfile.runtime)

The runtime image is minimal. It contains only the compiled binary and its runtime dependencies. This is what the testnet validators run.

# Dockerfile.runtime

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \

ca-certificates libssl3 \

&& rm -rf /var/lib/apt/lists/*

COPY --from=builder /workspace/target/release/mesh-validator /usr/local/bin/

COPY --from=builder /workspace/target/release/mesh-wallet /usr/local/bin/

EXPOSE 4430/udp # QUIC port for validator

EXPOSE 4431/udp # QUIC port for client connections

ENTRYPOINT ["mesh-validator"]

This uses a multi-stage build. The full Dockerfile combines Dockerfile.build and Dockerfile.runtime:

# Dockerfile (multi-stage)

FROM rust:1.85.0-bookworm AS builder

RUN apt-get update && apt-get install -y --no-install-recommends \

pkg-config libssl-dev clang lld mold cmake \

&& rm -rf /var/lib/apt/lists/*

WORKDIR /workspace

COPY . .

RUN cargo build --release

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \

ca-certificates libssl3 && rm -rf /var/lib/apt/lists/*

COPY --from=builder /workspace/target/release/mesh-validator /usr/local/bin/

COPY --from=builder /workspace/target/release/mesh-wallet /usr/local/bin/

EXPOSE 4430/udp 4431/udp

ENTRYPOINT ["mesh-validator"]

4. Formal Verification Toolchains

4.1 TLA+ (TLC Model Checker)

TLA+ is used to formally verify the consensus protocol properties (SPEC-010 §10.6). The TLC model checker is a Java application distributed as a JAR file.

4.1.1 Setup via Docker

There is no single official TLA+ Docker image on Docker Hub. The recommended approach is a lightweight custom image based on Eclipse Temurin JRE:

# Dockerfile.tlaplus

FROM eclipse-temurin:21-jre-jammy

# Download TLA+ tools JAR from official GitHub releases

ARG TLAPLUS_VERSION=1.8.0

RUN apt-get update && apt-get install -y --no-install-recommends wget && \

wget -q https://github.com/tlaplus/tlaplus/releases/download/v${TLAPLUS_VERSION}/tla2tools.jar \

-O /opt/tla2tools.jar && \

apt-get remove -y wget && apt-get autoremove -y && \

rm -rf /var/lib/apt/lists/*

WORKDIR /specs

VOLUME /specs

# Convenience aliases as entrypoints

# Usage: docker run mesh-tlaplus tlc MySpec.tla

ENTRYPOINT ["java", "-cp", "/opt/tla2tools.jar"]

CMD ["tlc2.TLC", "-help"]

Build and use:

docker build -f Dockerfile.tlaplus -t mesh-tlaplus:latest .

# Parse a spec:

docker run --rm -v $(pwd)/specs:/specs mesh-tlaplus:latest \

tla2sany.SANY /specs/Tier1.tla

# Run the model checker:

docker run --rm -v $(pwd)/specs:/specs mesh-tlaplus:latest \

tlc2.TLC /specs/Tier1.tla -workers auto

# Interactive REPL:

docker run --rm -it -v $(pwd)/specs:/specs mesh-tlaplus:latest \

tlc2.REPL

4.1.2 Jupyter + TLA+ (Interactive Development)

For iterative specification development, the tlaplus-jupyter kernel allows writing and checking TLA+ inside Jupyter notebooks:

# Dockerfile.tlaplus-jupyter

FROM jupyter/minimal-notebook:latest

USER root

RUN apt-get update && apt-get install -y --no-install-recommends \

default-jre-headless && rm -rf /var/lib/apt/lists/*

USER ${NB_UID}

RUN pip install --no-cache-dir tlaplus-jupyter

RUN python -m tlaplus_jupyter.install

WORKDIR /home/jovyan/specs

Run it:

docker build -f Dockerfile.tlaplus-jupyter -t mesh-tlaplus-jupyter:latest .

docker run --rm -p 8888:8888 -v $(pwd)/specs:/home/jovyan/specs \

mesh-tlaplus-jupyter:latest

# Open http://localhost:8888 and create a TLA+ notebook

4.2 Tamarin Prover

Tamarin Prover is used to verify cryptographic protocol properties (SPEC-010 §10.6). It has an official Docker image on GitHub Container Registry.

# Pull the official image:

docker pull ghcr.io/tamarin-prover/tamarin-prover:1.8.0

# Run a proof:

docker run --rm -v $(pwd)/proofs:/proofs \

ghcr.io/tamarin-prover/tamarin-prover:1.8.0 \

tamarin-prover --prove /proofs/PTLC_Atomicity.spthy

# Interactive mode (launches web UI on port 3001):

docker run --rm -p 3001:3001 -v $(pwd)/proofs:/proofs \

ghcr.io/tamarin-prover/tamarin-prover:1.8.0 \

tamarin-prover interactive /proofs/ --interface='*4'

# Open http://localhost:3001 for the Tamarin web interface

TAMARIN LEARNING CURVE: Tamarin's specification language (spthy) has a steep learning curve. Start with the official tutorial at https://tamarin-prover.com/manual/master/book/ before attempting to model MESH protocols. Budget 2--4 weeks of study before writing production-quality proofs.

5. Testnet Orchestration

The full 4-validator testnet is orchestrated by docker compose. This is the primary way to run the MVP end-to-end.

5.1 docker-compose.yml

# docker-compose.yml

version: "3.9"

services:

validator-1:

build: .

container_name: mesh-validator-1

command: ["mesh-validator", "--config", "/config/validator-1.toml"]

volumes:

- ./config:/config:ro

- validator-1-data:/data

ports:

- "4430:4430/udp"

- "4431:4431/udp"

networks:

- meshnet

validator-2:

build: .

container_name: mesh-validator-2

command: ["mesh-validator", "--config", "/config/validator-2.toml"]

volumes:

- ./config:/config:ro

- validator-2-data:/data

ports:

- "4432:4430/udp"

- "4433:4431/udp"

networks:

- meshnet

validator-3:

build: .

container_name: mesh-validator-3

command: ["mesh-validator", "--config", "/config/validator-3.toml"]

volumes:

- ./config:/config:ro

- validator-3-data:/data

ports:

- "4434:4430/udp"

- "4435:4431/udp"

networks:

- meshnet

validator-4:

build: .

container_name: mesh-validator-4

command: ["mesh-validator", "--config", "/config/validator-4.toml"]

volumes:

- ./config:/config:ro

- validator-4-data:/data

ports:

- "4436:4430/udp"

- "4437:4431/udp"

networks:

- meshnet

volumes:

validator-1-data:

validator-2-data:

validator-3-data:

validator-4-data:

networks:

meshnet:

driver: bridge

5.2 Usage

# Build and start the testnet:

docker compose up --build -d

# View logs from all validators:

docker compose logs -f

# View logs from one validator:

docker compose logs -f validator-1

# Run the wallet CLI against the testnet:

docker compose exec validator-1 mesh-wallet --config /config/wallet.toml \

send --to <bob-pubkey> --amount 500 --asset test-token

# Stop the testnet:

docker compose down

# Stop and wipe all data (clean slate):

docker compose down -v

# Simulate a crash: kill one validator

docker compose stop validator-3

# ... run transactions, they should still succeed (3/4 = 2f+1 with f=1)

docker compose start validator-3 # it should sync back up

6. CI/CD Pipeline

The project uses GitHub Actions for continuous integration. The pipeline runs on every push to any branch and every pull request to main.

6.1 GitHub Actions Workflow

# .github/workflows/ci.yml

name: CI

on: [push, pull_request]

env:

CARGO_TERM_COLOR: always

RUST_BACKTRACE: 1

jobs:

check:

runs-on: ubuntu-24.04

container: rust:1.85.0-bookworm

steps:

- uses: actions/checkout@v4

- uses: actions/cache@v4

with:

path: |

~/.cargo/registry

target/

key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

- run: cargo fmt --all -- --check

- run: cargo clippy --all-targets -- -D warnings

- run: cargo build --all-targets

- run: cargo test --all-targets

audit:

runs-on: ubuntu-24.04

container: rust:1.85.0-bookworm

steps:

- uses: actions/checkout@v4

- run: cargo install cargo-audit cargo-deny

- run: cargo audit

- run: cargo deny check licenses

The pipeline enforces: formatting (rustfmt), lint warnings (clippy with -D warnings), compilation, all tests pass, no known vulnerabilities (cargo audit), and license compliance (cargo deny). Any failure blocks merge.

7. Rust Crate Dependencies (Pinned)

These are the exact crate versions to be specified in Cargo.toml. All versions are pinned and locked via Cargo.lock. Do not use version ranges (e.g., "^1.0") for cryptographic dependencies --- pin to the exact patch version.

7.1 mesh-crypto


Crate Version Purpose and Notes

ed25519-dalek 2.1.1 Ed25519 signatures. Enable features: ["hazmat", "rand_core"]. This is the dalek-cryptography crate maintained by the community since the original author's departure.

curve25519-dalek 4.1.3 Ristretto group operations for Pedersen commitments. Enable features: ["alloc", "precomputed-tables"].

bulletproofs 4.0.0 Bulletproofs range proofs over Ristretto. Depends on curve25519-dalek and merlin. MIT licensed.

merlin 3.0.0 Transcript-based Fiat-Shamir transform. Used by bulletproofs for non-interactive proofs.

sha3 0.10.8 SHA3-256 and SHAKE256. RustCrypto project. Pure Rust.

chacha20poly1305 0.10.1 ChaCha20-Poly1305 AEAD. For memo encryption and transport-layer encryption.

rand 0.8.5 Cryptographically secure random number generation. Uses OS entropy.

rand_core 0.6.4 Core traits for RNG. Required by dalek crates.

zeroize 1.8.1 Securely zeroes memory on drop. MUST be used for all secret key material.


7.2 mesh-network


Crate Version Purpose and Notes

quinn 0.11.6 QUIC protocol implementation. Built on tokio and rustls. This is the primary networking dependency.

rustls 0.23.22 TLS 1.3 implementation in Rust. No OpenSSL dependency at runtime. Used by quinn.

rustls-pemfile 2.2.0 PEM file parsing for TLS certificates.

rcgen 0.13.2 X.509 certificate generation. Used to create self-signed TLS certs for testnet validators.

tokio 1.43.0 Async runtime. Enable features: ["full"]. All async I/O runs on tokio.

bytes 1.9.0 Efficient byte buffer manipulation. Used for message framing.


7.3 mesh-validator


Crate Version Purpose and Notes

sled 0.34.7 Embedded key-value database. Used for account state, certificates, and equivocation records. Note: sled is in maintenance mode; if it becomes unmaintained, migrate to redb (0.22.0) as a drop-in replacement.

toml 0.8.20 TOML configuration file parsing. For validator config files.

tracing 0.1.41 Structured logging framework. All log output uses tracing macros.

tracing-subscriber 0.3.19 Log output formatting. Enable features: ["env-filter", "json"]. JSON output for machine-parseable logs.


7.4 mesh-wallet


Crate Version Purpose and Notes

clap 4.5.26 Command-line argument parser. Enable features: ["derive"]. All CLI commands defined via derive macros.

dialoguer 0.11.0 Interactive terminal prompts. Used for key generation confirmation and passphrase entry.

hex 0.4.3 Hex encoding/decoding. For displaying public keys and transaction hashes to the user.


7.5 Development and Testing


Crate Version Purpose and Notes

proptest 1.6.0 Property-based testing framework. Used for serialisation round-trip tests and fuzzing protocol invariants.

criterion 0.5.1 Benchmarking framework. Used for crypto operation benchmarks (range proof generation/verification, signing, etc.).

tokio-test 0.4.4 Utilities for testing async code. Pairs with tokio.

tempfile 3.14.0 Temporary file/directory creation for test isolation.


DEPENDENCY HYGIENE: Run cargo deny check licenses before adding any new dependency. MESH is Apache 2.0 licensed. All dependencies MUST be compatible (Apache 2.0, MIT, BSD-2, BSD-3, ISC, or Zlib). GPL dependencies are PROHIBITED because they would require the entire project to be GPL. LGPL dependencies are acceptable only if dynamically linked.

8. Repository Structure

The repository follows Rust workspace conventions with additional top-level directories for specifications, formal proofs, and configuration.

mesh/

├── Cargo.toml # Workspace root

├── Cargo.lock # Pinned dependency versions

├── rust-toolchain.toml # Pinned Rust version

├── .cargo/config.toml # Build settings (linker, flags)

├── .github/workflows/ci.yml # CI pipeline

├── Dockerfile # Multi-stage build

├── Dockerfile.build # Development build container

├── Dockerfile.tlaplus # TLA+ tools container

├── Dockerfile.tlaplus-jupyter # Interactive TLA+ notebooks

├── docker-compose.yml # 4-validator testnet

├── deny.toml # cargo-deny license config

├── LICENSE # Apache 2.0

├── README.md

├── FUTURE.md # Ideas deferred from MVP scope

├── crates/

│ ├── mesh-types/ # Data structures and serialisation

│ │ ├── src/lib.rs

│ │ └── Cargo.toml

│ ├── mesh-crypto/ # Cryptographic operations

│ │ ├── src/lib.rs

│ │ └── Cargo.toml

│ ├── mesh-network/ # QUIC transport layer

│ │ ├── src/lib.rs

│ │ └── Cargo.toml

│ ├── mesh-validator/ # Validator binary

│ │ ├── src/main.rs

│ │ └── Cargo.toml

│ └── mesh-wallet/ # CLI wallet binary

│ ├── src/main.rs

│ └── Cargo.toml

├── specs/ # Formal specifications (TLA+)

│ ├── Tier1.tla

│ ├── Tier1.cfg # TLC model config

│ └── ValueSemiring.tla

├── proofs/ # Tamarin protocol proofs

│ ├── PTLC_Atomicity.spthy

│ └── Stealth_Unlinkability.spthy

├── config/ # Testnet configuration files

│ ├── validator-1.toml

│ ├── validator-2.toml

│ ├── validator-3.toml

│ ├── validator-4.toml

│ └── wallet.toml

├── test-vectors/ # Reference test vectors (JSON)

│ ├── spec-002/

│ ├── spec-003/

│ └── spec-006/

├── docs/ # Specification documents (docx/pdf)

│ ├── MESH-Protocol-Specification-Suite-v0.1.0.docx

│ ├── MESH-Specification-Addendum-SPEC-004-005-009.docx

│ ├── MESH-MVP-Roadmap-Solo-Bootstrap.docx

│ └── MESH-Dev-Environment.docx

└── benches/ # Criterion benchmarks

├── crypto_bench.rs

└── serialisation_bench.rs

9. Quick Reference Card

Cut this page out and stick it on your monitor.


Task Command

Build (host) cargo build

Build (container) docker run --rm -v $(pwd):/workspace -v cargo-cache:/usr/local/cargo/registry mesh-build:latest cargo build

Test (fast) cargo nextest run

Test (container) docker run --rm -v $(pwd):/workspace -v cargo-cache:/usr/local/cargo/registry mesh-build:latest cargo nextest run

Lint cargo clippy -- -D warnings

Format cargo fmt --all

Format check cargo fmt --all -- --check

Audit deps cargo audit

License check cargo deny check licenses

Start testnet docker compose up --build -d

View testnet logs docker compose logs -f

Stop testnet docker compose down

Wipe testnet data docker compose down -v

Kill one validator docker compose stop validator-3

Run TLC model check docker run --rm -v $(pwd)/specs:/specs mesh-tlaplus:latest tlc2.TLC /specs/Tier1.tla -workers auto

Run Tamarin proof docker run --rm -v $(pwd)/proofs:/proofs ghcr.io/tamarin-prover/tamarin-prover:1.8.0 tamarin-prover --prove /proofs/PTLC_Atomicity.spthy

Benchmark crypto cargo bench --bench crypto_bench

Generate release binary cargo build --release