Skip to content

High-performance Layer 1 blockchain built on .NET 9 with Native AOT, BFT consensus, and native regulatory compliance

License

Notifications You must be signed in to change notification settings

Basalt-Foundation/basalt

Basalt

A high-performance Layer 1 blockchain built on .NET 9 with Native AOT compilation, targeting enterprise use cases including RWA tokenization, supply chain management, energy markets, and decentralized identity with native regulatory compliance (MiCA, GDPR, KYC/AML).

Key Features

  • Native AOT -- Single self-contained binary with no JIT overhead, sub-millisecond startup
  • BLAKE3 Hashing -- 6x faster than SHA-256 for state root computation and Merkle proofs
  • Ed25519 Signatures -- Fast signing/verification via libsodium, with batch verification support
  • BLS12-381 Aggregation -- BLS signatures via Nethermind.Crypto.Bls for aggregate consensus certificates
  • Keccak-256 -- Custom software implementation for address derivation (macOS-compatible)
  • BasaltBFT Consensus -- Pipelined HotStuff-based BFT with 400ms block time, stake-weighted leader selection, and BLS aggregation
  • Merkle Patricia Trie -- Cryptographically verifiable state with RocksDB persistence
  • Smart Contracts -- C# contracts with gas metering, sandboxed execution, and Roslyn analyzers
  • Built-in Compliance -- KYC/AML identity registry, sanctions screening, per-token transfer policies
  • EVM Bridge -- Lock/unlock bridge with multisig relayer and Merkle proof verification
  • Confidentiality -- Pedersen commitments, Groth16 proofs, private channels, selective disclosure
  • P2P Networking -- TCP transport with length-prefixed framing, Kademlia DHT, Episub gossip, peer reputation scoring

Architecture

Basalt.Core  (zero external deps)
+-- Basalt.Codec         -- Deterministic binary serialization
+-- Basalt.Crypto        -- BLAKE3, Ed25519, Keccak-256, BLS12-381, AES-256-GCM keystore
+-- Basalt.Storage       -- RocksDB, Merkle Patricia Trie, block/receipt stores
+-- Basalt.Network       -- TCP transport, Kademlia DHT, Episub gossip
|   +-- Basalt.Consensus -- BasaltBFT, staking, slashing, pipelined consensus
|       +-- Basalt.Execution -- Transaction executor, BasaltVM, gas metering
|           +-- Basalt.Api.Rest     -- REST API + WebSocket
|           +-- Basalt.Api.Grpc     -- gRPC services
|           +-- Basalt.Api.GraphQL  -- GraphQL (HotChocolate)
|           +-- Basalt.Compliance   -- Identity, KYC/AML, sanctions, audit trail
|           +-- Basalt.Confidentiality -- Pedersen, Groth16, private channels
|           +-- Basalt.Bridge       -- EVM bridge, multisig relayer
|               +-- Basalt.Node     -- Composition root, single binary

Quick Start

Prerequisites

Build

dotnet build

Run Tests

dotnet test

1,380 tests across 15 test projects covering core types, cryptography, codec serialization, storage, networking, consensus, execution, API, compliance, bridge, confidentiality, node configuration, SDK contracts, analyzers, and end-to-end integration.

Run a Local Node

dotnet run --project src/node/Basalt.Node

The node starts in standalone mode on the devnet (chain ID 31337) with a REST API on port 5000 and timer-based block production at 400ms intervals.

Run a 4-Validator Devnet

docker compose up --build

Spins up 4 validator nodes with pre-configured genesis accounts, RocksDB persistent storage, and automatic peer discovery via static peer lists.

Validator REST API P2P
validator-0 localhost:5100 30300
validator-1 localhost:5101 30301
validator-2 localhost:5102 30302
validator-3 localhost:5103 30303

Each validator has a Docker volume (validator-N-data) for RocksDB persistence and connects to all other validators via environment-configured peer lists. Health checks poll /v1/status every 5 seconds.

CLI

# Create an account
dotnet run --project tools/Basalt.Cli -- account create

# Check balance
dotnet run --project tools/Basalt.Cli -- account balance 0x...

# Send a transfer
dotnet run --project tools/Basalt.Cli -- tx send --to 0x... --value 1000 --key <hex>

# Get node status
dotnet run --project tools/Basalt.Cli -- node status

# Request faucet tokens
dotnet run --project tools/Basalt.Cli -- faucet 0x...

# Initialize a contract project
dotnet run --project tools/Basalt.Cli -- init MyToken

Project Structure

Basalt.sln                              (38 C# projects)
+-- src/
|   +-- core/
|   |   +-- Basalt.Core/               # Hash256, Address, UInt256, chain parameters
|   |   +-- Basalt.Crypto/             # BLAKE3, Ed25519, Keccak-256, BLS12-381, keystore
|   |   +-- Basalt.Codec/              # BasaltWriter/Reader, varint, serialization
|   +-- storage/
|   |   +-- Basalt.Storage/            # RocksDB, MPT, block/receipt stores
|   +-- network/
|   |   +-- Basalt.Network/            # TCP transport, Kademlia DHT, Episub, peer reputation
|   +-- consensus/
|   |   +-- Basalt.Consensus/          # BasaltBFT, pipelined consensus, staking, slashing
|   +-- execution/
|   |   +-- Basalt.Execution/          # Transaction executor, BasaltVM, gas metering, sandbox
|   +-- api/
|   |   +-- Basalt.Api.Rest/           # REST endpoints, faucet, WebSocket, Prometheus metrics
|   |   +-- Basalt.Api.Grpc/           # gRPC services (BasaltNodeService)
|   |   +-- Basalt.Api.GraphQL/        # GraphQL queries and mutations (HotChocolate 14.3.0)
|   +-- compliance/
|   |   +-- Basalt.Compliance/         # Identity registry, KYC/AML, sanctions
|   +-- confidentiality/
|   |   +-- Basalt.Confidentiality/    # Pedersen commitments, Groth16 proofs, private channels, selective disclosure
|   +-- bridge/
|   |   +-- Basalt.Bridge/             # EVM bridge, multisig relayer, Merkle proofs
|   +-- sdk/
|   |   +-- Basalt.Sdk.Contracts/      # Contract attributes, storage primitives, BST20Token base
|   |   +-- Basalt.Sdk.Analyzers/      # Roslyn analyzers for contract safety
|   |   +-- Basalt.Sdk.Testing/        # BasaltTestHost in-process emulator
|   +-- generators/
|   |   +-- Basalt.Generators.Codec/   # Codec source generator (planned)
|   |   +-- Basalt.Generators.Json/    # JSON source generator (planned)
|   |   +-- Basalt.Generators.Contracts/ # ABI dispatch source generator (planned)
|   +-- explorer/
|   |   +-- Basalt.Explorer/           # Blazor WebAssembly block explorer
|   +-- node/
|       +-- Basalt.Node/               # Composition root, single binary
+-- tests/                             # 15 test projects, 1,380 tests
|   +-- Basalt.Core.Tests/
|   +-- Basalt.Crypto.Tests/
|   +-- Basalt.Codec.Tests/
|   +-- Basalt.Storage.Tests/
|   +-- Basalt.Network.Tests/
|   +-- Basalt.Consensus.Tests/
|   +-- Basalt.Execution.Tests/
|   +-- Basalt.Api.Tests/
|   +-- Basalt.Compliance.Tests/
|   +-- Basalt.Bridge.Tests/
|   +-- Basalt.Confidentiality.Tests/
|   +-- Basalt.Sdk.Tests/
|   +-- Basalt.Sdk.Analyzers.Tests/
|   +-- Basalt.Node.Tests/
|   +-- Basalt.Integration.Tests/
+-- benchmarks/
|   +-- Basalt.Benchmarks/             # BenchmarkDotNet microbenchmarks + TPS macro
+-- tools/
|   +-- Basalt.Cli/                    # CLI tool (account, tx, block, faucet, contract init/compile/test)
|   +-- Basalt.DevNet/                 # Docker devnet genesis config + validator setup script
+-- contracts/                         # Solidity bridge contracts (BasaltBridge, WBST)
+-- docs/                              # Design plan, technical specification

API Endpoints

Method Path Description
POST /v1/transactions Submit a signed transaction
GET /v1/blocks/latest Get the latest block
GET /v1/blocks/{id} Get block by number or hash
GET /v1/accounts/{address} Get account balance and nonce
GET /v1/status Node status (block height, mempool, etc.)
POST /v1/faucet Request devnet test tokens
GET /metrics Prometheus metrics
WS /ws/blocks Real-time block notifications

Configuration

The node is configured via environment variables:

Variable Default Description
BASALT_CHAIN_ID 31337 Chain identifier
BASALT_NETWORK basalt-devnet Network name
BASALT_VALIDATOR_INDEX -1 Validator index in the set (enables consensus mode when >= 0 and peers are set)
BASALT_VALIDATOR_ADDRESS -- Validator account address (hex)
BASALT_PEERS -- Comma-separated peer endpoints (host:port)
BASALT_VALIDATOR_KEY -- Validator Ed25519 private key (hex). If unset, a random key is generated (dev mode)
HTTP_PORT 5000 HTTP API listen port
P2P_PORT 30303 P2P TCP listen port
BASALT_DATA_DIR -- Data directory for RocksDB persistence. If unset, state is in-memory only
BASALT_USE_PIPELINING false Enable pipelined consensus
BASALT_USE_SANDBOX false Enable sandboxed contract execution via AssemblyLoadContext isolation
ASPNETCORE_URLS http://+:5000 REST API listen address

Token Economics

Parameter Value
Symbol BSLT
Decimals 18
Block time 400ms
Block gas limit 100,000,000
Max transactions per block 10,000
Transfer gas cost 21,000
Min validator stake 100,000 BSLT
Unbonding period ~21 days

License

Copyright (c) 2025-2026 Basalt Foundation