Protocol specification (v0.1)

Normative description of what src/ implements. Where the code and this document disagree, that is a bug in one of them.

Encoding

Addresses

Bech32 (BIP-173). Payload is 21 bytes: scheme (0 = Ed25519, 1 = reserved ML-DSA, 2 = WebAuthn ECDSA P-256: see hardware-wallets.md) ‖ sha256(scheme ‖ pubkey)[0:20]. Human-readable prefix per network: aur (mainnet), taur (testnet), daur (devnet).

Transactions

{ "v": 1, "chainId": "auren-devnet-1", "type": "transfer", "from": "daur1…", "pub": "<64 hex>",
  "nonce": 0, "maxFee": "400000", "tip": "1000", "body": { "to": "daur1…", "amount": "1000000000" }, "sig": "<128 hex>" }

Types and fixed resource costs

typecomputestatebody
transfer21,000100to, amount
delegate60,000250validator, amount
undelegate70,000300validator, amount
claim40,000100validator
createValidator150,000600consPub, commissionBps, moniker, amount
unjail40,000100
registerDomain80,000400name (label or label.tld), years
registerNode60,000300payout (see node-rewards.md)
unregisterNode50,000250
nodeProof60,000150epoch, digest
registerTld100,000500tld, open, price, ownerShareBps (see domains.md)
setTldPolicy50,000200tld, open, price, ownerShareBps
transferTld40,000100tld, newOwner
setDomainTarget40,000100name, target
transferDomain40,000100name, newOwner (resets target and records)
setRecord50,000300name, key (addr:<ns>:<ref> / text:<k> / content), value | null
setPrimary40,000100name | null (only if the name already points to you)
submitProposal200,0001,000title, description, changes{param: value} (see governance.md)
vote50,000150id, option (yes/no/abstain/veto)
setSecurity60,000400guardians[], threshold, delayBlocks, dailyLimit | null
securityCancel40,000100account
recoveryApprove50,000200account, newPub
recoveryCancel40,000100

Each type also declares an access set (keys it may read/write); see fee-market.md.

Block

header: { v, chainId, height, round, time, prevHash, proposer,
          baseFee{compute,state}, txRoot, evidenceRoot, lastCommitHash, receiptsRoot, stateRoot,
          used{compute,state}, txCount }
block:  { header, hash = sha256(canon(header)), txs[], evidence[], lastCommit, sig }   // sig by proposer's consensus key

A block is valid iff: height/parent/chain match; time increases (and is not > local clock + 5 s when proposed); the proposer equals the deterministic draw for (height, round); sig is valid; baseFee equals the value derived from the parent; lastCommit is a valid >⅔ certificate for the parent (height ≥ 2); all roots recompute; usage is within limits; and re-execution yields the committed stateRoot and receiptsRoot.

Block execution order

  1. Evidence: equivocation proofs (two votes of one type, same height and round, different blocks) slash, jail and tombstone. See consensus.md.
  2. Liveness: count validators missing from lastCommit; at window boundaries jail those that missed > maxMissedBps.
  3. Transactions in lane order (conflicting transactions keep block order). Fees accumulate; they are not credited mid-block.
  4. End of block: credit tips to the proposer; mature unbonding entries; execute due recoveries; mint issuance to the previous block's signers (reward-index accounting); update supply and burned; recompute the active set for the next height.

State

Namespaces: acct (balance, nonce, authPub, vesting, security), val, del, unb, dom, rec, meta (supply, burned, activeSet, lastValset). stateRoot is the merkle root over sorted (namespace, key, canon(value)) leaves.

Invariant (tested): supply = Σ balances + Σ bonded tokens + Σ unbonding + Σ accrued-unclaimed rewards.

Staking

Parameters

Defaults live in src/params.js; a genesis file may override any of them. Highlights: blockTimeMs 2000, roundTimeoutMs 4000, maxValidators 150, maxVotingPowerBps 1000, limits {compute 30,000,000; state 200,000}, initialBaseFee {40, 2000}, minBaseFee {10, 500}, issuance {3.0%, −15%/yr, 0.5% floor}, slashing {double-sign 5%, downtime 0.1%}.

Edit this page on GitHub