v1.0.0 · Rust · MIT licensed

An independent Layer-1,
engineered in Rust.

Xperova is a purpose-built layer-1 blockchain. Its proof-of-work consensus, account model, state layer, peer-to-peer networking and native XPERO token are implemented from first principles in a single Rust workspace — written from scratch rather than forked, and deliberately without a virtual machine.

01 — Network

Three networks, defined in code

Each network is fixed by a chain specification whose genesis hash is the network's identity. Nodes verify that hash during the handshake, so a node configured for the wrong network disconnects immediately rather than forking quietly.

No public Xperova network is running yet. The mainnet specification exists in the repository (chain id 7777) but ships with an empty bootnode list, and no genesis launch has taken place. The panel below queries a node you run — it shows no numbers until you connect one.

Live node status Not connected
Network
Block height
Difficulty
Block reward
Circulating supply
Connected peers
Mempool
Node version

Start a node with xperovad run --rpc-listen 127.0.0.1:8645 and press Connect. Browsers block plain-HTTP requests from an HTTPS page, so a local node reads correctly when this page is served over http://localhost, or when the node sits behind HTTPS.

Mainnet

The canonical specification. No premine, no allocation — every XPERO must be mined.

chain id 7777 · no bootnodes yet

Testnet

Identical rules on a separate chain id, at lower difficulty. Coins carry no value.

chain id 7778

Devnet

A local network with trivial difficulty, optional genesis allocation, and a one-command three-node script.

chain id 1337

02 — Engineering philosophy

A small consensus surface, on purpose

Every feature a chain adds is a rule two implementations must agree on byte for byte. Xperova keeps that set of rules small enough to state in a single document — and then states it.

  1. No virtual machine — deliberately

    Xperova moves value and carries a short memo. Leaving out programmable execution removes the largest single source of consensus bugs and keeps the validity rules compact: a block either applies cleanly or is rejected in full. There is no notion of an included-but-failed transaction.

  2. Explicit consensus rules

    Consensus objects are never hashed or signed through a general-purpose serialisation format. They use one deterministic encoding — fixed-width big-endian integers, length-prefixed byte strings — so every value has exactly one valid byte representation, and decoders reject trailing bytes and enforce length limits before allocating.

  3. Rust, with the core kept free of I/O

    The consensus crate has no networking and no storage, which is what makes every rule directly testable. The layers above it — storage, chain, networking, RPC, mining — depend downwards only.

  4. Deterministic state

    The state root is a commitment to the set of accounts, not to the history of writes: it does not depend on insertion order. Trie nodes are content addressed, so any historical root stays queryable and a chain reorganisation needs no state unwinding — the new head simply names a different root.

  5. A native account model

    An account is a balance and a nonce. That is simpler to index and produces smaller transactions than an unspent-output set; the cost is that ordering matters within one sender's stream, which is exactly what the nonce is for.

  6. Limitations stated, not hidden

    The whitepaper closes with what the design does not do: a young chain is cheap to reorganise, blocks are gossiped whole, the state trie is never pruned, and the RPC interface is unauthenticated. A specification that only lists strengths is not much of a specification.

03 — Technology

What the protocol is made of

Eight components, each with one job. All of them are specified in the whitepaper and implemented in the xpero-core crate.

SHA3-256d proof of work

SHA3-256 applied twice over the canonical header encoding. Because the nonce is part of that encoding, a block's identity and its proof of work are the same value.

block hash = sha3(sha3(header))

Sparse merkle state

Accounts live in a trie keyed by the hash of the address. Empty subtrees are never stored, and a subtree holding exactly one key collapses to a single leaf.

order-independent root · content addressed

secp256k1 signatures

Recoverable ECDSA: the sender is recovered from the signature rather than carried alongside it. High-s signatures are rejected, so a third party cannot alter a transaction's id without invalidating it.

65 bytes · r ‖ s ‖ v · low-s enforced

Bech32m addresses

Addresses carry the xpero prefix and a BIP-350 checksum that catches every error of up to four characters — and rejects the older bech32 constant, so an address from another chain cannot be mistaken for one of these.

xpero1…

Chain-id replay protection

The network identifier sits inside the signed payload. A transaction signed for one network can never be replayed on another — including on any network created later.

7777 mainnet · 7778 testnet · 1337 devnet

Difficulty retargeting

Every 120 blocks — roughly an hour — the target is rescaled by how far the window ran from its intended span, clamped to a factor of 4× so one window of manipulated timestamps cannot move difficulty far.

120 blocks · 4× clamp · floor at the pow limit

Account model

A balance and a nonce per address. Untouched accounts occupy no storage; the nonce must match exactly, which makes every transaction naturally single-use.

8 decimals · base unit "zep"

Peer-to-peer networking

Length-prefixed TCP frames, a handshake that checks the genesis hash, and pull-based sync: a node behind its peer sends a block locator and converges on the fork point in a handful of round trips.

port 30333 · fork-aware sync

04 — Token

XPERO is issued by mining, and only by mining

There is one way coins are created: mining a block. The miner named in a block's header receives the subsidy plus that block's fees. No foundation allocation, no team unlock, no pre-sale — the mainnet genesis block carries no balances at all.

XPERO

Native token. 8 decimals; the base unit is the zep, and 1 XPERO is 100,000,000 zep.

20

Initial block reward, in XPERO, paid to the miner of each block.

2,100,000

Blocks between halvings — approximately two years at 30-second blocks.

83,999,999.727

Maximum supply in XPERO: the exact sum of the halving schedule, not a rounded figure.

Cumulative XPERO issued, by block height first 8 halving eras · ~16 years
Cumulative XPERO issuance against block height Issuance is front-loaded: 42,000,000 XPERO in the first halving era, 63,000,000 by the end of the second, and 83,671,875 — 99.6% of the 83,999,999.727 XPERO maximum — by block 16,800,000. The remaining 23 halving eras add the final 328,125 XPERO, ending at block 65,100,000. maximum supply 83,999,999.727 XPERO
View the full 31-era schedule as a table
Every halving era. The subsidy reaches zero after era 30; issuance then stops permanently.
Era First block Reward (XPERO) Issued in era Cumulative supply

Why not a round 84,000,000?

The subsidy is an integer number of zep, and integer halving truncates. Summing the schedule exactly gives 8,399,999,972,700,000 zep — 83,999,999.727 XPERO, about 0.273 short of the round figure. The constant in the code is the exact sum, and a test asserts the two agree.

Fees are not new supply

A transaction pays a minimum of 0.0001 XPERO, plus 0.000001 XPERO per memo byte. That floor is a consensus rule — a block containing an underpaid transaction is invalid. Fees move existing coins to the miner; nothing is burned, and nothing is minted.

What this page does not state. XPERO has no price, market capitalisation, exchange listing, staking yield, investor allocation or team allocation, because none of those exist. The circulating supply is whatever the chain has mined, and today no public chain is running.

05 — Architecture

The path of a transaction

From a signature on one machine to a state root committed in a block header, with the crate responsible for each step.

  1. Wallet
    A key is unlocked from an AES-256-GCM keystore and signs the transaction's digest with secp256k1. The signature is recoverable, so the sender travels implicitly. xpero-cli
  2. Transaction
    Chain id, nonce, recipient, value, fee and an optional memo, in the canonical encoding. The chain id is inside the signed payload; the transaction id covers the signature as well as the body. xpero-core · tx
  3. Mempool
    Accepted only if the nonce continues the sender's queue without a gap and the whole queue fits inside the balance. A transaction may be replaced by one with the same nonce and a strictly higher fee. xpero-chain · mempool
  4. P2P propagation
    Gossiped to every peer inside length-prefixed frames. Peers that already hold it decline it, which is what stops the announcement looping. xpero-net
  5. Mining
    A template is built on the current head, transactions are selected by fee per byte in nonce order, and worker threads grind the header nonce until SHA3-256d falls at or below the target. xpero-miner
  6. Block
    A header plus its transactions. There is no coinbase transaction: the miner address is a header field and the reward is computed by consensus. The transaction root promotes an odd node rather than duplicating it, so two different lists cannot share a root. xpero-core · block
  7. State transition
    Each transaction is applied in order: the nonce must match exactly, the balance must cover value plus fee. The miner is credited last, so a miner who is also a sender cannot change how the earlier transactions execute. xpero-core · executor
  8. State root
    The resulting sparse merkle root is written into the header and must match on every node, or the block is rejected. Any account's balance can then be proven — or proven absent — against that root. xpero-core · trie

06 — Developers

Run the chain in about a minute

Two binaries: xperovad, the node, and xpero-cli, the wallet and client. Rust 1.82 or newer; no other toolchain required.

Single-node devnet
# build both binaries
cargo build --release
export PATH="$PWD/target/release:$PATH"

# create an account to mine into
xpero-cli wallet new miner

# start a development chain that mines to it
xperovad init --home ~/.xperova-dev --network devnet
xperovad run  --home ~/.xperova-dev --mine \
  --miner-address <your-xpero1-address>
Three-node network & queries
# three local nodes, two of them mining
make devnet          # or ./scripts/devnet.sh start
docker compose up    # the same, in containers

# talk to a node
xpero-cli info
xpero-cli balance --account miner
xpero-cli send --to xpero1... --amount 25 --account miner

# or over JSON-RPC
curl -s localhost:8645/status

07 — Engineering

What the repository currently contains

These are facts about the codebase and its test suite as of v1.0.0. They describe engineering discipline — they are not a security guarantee, and Xperova has not been audited.

  • 8
    Crates
    core, db, chain, net, rpc, miner, node, cli
  • ~13,220
    Lines of Rust
    implementation and tests
  • 220
    Tests passing
    unit and integration
  • 0
    Clippy warnings
    checked with -D warnings

What the tests cover

Bech32m against the BIP-350 vectors; rejection of malleable high-s signatures; trie proofs of presence and of absence; difficulty retargeting in both directions; block execution determinism; mempool nonce and balance accounting; chain reorganisation; two-node propagation and catch-up sync over real sockets; and the JSON-RPC surface driven end to end over HTTP.

What a development network showed

On a local three-node devnet, two competing miners produced blocks and all three nodes converged on the same chain head at block 457. Difficulty retargeted upward as designed, a wallet-signed transfer submitted to one node was mined by another, fees and balances reconciled exactly, and the circulating supply matched the emission schedule to the zep.

Read the specification

Thirteen sections covering the canonical encoding, cryptography, accounts and the state trie, transactions, blocks, proof of work, fork choice, the peer-to-peer protocol, the mempool, issuance — and a closing section on what the design does not do.

Open the Whitepaper

08 — What's next

Identified work, without dates

There is no published roadmap and no committed timeline. What follows is drawn from the whitepaper's stated limitations and from infrastructure the repository does not yet contain.

A public network

The mainnet specification exists but has no bootnodes and no launched genesis. Seed-node infrastructure and a published chain spec are prerequisites for any public chain.

Block explorer

The node already serves the queries an explorer needs over JSON-RPC — blocks, transactions, accounts, proofs — but no explorer front end exists in the repository.

State pruning

Every historical state root stays queryable and disk use grows monotonically. Pruning is a compatible addition: a node that prunes simply cannot answer old queries.

Compact block relay

Blocks are gossiped whole today, so bandwidth scales with block size times peer count. Adequate at the current limits; it would need revisiting if blocks grew.

RPC authentication

The JSON-RPC interface is unauthenticated and binds to loopback by default. Exposing it safely currently requires an authenticating reverse proxy in front of the node.

External review

The codebase has not been audited. Independent review of the consensus rules and the cryptographic handling is work that has been identified but not carried out.