<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sorenplanck</title>
    <description>The latest articles on DEV Community by sorenplanck (@sorenplanck).</description>
    <link>https://dev.to/sorenplanck</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4035954%2F97da8e0f-3eb1-4749-b0b7-7c19d5c2d624.jpg</url>
      <title>DEV Community: sorenplanck</title>
      <link>https://dev.to/sorenplanck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sorenplanck"/>
    <language>en</language>
    <item>
      <title>Building and launching a Mimblewimble blockchain in Rust</title>
      <dc:creator>sorenplanck</dc:creator>
      <pubDate>Sun, 19 Jul 2026 02:10:16 +0000</pubDate>
      <link>https://dev.to/sorenplanck/building-and-launching-a-mimblewimble-blockchain-in-rust-370c</link>
      <guid>https://dev.to/sorenplanck/building-and-launching-a-mimblewimble-blockchain-in-rust-370c</guid>
      <description>&lt;h1&gt;
  
  
  aBuilding and launching a Mimblewimble blockchain in Rust
&lt;/h1&gt;

&lt;p&gt;I recently launched &lt;strong&gt;DOM Protocol&lt;/strong&gt;, an independent Layer 1 blockchain written in Rust.&lt;br&gt;
The goal was to build a network focused on private electronic cash, deterministic consensus behavior, CPU-accessible mining and a launch without privileged allocation.&lt;br&gt;
DOM combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RandomX proof of work&lt;/li&gt;
&lt;li&gt;Mimblewimble transaction architecture&lt;/li&gt;
&lt;li&gt;confidential amounts&lt;/li&gt;
&lt;li&gt;Pedersen commitments&lt;/li&gt;
&lt;li&gt;Bulletproof range proofs&lt;/li&gt;
&lt;li&gt;transaction aggregation&lt;/li&gt;
&lt;li&gt;cut-through&lt;/li&gt;
&lt;li&gt;canonical serialization&lt;/li&gt;
&lt;li&gt;LMDB-backed persistent state&lt;/li&gt;
&lt;li&gt;encrypted peer-to-peer transport&lt;/li&gt;
&lt;li&gt;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:&lt;/li&gt;
&lt;li&gt;explicit ownership and lifetime semantics&lt;/li&gt;
&lt;li&gt;strong type safety&lt;/li&gt;
&lt;li&gt;checked arithmetic&lt;/li&gt;
&lt;li&gt;predictable error handling&lt;/li&gt;
&lt;li&gt;safe concurrency&lt;/li&gt;
&lt;li&gt;clear crate boundaries&lt;/li&gt;
&lt;li&gt;reproducible builds&lt;/li&gt;
&lt;li&gt;low-level access without requiring widespread unsafe code
The repository is organized as a multi-crate workspace.
Some of the main crates are:&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
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.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>rust</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
