Building and launching a Mimblewimble blockchain in Rust

Building and launching a Mimblewimble blockchain in Rust

aBuilding and launching a Mimblewimble blockchain in Rust I recently launched DOM Protocol, an independent Layer 1 blockchain written in Rust. The goal was to build a network focused on private electronic cash, deterministic consensus behavior, CPU-accessible mining and a launch without privileged allocation. DOM combines: RandomX proof of work Mimblewimble transaction architecture confidential amounts Pedersen commitments Bulletproof range proofs transaction aggregation cut-through canonical serialization LMDB-backed persistent state encrypted peer-to-peer transport deterministic genesis identity This article summarizes the architecture, the launch model and some of the engineering decisions behind the project. --- ## Why Rust Rust was selected because the protocol needs: explicit ownership and lifetime semantics strong type safety checked arithmetic predictable error handling safe concurrency clear crate boundaries reproducible builds low-level access without requiring widespread unsafe code The repository is organized as a multi-crate workspace. Some of the main crates are: text dom-core dom-crypto dom-serialization dom-consensus dom-chain dom-store dom-pow dom-wire dom-node dom-wallet dom-rpc dom-explorer Each crate has a narrow responsibility. For example: * dom-core defines consensus constants and primitive types. * dom-crypto implements signatures, commitments and range-proof support. * dom-serialization defines canonical byte encoding. * dom-consensus validates transactions and blocks. * dom-chain applies blocks, handles forks and performs reorganizations. * dom-store persists chain state in LMDB. * dom-pow implements RandomX and difficulty logic. * dom-wire handles encrypted peer communication. * dom-node coordinates the full runtime. ⸻ Consensus design The protocol uses a Mimblewimble-style transaction model. Transaction amounts are not published directly. Instead, value conservation is enforced through Pedersen commitments. At a high level, the balance relation is checked in commitment space. The implementation also validates: * duplicate inputs * duplicate outputs * duplicate kernels * lock heights * coinbase maturity * transaction weight * block weight * range proofs * kernel signatures * PMMR roots * previous-block linkage * timestamp bounds * proof-of-work target Canonical serialization is treated as consensus-critical. The same object must produce exactly the same bytes on every supported platform. Trailing bytes, malformed lengths and oversized allocations are rejected. ⸻ RandomX proof of work DOM uses RandomX to keep mining oriented toward general-purpose CPUs. The network uses: * RandomX for block proof of work * ASERT for difficulty adjustment * a two-minute target block time * explicit RandomX seed derivation * persisted-seed validation * fail-closed network selection The Mainnet P2P port is: 33369 The public seed is: seed1.dom-protocol.org:33369 ⸻ Zero-issuance genesis The Mainnet genesis block creates no coins. Its canonical body contains: Inputs: 0 Outputs: 0 Kernels: 0 Transactions: 0 Issued DOM: 0 The first mining reward is created only at block height 1. Mainnet genesis hash: 182e10af28e7ec072f462e6044f580dc9dd8c866cb78dfc293bbfaee4e9325ce Chain ID: f9831fadabc8a4234beab35fbb6327e84581645f33e9f75ed2ea78e8bcf1165b Genesis inscription: Not a store of value. A means of exchange. The launch model includes: * no premine * no ICO * no presale * no founder allocation * no team allocation * no treasury allocation * no developer tax Every circulating unit must be created through public consensus rules. ⸻ Monetary policy The base unit is: 1 DOM = 100,000,000 noms The initial block reward is: 33 DOM The reward schedule decreases deterministically using integer arithmetic. The maximum issuance is: 3,299,996,676,900,000 noms The genesis block is economically empty, so the first reward-bearing block is height 1. ⸻ Storage and reorganization safety Chain state is persisted using LMDB. The node stores and validates: * canonical headers * block bodies * UTXO state * kernel indexes * chain height indexes * PMMR state * peer metadata * reorganization data The implementation follows a fail-closed approach. Examples of conditions that produce errors instead of silent recovery include: * missing canonical bodies * malformed persisted records * incorrect record length * invalid block height mapping * canonical hash mismatch * corrupted UTXO metadata * inconsistent chain state Reorganizations restore the previous canonical state through explicit undo data and deterministic transition logic. ⸻ P2P architecture The peer protocol uses encrypted transport and network-specific identity checks. The node performs: * inbound and outbound peer management * handshake validation * chain-ID binding * block relay * transaction relay * peer exchange * initial block download * orphan handling * missing-parent requests * rate limiting * peer reputation tracking Mainnet, Testnet and Regtest use distinct network magic values and ports. This prevents accidental cross-network peering. ⸻ Security engineering Before the v1.0.0 release, the DOM Core codebase went through an extended security and verification campaign. The work included: * fuzz testing * property-based testing * Kani verification harnesses * Miri execution on selected paths * deterministic replay tests * restart and corruption testing * reorganization campaigns * RandomX boundary tests * mempool invariants * storage invariants * P2P parser limits * reproducible release builds The final audited release commit is: 6c58b0383c095384cd0150cabf074aa00fb57b17 The release tag is: v1.0.0 This was an internal engineering verification campaign, not an independent third-party financial audit. ⸻ Running a node Clone the repository and check out the release: git clone https://github.com/sorenplanck/dom-protocol.git cd dom-protocol git checkout v1.0.0 cargo build --release Start a Mainnet validating node: DOM_NETWORK=mainnet \ DOM_SEED_PEERS="seed1.dom-protocol.org:33369" \ DOM_MINE=false \ DOM_DATA_DIR="$HOME/.dom-mainnet" \ DOM_P2P_LISTEN_ADDR="0.0.0.0:33369" \ DOM_LOG=info \ ./target/release/dom-node The current public bootstrap node is: seed1.dom-protocol.org:33369 Direct IP fallback: 168.100.9.70:33369 ⸻ Wallet The official DOM Wallet V3 project is published separately: https://github.com/sorenplanck/dom-wallet-v3 Releases: https://github.com/sorenplanck/dom-wallet-v3/releases Wallet users should: * back up their recovery phrase offline * never publish the recovery phrase * verify release checksums * avoid unofficial mirrors * test recovery before storing meaningful value ⸻ Current state The Mainnet node is online. Current state at launch: Network: MAINNET Height: 0 Mining on bootstrap node: disabled P2P port: 33369 The bootstrap node does not mine. The first valid proof-of-work block must be produced by an independent miner. ⸻ What I am looking for I am looking for technical review and independent participation. Areas where feedback would be particularly useful: * consensus validation * Mimblewimble balance rules * RandomX integration * storage durability * reorganization behavior * peer discovery * mining tooling * release packaging * reproducible builds * wallet recovery * Rust crate boundaries The code is open source and direct criticism is welcome. ⸻ Links Repository: https://github.com/sorenplanck/dom-protocol Mainnet release: https://github.com/sorenplanck/dom-protocol/releases/tag/v1.0.0 Wallet: https://github.com/sorenplanck/dom-wallet-v3/releases Public seed: seed1.dom-protocol.org:33369 DOM is experimental open-source monetary software. It is not an investment offering and there are no promises regarding price, liquidity or exchange listings. Enter fullscreen mode Exit fullscreen mode

Original Source

Read the full article at Dev →

KhanList aggregates and links to publicly available news content. We do not host full articles from third-party sources. Always verify important information with original sources.