Architecture
GENESIS has three layers. Contracts hold the rules and verify everything. Operator nodes do the off-chain work. The SDK lets apps and users check that work independently.
┌───────────────────────── Elysium ─────────────────────────┐
dApps ──▶ │ VRF Coordinator Beacon Fair Selection Commit–Reveal │
│ Automation Registry Data Oracle (+ feed proxies) │
│ Fee Manager (HYPE / GENESIS pricing) Staking │
└───────────▲──────────────────────────────────▲─────────────┘
│ proofs, rounds, upkeeps, reports │ reads
┌──────┴───────┐ ┌─────┴─────┐
│ Operator node│ │ SDK / you │
└──────────────┘ └───────────┘Trust model
| Component | Operator can… | Operator cannot… |
|---|---|---|
| VRF / Beacon | Delay or refuse to answer | Choose, bias or fake an output |
| Fair Selection | Delay the draw | Change entrants or winners |
| Automation | Skip its turn (turns rotate between keepers) | Trigger a job that isn't due, or inject data |
| Oracle | Withhold a signature (3 of 8 can be offline) | Move the median: that needs 3 of the 8 signers |
The main residual risk is liveness, not correctness: an operator can stop answering, but it can't lie. Run several operators with separate keys. See Security & limits.
The ECVRF
Each VRF key is a secp256k1 key pair (x, Y = x·G). For an input seed:
H = hashToCurve(Y, seed)
Γ = x · H
proof = (Γ, c, s) a Schnorr-style proof that log_G(Y) = log_H(Γ)
output = keccak256(Γ)Because Γ is unique for a given key and seed, there is exactly one valid output, so the operator has nothing to choose. Elliptic-curve multiplication is expensive in the EVM. The contract avoids it by checking prover-supplied points with the ecrecover precompile, which keeps verification at about 27k gas.
The TypeScript prover in sdk/src/crypto/ecvrf.ts mirrors contracts/lib/ECVRF.sol byte for byte. Anyone can re-run the verification off-chain with GenesisClient.verifyFulfillment(txHash).