Architecture

Core node package map, block validation pipeline, and startup sequence.


The core node is written in Go. It uses libp2p for peer-to-peer networking, BadgerDB for persistent storage, blake2b for proof-of-work, and ed25519 for signatures.

Package Map

core/
├── cmd/
│   └── xe/         Single binary — node daemon, wallet, send/receive, leases, ssh
├── core/           Domain logic — ledger, crypto, encoding, PoW, voting, quorum
├── store/          Pluggable storage — MemStore (testing), BadgerStore (production)
├── net/            libp2p networking — gossip, sync, DHT, marketplace, messaging
├── node/           Orchestration — ties all packages together into a running node
├── api/            HTTP REST API — handler, routes, CORS
├── statechain/     Deterministic state machine — DAO governance, KV store, sync
├── vm/             VM abstraction — manager interface, mock, credentials
├── perf/           Performance certificates — workload benchmark, price multiplier
├── web/            Embedded web UI — HTML + ES modules + CSS, served by xe node --ui
├── client/         Client-side helpers shared by CLI subcommands
├── directory/      P2P account directory — registration, verification, gossip
├── chat/           P2P messaging — envelope format, chat store
└── scripts/        Test and utility scripts — e2e, stress, genesis generation

Core Package Files

FilePurpose
types.goBlock, Vote, Conflict, Lease, PendingSend structs; BlockType constants
ledger.goLedger struct — validates/adds blocks, per-account locking, delegation tracking
amount.goPer-asset decimal precision; micro-unit amount parsing and formatting
crypto.goKeyPair, GenerateKeyPair, HashBlock (SHA-256), SignBlock, VerifyBlock (ed25519)
encoding.goMarshalBlockCanonical (binary encoding), MarshalBlock, UnmarshalBlock; vote encoding
pow.goblake2b PoW — ComputePoW, ComputePoWConcurrent, ComputePoWWithContext, ValidatePoW
vote.goVoteManager — casts and validates votes for conflict resolution
quorum.goQuorumManager — tallies votes, finalizes/rejects blocks at 67% weight
finalization.goTwo-phase finalization voting — the central consensus mechanism
conflict.goConflict detection — equivocation checks
cascade_commit.goConflict-promotion overlay — atomically commits a winning fork's cascade
rollback.goCascading cross-account rollback of rejected forks
spendable.goSpendable-balance computation — settlement surfaces honor finalization
genesis.goEmbedded genesis — loads and validates the genesis allocation at startup
mint.goAuthorized XUSD mint validation — sys.minter accounts only
memo.goOn-chain memo size and validation rules
multisig.goMultisig address derivation, keyset validation, threshold signatures
reputation.goDeterministic per-account reputation from on-chain lease activity
retryable.goClassifies errors that may resolve on retry (missing dependencies)
attestation.goTimekeeper attestation validation for lease blocks
store.goStore interface and optional interfaces

Block Validation Pipeline

AddBlock(b *Block)

  ├── 1. Normalize hex fields (lowercase)
  ├── 2. VerifyBlock — recompute hash + check ed25519 signature
  ├── 3. ValidatePoW — blake2b(nonce || hash) >= difficulty
  ├── 4. Timestamp check — within ±1 hour of local time
  ├── 5. Duplicate check — block hash not already in store
  ├── 6. Conflict detection — check if Previous hash is shared
  │     ├── No conflict → continue on main chain
  │     └── Conflict → stage block, fire callback, return

  ├── 7. Type-specific validation (per-account lock held)
  │     ├── send     → balance sufficient, frontier matches, amount > 0
  │     ├── receive  → pending send exists, destination matches
  │     ├── mint     → XUSD only, account in sys.minter, no source/destination/memo, amount > 0
  │     ├── burn     → XE only, no source/destination, amount > 0, balance sufficient
  │     ├── lease    → XUSD only, cost formula correct, balance sufficient
  │     ├── lease_accept → lease exists, stake = ceil(cost/5), attestations valid
  │     ├── lease_settle → lease expired, XE emission formula
  │     ├── lease_cancel → consumer only, source lease exists and is cancellable
  │     ├── lease_force_settle → consumer only, lease accepted but unsettled
  │     └── multisig_open/update → keyset valid; open derives the account address, update rotates the keyset

  ├── 8. Update in-memory state (asset balances, delegation weights)
  └── 9. Write to store (atomic commit via AtomicBlockStore)

Startup Sequence

  1. Open or create key pair (loads {dataDir}/node.key or generates new)
  2. Open store (BadgerStore at {dataDir}/ledger)
  3. Create libp2p host (TCP, noise encryption, yamux)
  4. Setup pubsub (GossipSub)
  5. Create gossip layers (block, vote, marketplace, directory, state chain)
  6. Setup mDNS
  7. Create ledger (wraps store with validation)
  8. Wire voting (VoteManager + QuorumManager)
  9. Setup frontier sync
  10. Setup DHT (Kademlia)
  11. Create messenger
  12. Initialize state chain
  13. Wire timekeeper config
  14. Register gossip handlers
  15. Dial bootstrap peers
  16. Start background goroutines