Rand ist Open Source. Der Full Node, der Explorer, die Bridge, die Proving-Forschung und die Wallet-Clients liegen jeweils in einem eigenen Repository auf GitHub. Lesen Sie den Code, führen Sie die Tests aus, senden Sie Patches. Diese Seite ist die Übersichtskarte: wo jede Komponente liegt, womit sie gebaut ist, wie weit das Beweissystem gekommen ist und wo es heute endet.
Repositories
| Repository | Inhalt | Sprache |
|---|---|---|
randprotocol/fullnode | Referenz-Full-Node und Wallet: Chained HotStuff BFT, libp2p-Netzwerk, der abgeschirmte RAND-Note-Pool, der zkVM-Proof-Verifier, JSON-RPC, die rand-Wallet-CLI und der delegierte Prover rand-prover. | Rust |
randprotocol/randscan.org | Block-Explorer hinter randscan.org: ein axum-Indexer mit REST- und WebSocket-API über PostgreSQL sowie ein Next.js-Frontend. | Rust · TypeScript |
randprotocol/bridge | Guardian-Bridge für USDT und USDC von Ethereum, Binance Smart Chain, Tron und Solana: die Custody-Contracts, das gemeinsame Attestierungsformat und seine Testvektoren. | Solidity · Rust |
randprotocol/zkp-circuits | Walkthroughs zum Beweissystem (Groth16 vs. STARK, abgeschirmter Pool, Ringsignaturen, Mixer), research/, die Rand-Referenz-zkVM, recursion/, die Rekursions-VM, die Guest-Toolchain und die beiden Translatoren sowie die CUDA-Kernel. Der Build des Fullnode setzt voraus, dass dieses Repository daneben als circuits/ ausgecheckt ist. | Rust |
randprotocol/clients | Die Wallet-Clients: Desktop, Web, iOS und Android. | Rust · Swift · Java · JavaScript |
Der Stack
Rust von Anfang bis Ende. Rand ist eine eigene Chain: ein HotStuff-BFT-Node mit einer libp2p-Gossip-Schicht, einem vollständig abgeschirmten Note-Pool als Ledger, postquantensicheren Signaturen und Note-Verschlüsselung sowie der Rand zkVM für vertrauliche Berechnungen, alles im Fullnode-Repository. Das Beweissystem selbst ist der Teil, an dem aktiv geforscht wird, siehe unten.
| Schicht | Was läuft |
|---|---|
| Konsens | Chained HotStuff BFT, stakegewichtete Quoren, Three-Chain-Commit |
| Netzwerk | libp2p: TCP, Noise, Yamux, gossipsub, Kademlia, mDNS in LANs |
| Ledger | Abgeschirmter Note-Pool: Poseidon2-Baum der Tiefe 32, Nullifier-Menge, ein 4-in-4-out-Bundle mit verborgenem Asset pro Transaktion (2-in-2-out bis Chain 13); seit Chain 17 ein zweiter Auth-Beweis der Stufe 10 neben dem Bundle-Beweis (geteilte Autorisierung); seit Chain 18 Note-Envelopes von 1.860 Byte mit verschlüsseltem Memo |
| Tokens | RPL: Ein Token ist ein Registry-Eintrag im Ledger mit einer rpl1…-ID, kein Contract; er bewegt sich als Notes im selben Pool |
| Staking | Öffentliches Validator-Register: Bond aus einem Bundle, Unbonding über zwei Epochen, Epochen von 1.000 Blöcken; seit Chain 20 wird ein neuer Validator per Abstimmung der Validator-Menge aufgenommen |
| Vertrauliche Berechnung | Rand zkVM: RV32IM unter einem Plonky3-Batch-STARK, ZK-hiding FRI, Constraint-Set 8; seit Chain 18 deklariert ein Aufruf ein Gas-Limit, das die Schaltung erzwingt, und zahlt pro Gas und pro KiB; seit Chain 20 hält ein Programm Zustand in Zellen und Werte in einem Vault (RPL-2) |
| Kryptografie | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| Speicher | Eine RocksDB pro Node, fsync-gesicherte Commits, Integritätsprüfung beim Start; optionales History-Pruning (--prune-history 24h), wobei Archive-Nodes alles behalten |
| Bridge | Von Guardians attestierte Locks auf vier Chains, mit einem Dilithium2-Mitsignatur-Quorum bei jedem Mint; ein überbrückter Asset ist eine Note im selben Pool |
| Sprache | Durchgehend Rust; Solidity für die Bridge, TypeScript für den Explorer |
Eine Relation für jedes Programm
Die universelle Ausführungsrelation R_exec des Whitepapers existiert als Code: rand_zkvm, eine RV32IM-Maschine, bewiesen unter einem einzigen Batch-STARK auf Plonky3 über dem Goldilocks-Körper. Er beweist, dass irgendeine Trace das Programm hc zu diesen öffentlichen Ausgaben ausgeführt hat, auf Eingaben, auf die ein gesalzenes H_IN festlegt, und nichts am Programm ist je ein Parameter des Verifiers. Ein vertrauliches Programm zu veröffentlichen bedeutet, einen Hash zu registrieren, nie, eine maßgeschneiderte Schaltung zu erzeugen.
Das Beweissystem ist transparent, ohne Trusted Setup und ohne Pairing-Kurve, und seine Annahme ist eine kollisionsresistente Hashfunktion. Jede andere Komponente, die mit Beweisen zu tun hat, soll auf dieses Crate konvergieren, statt ein eigenes zu entwickeln. Das Crate liegt in zkp-circuits/research und ist bei Constraint-Set 8 in den Fullnode vendored (circuits aeacf31, Fullnode v0.6.7 und v0.6.8). Die Tabellen und Messungen unten beschreiben Constraint-Set 5 (Meilenstein M4.2), sofern eine Zeile nicht ein späteres Set nennt; sie stammen aus docs/zkvm.md, docs/zkvm-milestones.md und docs/confidential.md des Fullnode, Stand 2026-09-13, und Messwerte werden so angegeben, wie sie auf einem Apple-Silicon-Laptop gemessen wurden, nicht als Zielwerte.
Acht Tabellen auf benannten Bussen, eine neunte bei Bedarf
Eine Festlegung, eine FRI-Öffnung. Tabellen rufen einander nie auf; sie tauschen Fakten über benannte LogUp-Busse aus (PROGRAM, PROGRAM_WORD, MEMORY, ALU, POSEIDON2, INPUT_DIGEST, INPUT_READ, KECCAK sowie die Range- und Nibble-Lookups), und der Verifier prüft, dass jeder Bus global ausgeglichen ist. Der maximale Constraint-Grad jeder Tabelle ist per Test unterhalb der Grenze von 8 festgenagelt, die der FRI-Blowup erlaubt.
| Tabelle | Art | Rolle |
|---|---|---|
program | Witness | Rohe Instruktionswörter, seit M3.4 in der Schaltung dekodiert und von der cpu zu hc digestiert |
cpu | Witness | Eine Zeile pro Zyklus, dazu Digest-Zeilen, die das Programm in hc und die gesalzenen Eingaben in H_IN absorbieren |
memory | Witness | Register und RAM in einer Tabelle, sortiert nach (space, addr, ts); Sub-Word-Zugriff seit M2.5 |
alu | Witness | Byte-Limb-Arithmetik, Shifts, Vergleiche; RV32M-Multiplikation und -Division seit M2.6 |
range | vorberechnet · 256 Zeilen | Range-Checks und der Zweierpotenzen-Lookup |
nibble | vorberechnet · 256 Zeilen | 4-Bit-AND, -OR, -XOR; ein Treffer ist selbst ein Range-Check auf beide Operanden |
poseidon2 | Witness | Eine Zeile pro Permutationsrunde in Blöcken von 32 Zeilen; bedient den POSEIDON2-Bus und beide Digests |
input | Witness · seit M4.1 | Eine Zeile pro privatem Eingabewort; bedient INPUT_DIGEST und INPUT_READ, sodass ein Lesezugriff der Festlegung nicht entkommen kann |
keccak | Witness · optional | Keccak-f[1600] in Blöcken von 32 Zeilen, nur in einem Beweis vorhanden, dessen Guest KECCAK aufgerufen hat (M4.2) |
Seither sind drei Constraint-Sets hinzugekommen. Set 6 fügte eine obligatorische Tabelle public für die beim Deployment festgelegte öffentliche Eingabe eines Programms hinzu, gebunden an den ungesalzenen Digest H_PUB, sowie eine optionale Tabelle sha256 neben keccak. Set 7 (Chain 16) verblindet jeden LogUp-Terminal auf einem neuen BLIND-Bus und setzt für jede deklarierte Tabelle eine Untergrenze von 2⁷ Zeilen, und es fügt den längengebundenen Syscall POSEIDON2_LEN hinzu. Set 8 (Chain 18) fügt der cpu-Tabelle eine Spalte GAS und einen öffentlichen Wert hinzu, das deklarierte GAS_LIMIT.
Was ein Beweis offenlegt
Öffentlich: der Code-Hash hc (acht Digest-Wörter in der Schaltung), die gesalzene Eingabe-Festlegung H_IN (acht Wörter), die Gas-Stufe und acht Ausgabewörter. Seit Constraint-Set 6 auch H_PUB, der Digest der öffentlichen Eingabe, und seit Constraint-Set 8 das deklarierte Gas-Limit. Der Header des Beweises deklariert die Höhen der Keccak- und SHA-256-Tabellen, sodass er zeigt, ob ein Aufruf gehasht hat und, oberhalb der Untergrenze von 2⁷, ungefähr wie viel.
Verborgen: die privaten Eingaben (H_IN ist gesalzen und daher ebenso verbergend wie bindend); jedes Instruktionswort, weil der Verifier hc prüft und nie das Programm; jeder Register- und Speicherwert; jede genommene Verzweigung; die exakte Zyklenzahl und das exakt verbrauchte Gas; und welche Syscalls liefen, abgesehen von dem, was die Höhen der beiden Hash-Tabellen zeigen.
Die Stufe ist pro Beweis öffentlich, weil schon die Größe eines STARK seine Trace-Höhe verrät; den Index zu verbergen brächte nichts. hc ist bindend, nicht verbergend: siehe wo es heute endet.
Gemessen, bei Constraint-Set 5
| FRI | 80 Queries · 20 PoW-Bits · Blowup 8 · Arity 8 · ZK an; 260 Bit vermutet, etwa 86 bewiesen. Der 27-Query-Retune von M2 wurde durch das Audit vom 2026-09-12 zurückgenommen |
| Aufruf | private_payment auf Stufe 10: etwa 7 s zum Beweisen, etwa 1,2 MB Beweis bei 80 Queries (435 KB bei 27), gegenüber 21,6 s und 892 KB bei M1 |
| Transfer | Der 2-in-2-out-Bundle-Guest der Chains bis 13: 3.811 Wörter, etwa 9.160 Zyklen, Stufe 14; etwa 100 s zum Beweisen, etwa 1,3 MB Beweis. Der 4-in-4-out-Guest mit verborgenem Asset von Chain 14 ist an dieselbe Stufe gebunden: etwa 100 s, etwa 1,42 MB |
| Verifizieren | Etwa 16 ms mit warmem Schlüssel; die erste Verifikation bei einem neuen Schlüssel (Stufe, Höhen) dauert etwa 230 ms |
| Block | 4 MiB Budget und eine Beweisobergrenze von 2 MiB: etwa drei abgeschirmte Transfers pro Block bei 80 Queries |
Apple-Silicon-Laptop, Release-Build. Die Aufteilung der Byte-Tabellen in M2.3 hat die Beweiszeit verändert; das 80-Query-Profil hat die Beweisgröße wieder nach oben gebracht. Der Verifier-Schlüssel ist unabhängig vom Programminhalt und wird durch die Stufe sowie die vom Beweis deklarierten Höhen von Programm, Eingabe und Keccak bestimmt, sodass ein Node einen Schlüssel aufwärmt und wiederverwendet.
Spätere Sets haben die Größen verschoben. Unter Constraint-Set 7 ist ein Tier-10-Beweis im Produktionsprofil 1.367.688 Bytes groß, ein Tier-10-Beweis mit Keccak 3.283.898 (gemessen am 2026-09-28). Seit Chain 17 trägt ein Transfer zwei Beweise: den Tier-14-Bundle-Beweis mit etwa 1,49 MB und den Tier-10-Auth-Beweis mit etwa 1,37 MB, dessen Beweiserstellung etwa 7 s dauert. Das Genesis von Chain 20 setzt einen Block von 20 MiB und eine Beweisobergrenze von 4 MiB; ein Aufruf darf Tier 14 nicht überschreiten.
Drei Ziele, ein Schaltkreis
Nur RISC-V wird nativ ausgeführt. Solidity- und Solana-Programme laufen entweder auf einem Interpreter-Guest innerhalb derselben Relation, mit ihrem Bytecode als Eingabe, oder sie werden off-chain in RISC-V-Programme übersetzt, deren Ausgaben Wort für Wort denen des Interpreters entsprechen. Die teuren Opcodes verlangen dedizierte Koprozessor-Tabellen statt einer bitweisen Simulation.
| Ziel | Pfad | Koprozessoren |
|---|---|---|
| RISC-V | Nativ. RV32IM, entweder von Hand über asm.rs assembliert oder als no_std-Rust für riscv32im-unknown-none-elf kompiliert und seit M4.1 als flaches Binärabbild geladen, oder von rand-guest aus Rust oder C in den Image-Container gebaut (Ein Rust-Programm bereitstellen) | Poseidon2 (und POSEIDON2_LEN seit Set 7); Keccak-f[1600] seit M4.2; SHA-256 seit Set 6 |
| Solidity | solc --bin-runtime zu EVM-Bytecode, dann entweder der Interpreter-Guest evm.bin (Bytecode als Eingabe) oder evm2rv, das den Bytecode in C übersetzt, das rand-guest zu einem RV32IM-Image mit denselben Ausgaben baut (Der Ethereum-Transpiler) | Keccak-256 (Tabelle ausgeliefert), modulare 256-Bit-Arithmetik, ECRECOVER, Merkle-Witness-Syscalls für den Speicher |
| Solana / SVM | eine sBPF-ELF-Datei, ausgeführt vom Interpreter-Guest sbpf.bin oder von sbpf2rv in ein RV32IM-Image mit denselben Ausgaben übersetzt (Der Solana-Transpiler) | SHA-256, Ed25519-Verifikation, 64-Bit-Multiplikation |
Meilensteine
Meilenstein 1 hat die Allzweckmaschine bewiesen. Meilenstein 3 machte daraus einen abgeschirmten Pool: Ein Transfer mit Mitgliedschaftsnachweis im Schaltkreis wird unter R_exec bewiesen, und der Verifier prüft hc, ohne je ein Programmwort zu sehen. Meilenstein 4 ist die Kompatibilität: Sein Loader, die Eingabe-Commitment und die Keccak-Tabelle wurden als Constraint-Sets 4 und 5 ausgeliefert, die SHA-256-Tabelle mit Set 6. Die Interpreter-Guests für EVM und sBPF, die rand-guest-Toolchain und die beiden Übersetzer sind gebaut. Der ERC-20-Transfer wurde auf einer Maschine mit 128 GB bewiesen; der SPL-Token-Beweis auf Tier 20 noch nicht. Meilenstein 5 ist die Rekursions-VM hinter der Blockaggregation, die gebaut und auf jeder Chain abgeschaltet ist. Die Constraint-Sets 7 und 8 folgten auf die Reviews vom September und auf das Gasmodell.
| id | Umfang | Abschlusskriterium | Status |
|---|---|---|---|
| M1 | Fünf Tabellen, RV32I-Basis-ISA, HALT/WRITE_OUTPUT/READ_INPUT, ZK aktiv, Tier-Padding, Assembler, Emulator | fib, memcpy, bubble_sort, alu_mix und balance_check werden bewiesen und verifiziert; jeder Betrugstest wird abgelehnt | fertig. 44 Tests; ein späteres Review schloss fünf Soundness-Lücken in einer Welle |
| M1.5 | Einsichtsschlüssel: ein abgeschirmter Transfer-Guest mit einem Eingang und einem Ausgang, Note-Umschläge unter ML-KEM-768 und ChaCha20-Poly1305, partei- und transaktionsbezogene Offenlegung, ein simuliertes Ledger | Ein Transfer wird auf Tier 12 bewiesen und das Ledger akzeptiert ihn; jeder Offenlegungsbereich öffnet genau seine eigenen Zeilen; ein Einsichtsschlüssel kann nichts ausgeben | fertig. Nicht in den Node übernommen |
| M2 | Verifier-Key-Cache, FRI auf ein konjekturales 100-Bit-Ziel neu abgestimmt, die Byte-Tabelle in Range- und Nibble-Tabelle geteilt, Sub-Word-Loads und -Stores, die RV32M-Erweiterung | Enger geliefert als geplant: Der Flat-Binary-Loader und eine festere READ_INPUT-Bindung wurden auf M4.1 verschoben | fertig. fib auf Tier 10: Beweis von 892 KB auf 268 KB, Beweiserstellung von 21,6 s auf 3,1 s, erste Verifikation von 2,17 s auf 16 ms. Constraint-Set 3, ein Hard Fork |
| M3 | Poseidon2-Chip und Syscall; NOTE_COMMIT, NULLIFY und MERKLE_VERIFY als Guest-Routinen darüber; die ausgegebene Commitment aus der öffentlichen Ausgabe entfernt; die Programmtabelle als Witness, mit hc im Schaltkreis gehasht | Die Transfer-Relation wird unter R_exec mit Mitgliedschaft im Schaltkreis bewiesen, und verify(hc, proof) sieht nie ein Programmwort | fertig. Transfer-Guest: 4.554 Instruktionen, 4.903 Zyklen, Tier 14. Der Merkle-Pfad ist nun eine gezählte Schleife, sodass die Programmgröße nicht mehr mit der Baumtiefe wächst |
| CUDA | GPU-Prover-Backend: NTTs und Poseidon2-Merkle-Commitments als CUDA-Kernel hinter den Traits Dft und Mmcs von Plonky3; rand send, call und deploy nehmen --cuda | Jeder Guest wird über den reinen Rust-Referenzzwilling und den Mock-Treiber bewiesen und verifiziert; der CPU-Verifier kann die Backends nicht unterscheiden | fertig; erster Lauf auf Hardware am 2026-09-28. Auf einer NVIDIA H100 werden die Kernel zu PTX für sm_80 und sm_90 gebaut und stimmen mit der CPU- und der Plonky3-Referenz überein. Die Produktionsmessung auf einem GPU-Node der Flotte steht noch aus. Ein CUDA-Aufruf kann keinen Eingabe-Umschlag versiegeln, weil der Salt den Prover nie verlässt |
| M4.1 | Der Flat-Binary-Loader und die ersten kompilierten no_std-Rust-Guests für riscv32im-unknown-none-elf; die gesalzene Eingabe-Commitment H_IN mit eigener Eingabetabelle, sodass READ_INPUT ein Lookup gegen einen committeten Vektor ist | Ein mit der Standard-Toolchain gebauter Guest wird geladen, bewiesen und verifiziert; zwei Lesezugriffe auf denselben Eingabeindex stimmen überein, und die Eingaben sind an H_IN gebunden | fertig. Am 2026-09-11 als Constraint-Set 4 gelandet: 26 öffentliche Werte, acht Tabellen, ein Hard Fork |
| M4.2 | Eine handgeschriebene Keccak-f[1600]-Koprozessor-Tabelle und der KECCAK-Syscall, nur dann in einem Beweis vorhanden, wenn der Guest sie nutzte; vom Beweis deklarierte Speicherhöhe; ein Verifier Key, der auf vier Komponenten beruht; FRI nach dem Audit vom 2026-09-12 zurück auf 80 Queries | keccak256 wird als kompilierter Guest bewiesen, und ein Beweis ohne die Tabelle hat dieselbe Form wie einer aus M4.1, Byte für Byte | fertig. Am 2026-09-12 als Constraint-Set 5 gelandet, ein Hard Fork. Ein Beweis mit Keccak ist etwa 1,9 MB größer und liegt über der Standardobergrenze von 2 MiB. Eine Chain, deren Genesis die Obergrenze anhebt, lässt ihn zu: Chain 13 (8 MiB) nahm am 2026-09-19 einen Aufruf mit Keccak-Beweis von 3,41 MB an, und die Obergrenze von Chain 20 beträgt 4 MiB |
| M4.3 · M4.4 | EVM- und sBPF-Guest-Interpreter, kompiliert zu RV32IM, mit dem fremden Bytecode als Eingabe; eine SHA-256-Koprozessor-Tabelle neben Keccak; dann die rand-guest-Toolchain und die Übersetzer evm2rv und sbpf2rv (2026-09-18) | Ein ERC-20-Transfer und ein SPL Transfer werden jeweils unter R_exec bewiesen | gebaut; ein Abschlussbeweis erbracht. evm.bin (18.009 Wörter) und sbpf.bin (8.317) führen die ERC-20- und SPL-Token-Vektoren aus, und die übersetzten Images stimmen Wort für Wort mit ihnen überein. Der ERC-20-transfer wurde am 2026-09-19 auf Tier 18 auf einem 128-GB-Droplet bewiesen (85,0 GB Spitze, 53,8 min); der SPL-Token-Beweis auf Tier 20 ist auf etwa 330 GB hochgerechnet und wurde nicht erbracht (Speicherbedarf beim Beweisen). Beide sind on-chain nicht aufrufbar: Ein Aufruf ist auf Tier 14 begrenzt |
| M5 | Die Rekursions-VM (rVM): eine Goldilocks-native Maschine mit 24 Instruktionen, deren Programme Rand-zkVM-Beweise verifizieren, ein N-generisches Aggregationsprogramm je Form des inneren Beweises, eine Aufteilung in CPU- und CUDA-Backend und ein Selbstverifizierer (M5.1 bis M5.4, 2026-09-13 bis 2026-09-16) | 50 echte Produktions-Bundle-Beweise akzeptiert und 50 manipulierte am benannten Schritt abgelehnt; ein rVM-Beweis des Verifier-Programms über einen echten Bundle-Beweis verifiziert nativ (Testprofil) | gebaut; Produktionsbeweise brauchen eine große Maschine. Als crates/randprotocol-rvm eingebunden. Die Aggregation auf Chain-Seite ist gemergt und auf jeder Chain abgeschaltet (unten) |
| Set 7 | Jeder LogUp-Terminal geblendet; jede deklarierte Tabelle auf mindestens 2⁷ Zeilen aufgefüllt; 32-Bit-Range-Checks für Eingabe-, öffentliche und Salt-Wörter; der Syscall POSEIDON2_LEN; ein JALR-Fix; Verifier Keys mit Salt aus key_derivation_v2 | Die Korrekturen aus den zkVM-Reviews vom 2026-09-27 und 28, die einen Verifier Key verändern, in einem Schnitt zusammengefasst | fertig. Fullnode v0.6.1, Chain 16 (2026-09-28), ein Hard Fork |
| Set 8 | Der Gas-Zähler: eine GAS-Spalte in der cpu-Tabelle und ein öffentliches GAS_LIMIT, wobei GAS ≤ GAS_LIMIT im Schaltkreis bewiesen wird; das genaue Gas des Laufs bleibt privat | Ein Aufruf zahlt für das Limit, das er deklariert, und jeder Bundle-Beweis deklariert dasselbe festgelegte Limit | fertig. Fullnode v0.6.7-rc1, Chain 18 (2026-09-29), ein Hard Fork. bundle_gas_limit ist 20.479 |
Phasen des abgeschirmten Pools
Das Ledger des Fullnodes entstand in drei Phasen, jede ein Hard Fork (docs/shielded.md §7). S1 ersetzte das Konten-Ledger durch einen Note-Pool; S3 brachte die Bridge als Notes zurück und landete zuerst; S2 setzte das Staking darauf. Alle drei sind auf main und auf der aktuellen Chain.
Jede Zeile unterhalb von S2 gehört zur Arbeit an v0.5. Jede Zeile ist ein Hard Fork. Alle wurden gemeinsam als eine neue Chain umgesetzt, Chain 14, am 2026-09-20 aus dem Build b3c594c geschnitten und am selben Tag als v0.5 getaggt, nach einem Live-zUSD-Roundtrip über die bereitgestellten Source-Endpunkte. Chain 15, live seit 2026-09-26 auf v0.5.8 und später, enthielt alles davon, mit den genesis-gesteuerten Korrekturen der Audits v4 und v5: ein Faucet mit Allowlist und Budget pro Epoche, verzögerte Bond-Aktivierung, eine Obergrenze für das Stake-Gewicht, an das Genesis gebundene Registrierungen, consensus_domain 1, Bridge-Regeln v2 sowie die Obergrenze des Token-Registers, verbrannte Registrierungsgebühr und die Notes-Schranke von 2⁶³. Chain 20, live seit 2026-10-01 06:17 UTC auf v0.6.8 (c9c9bd3c), ein Hard Fork von Chain 19, behält alles bei und ergänzt die Arbeit der v0.6-Versionen, unten aufgeführt.
| id | Umfang | Abschlusskriterium | Status |
|---|---|---|---|
| S1 | Der Pool selbst: Notes, bewiesene 2-in-2-out-Bundles, ein Poseidon2-Commitment-Baum der Tiefe 32 und eine Nullifier-Menge, die rand-Wallet mit lokalem Prover, der geschwärzte RPC | Ein shielded Transfer zwischen Wallets, ein Double-Spend-Wettlauf zwischen zwei Validatoren und ein per Bundles bezahltes Deploy-and-Call bestehen alle in der Cluster-Suite | erledigt. Live auf der öffentlichen Flotte seit Chain 6 (2026-09-12) |
| S3 | Die Bridge als Notes: ein überbrückter Bestand trägt den Asset-Index des Registers, eine Attestierung hinterlegt eine Note, die die Chain selbst berechnet, BridgeBurn ist die eine Transaktion mit zwei Bundles; versiegelte Umschläge für Call-Eingaben, die vom Aufrufer, mit einem Schlüssel pro Call oder von einem benannten Auditor geöffnet werden können | Ein überbrücktes Asset wird als Note geprägt, ausgegeben und verbrannt; ein Aufrufer kann offenlegen, womit ein Programm lief, ohne es zu veröffentlichen, und rand open-call prüft die Öffnung gegen H_IN | erledigt. Als Erstes gelandet. Die Chains 9 bis 13 ließen den Bridge-Abschnitt in ihrem Genesis weg; jede Chain seit 14 enthält ihn. Seit Chain 14 ist ein Burn ein Bundle, nicht zwei |
| S2 | Staking auf der shielded Chain: ein öffentliches Validator-Register, Bond aus dem Burn eines Bundles, Unbond über zwei Epochen, Withdraw in eine Note an einer Auszahlungsadresse, Epochen von 1.000 Blöcken, die die Menge neu ableiten, und ein Supply-Audit über Register und Pool | Ein fünfter Validator registriert sich, bondet und schlägt ab der nächsten Epoche Blöcke vor; einer unbondet aus der Menge und hebt in eine Note ab, die seine Auszahlungs-Wallet ausgibt; beides besteht in der Cluster-Suite | erledigt. Der lokale Commitment-Baum der Wallet folgte am 2026-09-21: eine Wallet berechnet ihre eigenen Witnesses und teilt ihrem Node nicht mehr mit, welches Blatt sie ausgibt |
| RPL | Der Token-Standard (docs/tokens.md): ein Token ist ein Registereintrag im Ledger mit einer 62 Zeichen langen bech32m-ID rpl1…; die Erstellung ist gegen eine Registrierungsgebühr in RAND erlaubnisfrei; die Mint-Berechtigung wird bei der Registrierung festgelegt als keine, ein Schlüssel oder die Bridge; Symbole sind nicht eindeutig; rand token create, mint, set-authority, burn, info, list sowie rand_getTokens, rand_getToken, rand_getTokenSupply | Ein Token wird registriert, geprägt, mit rand send --asset gesendet und als Notes im selben Pool verbrannt | läuft seit Chain 14 (v0.5). Auf Chain 20 beträgt die Registrierungsgebühr 1 RAND und wird verbrannt, das Register fasst höchstens 4.096 Token, und das Genesis führt zUSD bei Index 1 |
| RPL-2 | Programmzustand (docs/program-state.md): Zellen pro Programm (ein Schlüssel aus 8 Wörtern auf einen Wert aus 8 Wörtern, im State Root), ein öffentlicher Vault pro Asset, ein Token, der nur von seinem Programm geprägt wird, und die Aktion Invoke (Action 33), ein Call, der die Zellen deklariert, die er liest und schreibt, sowie die Notes, die er auszahlt; rand program invoke, state, vault sowie rand_getProgramCell, rand_getProgramCells, rand_getProgramVault | Das Ledger wendet einen Übergang nur an, wenn jede deklarierte Lesung noch gilt und der Vault jede Auszahlung deckt; eine veraltete Lesung wird abgelehnt und neu bewiesen | läuft seit Chain 20 (v0.6.8). cell_fee 0,01 RAND pro erstellter Zelle; höchstens 8 Lesungen, 8 Schreibvorgänge und 4 Auszahlungen pro Invoke. Siehe Programme |
| hidden-asset bundle | Jede Transaktion trägt genau ein 4-in-4-out-Bundle anstelle des 2-in-2-out-Bundles: Slots 0–1 halten das private Asset (Dummies bei einem reinen RAND-Transfer), Slots 2–3 sind immer RAND und zahlen die Gebühr. Der Token-Transfer mit zwei Bundles und der Bridge-Burn mit zwei Bundles entfallen | Ein Transfer von RAND und ein Transfer eines beliebigen RPL-Tokens veröffentlichen die identische Form, sodass das bewegte Asset verborgen bleibt | läuft seit Chain 14 (v0.5). Tier 14, etwa 100 s Beweiszeit, etwa 1,42 MB Beweis auf den Chains 14 und 15; hc_bundle dort 83d3a370…. Die Chains 18 bis 20 pinnen Bundle-Guest v3, hc_bundle 60af094a…, etwa 1,49 MB |
| transaction binding | Jeder Bundle-Beweis wird über H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked) erstellt und dagegen verifiziert; der Wert wird im Public-Input-Segment mitgeführt | Ein kopierter, unveränderter Beweis, der mit geändertem Ziel, Validator oder Memo erneut eingereicht wird, wird abgelehnt | läuft seit Chain 14 (v0.5). Seit Chain 20 (binding_domain 1) lautet das Preimage H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …), und jede signierte Aktionsnachricht trägt ebenfalls den Genesis-Hash, sodass nichts, was für eine Chain bewiesen oder signiert wurde, auf einer anderen verifiziert |
| B1–B4 | Bridge-Härtung (docs/bridge.md §§14–20). B1: ein tägliches Mint-Limit pro Backing und ein Pause-Schlüssel, der nur pausieren kann (zum Aufheben der Pause ist das PQ-Quorum nötig). B2: ein Block-Zeitstempel, der mehr als 60 s nach dem seines Vorgängers liegt, ist ungültig, und ein Validator stimmt nicht für einen Block, der seiner Uhr mehr als 15 s voraus ist, daher brauchen Validatoren NTP. B3: ein Dilithium2-Mitsignatur-Quorum auf jedem Mint. B4: das Listen eines überbrückten Tokens oder eines Backings nach dem Genesis unter dem PQ-Guardian-Quorum, ohne Chain-Schnitt | zUSD, ein Token mit sieben Backings (USDT und USDC auf Ethereum, Binance Smart Chain, Tron und Solana), wird per Transaktion registriert, und total_supply == Σ backings.locked gilt konstruktionsbedingt. Das lokale Gate mit neun Phasen (zusd_e2e.rs: vier Validatoren, echte Beweise, Faucet, Registrierung, Einzahlung, Transfer, Burn, Audit) bestand 9 von 9 | läuft seit Chain 14 (v0.5). Auf Chain 20: Mint-Limit 100.000 zUSD pro Tag und Backing plus global 4.000 zUSD je rollierenden 24 Stunden (Bridge-Regeln v2), Guardian-Set 1 mit acht PQ-Guardians, eine Gebühr von 10 bps in zUSD auf jeden Mint und jeden Burn (bridge.fees) sowie Guardian-Rotationen, die Besitz erfordern und 86.400 s warten (bridge.rotation). zUSD ist im Genesis von Chain 20 mit seinen sieben Backings und den beim Schnitt gesperrten 99 zUSD gelistet |
| audit v3 | Die Korrekturen der dritten internen Audit-Runde, geleitet von einem Mitgründer (2026-09-19; es wurde kein unabhängiges Audit durchgeführt). POOL-1: ein Faucet-Mint trägt seine Note-Öffnung (pk, time, r), die Zulassung berechnet das Commitment neu, und der Minter signiert rand-mint-2; auch Genesis-Alloc-Notes tragen eine Öffnung. RPC-1: rand_getWitness(es) führt höchstens zwei Baum-Neuaufbauten gleichzeitig aus und antwortet nach 10 s mit -32000 busy. OPS-1: alle achtzehn Validator-Schlüssel rotiert, außerhalb des Repositorys erzeugt, und kein Schlüssel im Repository nachverfolgt | Ein Mint, dessen Commitment sich auf mehr als seinen Betrag öffnet, wird abgelehnt; nie war ein Schlüssel von Chain 14 im Repository | läuft seit Chain 14 (v0.5). PRIV-1, die Witness-Anfrage, die das Blatt benennt, wurde am 2026-09-21 durch den eigenen Baum der Wallet geschlossen |
Versionen seit v0.5
Jede Version ist ein Git-Tag mit einem Eintrag im CHANGELOG.md des Fullnodes. Eine Version, die den Konsens, das Wire-Format oder einen Verifier-Schlüssel ändert, erscheint mit einer neuen Chain; die anderen werden Node für Node auf die laufende Chain ausgerollt.
| Release | Was es brachte | Chain |
|---|---|---|
| v0.5 bis v0.5.8 | RPL-Tokens, zUSD und die gehärtete Bridge (oben); die Audit-Korrekturen; History Pruning; Härtung von Konsens und Sync | 14, 15 |
| v0.5.9 | Korrekturen am Rescan: Der Faucet prägt nur noch aus Genesis-Validatoren, Sync-Back-off, Gossip-Vorprüfungen | 15 |
| v0.5.10 | Adressweitergabe: Fingerprints, randpay:-Links und QR-Codes; das verschlüsselte Memo, erstmals mit Chain 18 eingeschaltet | 15 |
| v0.5.11 | Zeitgesperrtes Genesis-Vesting für Allokationen an Team, Investoren und Partner. Genesis-gesteuert und auf keiner Chain aktiv | keine |
| v0.6 | Die Korrekturen an zkVM, rVM und Aggregation aus den Reviews vom September | 15 |
| v0.6.1 | Constraint-Satz 7: LogUp-Blinding, eine Tabellenuntergrenze von 2⁷, 32-Bit-Bereichsprüfungen, POSEIDON2_LEN, die JALR-Korrektur. Chain 16 wurde mit hardening_v6 und Bundle-Guest v2 geschnitten | 16 |
| v0.6.2 | Delegiertes Proving, Phase 1: das Binary rand-prover und das --prover der Wallet. Ein Phase-1-Prover erhält den Spend-Schlüssel | 16 |
| v0.6.3, v0.6.4 | Delegiertes Proving, Phase 2: geteilte Autorisierung. Der Bundle-Beweis benötigt den Spend-Schlüssel nicht mehr, ein Tier-10-Auth-Beweis dagegen schon, und die Transaktions-ID-Domäne wird zu rand-txid-3 | 17 |
| v0.6.6, v0.6.7-rc1 | Gas: Constraint-Satz 8, ein deklariertes Gas-Limit pro Beweis, dynamische Gas- und Bytepreise; das Memo eingeschaltet. v0.6.6 wurde nie als Tag geschnitten | 18 |
| v0.6.7 | Korrekturen auf Chain 18, die keine Konsensregel ändern: Pruning versiegelter Beweise (ruhend), die Fixierung des Envelope-Formats, Hygiene der Viewing-Schlüssel, der rVM-Allokator, Aliasing in GPU-Kernels, Testabdeckung der ALU. Getaggt, bevor die vollständige Workspace-Suite durchgelaufen war | 18, 19 |
| v0.6.8 | RPL-2: Programmzellen, Programm-Vaults und die Invoke-Aktion. zUSD-Bridge-Gebühren, in beide Richtungen. Die letzten Audit-v6-Korrekturen: keine automatische Aufhebung von Sperren (CON-4) und ein Pacemaker mit Timeout-Zertifikat (CH-1); ein --public-rpc-Listener, Lesegrenzen, reservierte Validator-Peers, Sync- und Gossip-Budgets, die Byte-Obergrenze des Pools, eine Schranke für den deklarierten Grad im Header eines Beweises (ZKV-4); und genesis-gesteuerte Regeln, die Chain 20 einschaltet: die Bindung an den Genesis-Hash, testnet, ein Beweisfenster von 1.024 Blöcken, Obergrenzen für Gaspreise und die zahlende Byte-Last, Zulassung per Abstimmung, die Obergrenze für den Stake-Eintritt als Bruchteil, Besitznachweis und eine Verzögerung für Bridge-Rotationen. Wallets benötigen diesen Build, um auf Chain 20 zu senden | 20 |
Wo es heute endet
Abweichungen vom Whitepaper, benannt statt geglättet. Jede wird in der eigenen Dokumentation des Crates mit dem Meilenstein verfolgt, der sie schließt.
hcist bindend, aber nicht verbergend: Es trägt kein Salt, sodass ein erratenes Programm bestätigt werden kann und zwei Deployments desselben Programms verknüpfbar sind. Was M3.4 beseitigt hat, ist, dass der Verifier das gesamte Programm im Klartext hält.- Eine vor dem 2026-09-21 gebaute Wallet fragt ihren Node nach Witnesses, und eine Witness-Anfrage benennt das Blatt, das gleich ausgegeben wird. Ein aktuelles
randführt seine eigene Kopie des Baums und fragt nie nach; der Node bedientrand_getWitnessweiterhin für ältere Wallets. - Einzahlungen sind an der Grenze öffentlich: Ein Faucet-Mint, eine Genesis-Note und eine Bridge-Einzahlung tragen ihren Betrag im Klartext (seit Chain 14 tragen ein Mint und eine Genesis-Note auch ihre Öffnung, sodass auch der Besitzerschlüssel öffentlich ist), dieselbe Ein-Hop-Sichtbarkeit, die eine Einzahlung von transparent zu shielded überall hat.
- Zero Knowledge ist statistisch, nicht perfekt. Das ist die Eigenschaft, die das hiding FRI von Plonky3 0.7 tatsächlich bietet, und das Crate sagt das auch.
- Der Transkript-Hash ist Poseidon2 mit Entwicklungs-Rundenkonstanten, nicht SHA3-384 / BLAKE3-384 der Papiere. Ein Konfigurationstausch, kein Neuschreiben.
- Bei 80 FRI-Queries war ein Bundle-Beweis auf den Chains 14 und 15 etwa 1,42 MB groß (bis Chain 13 etwa 1,3 MB). Seit Chain 17 trägt eine Überweisung etwa 2,85 MB Beweis: den Bundle-Beweis mit etwa 1,49 MB und den Auth-Beweis mit etwa 1,37 MB. Auf einer Standard-Chain mit 4-MiB-Blöcken und einer Beweisobergrenze von 2 MiB überschreitet ein Beweis mit Keccak die Beweisobergrenze glatt; das Genesis von Chain 20 setzt 20-MiB-Blöcke und eine Beweisobergrenze von 4 MiB (die Chains 13 bis 16 setzen 8 MiB).
- Der Header eines Aufrufbeweises ist nicht verborgen. Er deklariert das Tier und die Höhen der Keccak- und SHA-256-Tabellen, zeigt also, ob ein Aufruf gehasht hat. Aufrufe, die auf Chain 15 vor der Untergrenze des v0.6-Provers committet wurden, legten mehr offen: Eine private Tabelle unter 2⁷ Zeilen konnte aus dem Beweis ausgelesen werden. Die Untergrenze des v0.6-Provers hat das für neue Aufrufe geschlossen, und Constraint-Satz 7 mit
hardening_v6machte sie ab Chain 16 zu einer Regel der Chain. - Ein Aufruf ist auf Tier 14 begrenzt, mit höchstens 2¹² Keccak-Zeilen (128 Permutationen) und 2¹³ SHA-256-Zeilen (128 Kompressionen), und unter
hardening_v6kann ein Programm mit mehr als 8.180 Wörtern nicht deployt werden. Die Interpreter-Guests für EVM und sBPF sowie die übersetzten Images von ERC-20 und SPL Token liegen alle darüber. - Wer den Witness hält, sieht alles. ZK schützt die Sicht des Verifiers, nicht die des Provers. Seit Chain 17 kann eine Wallet den Bundle-Beweis an einen gekoppelten
rand-proverübergeben, ohne den Spend-Schlüssel herauszugeben, doch dieser Prover hält weiterhin den Viewing-Schlüssel und sieht die Notes. Das CUDA-Backend lief am 2026-09-28 erstmals auf Hardware und hat noch keine Produktionsmessung.
Repository-Struktur
Der Cargo-Workspace des Fullnode, wie in seiner README und seinem Verzeichnis crates/ angelegt.
| Pfad | Was er enthält |
|---|---|
crates/randprotocol-core/ | Reine Logik ohne I/O: Kryptografie, Notes und der Commitment-Baum, Ledger-Regeln, Gas, Genesis, die HotStuff-Zustandsmaschine |
crates/randprotocol-zkvm/ | Die Rand zkVM, aus zkp-circuits/research bei Constraint-Satz 8 übernommen (Circuits aeacf31; mit deploy/sync-zkvm.sh neu abgeglichen), dazu der chainseitige Beweis-Verifier und sein Cache für Verifier-Schlüssel |
crates/randprotocol-rvm/ | Die Rekursions-VM, aus zkp-circuits/recursion übernommen: eine feldnative Maschine, deren Programme Rand-zkVM-Beweise verifizieren |
crates/bridge-codec/ | Das Wire-Format und die Quorumregel der Guardian-Bridge, Byte für Byte geteilt mit den Solidity-Contracts und dem Solana-Programm |
crates/randprotocol-node/ | RocksDB-Speicher, libp2p-Netzwerk, Mempool, Block-Sync, der JSON-RPC-Server und das Binary rand-node |
crates/randprotocol-client/ | Das Wallet-Binary rand und die RpcClient-Bibliothek, ohne Abhängigkeit von RocksDB oder libp2p |
crates/randprotocol-prover/ | Das Binary rand-prover: ein delegierter Prover, der Bundles für gekoppelte Wallets beweist |
deploy/ | Testnet-Genesis-Dateien, nodes.env, Run-Skripte, Cloud-Provisionierung, Cut-over- und Rebuild-Skripte. Seit der Vorbereitung von Chain 14 wird hier kein Schlüssel mehr versioniert |
docs/ | Referenzdokumentation und die Design-Spezifikation |
scripts/ | Lokales Testnet mit zwei Validatoren |
Spezifiziert, noch nicht ausgeliefert
Diese Komponenten sind in den Papieren oder in der Dokumentation des Fullnode beschrieben, laufen aber nicht: Sie fehlen entweder in den Repositories, oder sie sind gebaut und für keine Chain eingeschaltet. Sie sind aufgeführt, damit die Lücke zwischen Spezifikation und Code ablesbar ist, statt erschlossen werden zu müssen.
| Komponente | Status |
|---|---|
| bridge · guardian | Die Guardian- und Relayer-Daemons, die das Attestierungsformat Ende-zu-Ende ausführen; die Contracts, der Codec und die empfangende Hälfte des Fullnode werden ausgeliefert, die Daemons nicht |
| fullnode · aggregation | Block-Aggregation mit der Rekursions-VM: Versiegeln, Pruning und Sync in versiegelter Form. Gebaut und auf jeder Chain ausgeschaltet; rand-node weist ein Genesis mit einem Abschnitt aggregation zurück. Es fehlt noch die Ende-zu-Ende-Übung mit einem gefälschten Aggregat, und es entfernt nur den Bundle-Beweis, nicht den Auth-Beweis. Die rVM-Beweise für die Produktion brauchen eine große Maschine: Unter Constraint-Satz 7 benötigte ein Aggregat aus zwei Beweisen 133 GB, aus dreien 221 GB, und der Exit-Beweis mehr als 256 GB (gemessen am 2026-09-28 und 29; unter Constraint-Satz 8 nicht neu gemessen) |
| fullnode · vesting | Zeitgesperrte Genesis-Allokationen für Team, Investoren und Partner (v0.5.11, docs/vesting.md). Genesis-gesteuert: Ohne einen Abschnitt vesting werden die vier Vesting-Aktionen abgelehnt, und keine Chain hat einen. Das Supply-Audit von Chain 20 meldet jeden Vesting-Zähler als null. Seit v0.6.8 wird ein widerrufbarer Eintrag durch einen Schwellenwert seiner Widerrufenden widerrufen, und nur zugunsten der Treasury, die sein Genesis-Eintrag benennt |
| fullnode · slashing | Slashing und Jailing bei Leader-Equivocation sind in v0.6.8 hinter staking.slashing gebaut und auf Chain 20 ausgeschaltet (ihr Genesis hat keinen, während alle 26 Validator-Schlüssel einem Betreiber gehören). Block-Rewards, das Hash-Sortition-Leader-Beacon, ein Nullifier-Akkumulator und programmübergreifende Aufrufe sind nicht gebaut. Persistenter Zustand pro Programm wurde als RPL-2 ausgeliefert (oben) |
prover/ | GPU-Proving-Daemon: holt Batches aus der Queue, konkurriert bei der Einreichung. Die CUDA-Kernels liegen in zkp-circuits und liefen am 2026-09-28 erstmals auf einer NVIDIA H100; den Markt-Daemon gibt es nicht. rand-prover, der ausgeliefert wird, beweist für die mit ihm gekoppelten Wallets und ist kein Markt |
| zkp-circuits · M4.4-Exit-Beweis | Ein Beweis einer SPL-Token-Überweisung (Tier 20), extrapoliert auf etwa 330 GB. Die ERC-20-Überweisung (Tier 18) wurde am 2026-09-19 auf einem 128-GB-Droplet bewiesen. Keine von beiden kann auf Chain 20 aufgerufen werden, die einen Aufruf auf Tier 14 begrenzt |
Bauen und Testen
Standardmäßiger Rust-Workflow in jedem Repository. Das Fullnode-Repository ist ein einziger Cargo-Workspace mit festgelegter Toolchain und einer Cluster-Testsuite, die echte Nodes über TCP startet. Sein Build setzt voraus, dass das Repository circuits daneben ausgecheckt ist, in einem Verzeichnis namens circuits, und zwar auf dem Commit, aus dem die mitgelieferten Crates synchronisiert wurden (aeacf31 für v0.6.7 und v0.6.8). Die zkVM ist ein eigenständiges Crate in zkp-circuits mit eigener Toolchain-Festlegung und einer Demo, die erläutert, was ein vertraulicher Aufruf offenlegt und was nicht.
Der Fullnode:
git clone https://github.com/randprotocol/fullnode.git
git clone https://github.com/randprotocol/zkp-circuits.git circuits # the sibling directory must be named circuits
git -C circuits checkout "$(sed -n 's/^circuits: //p' fullnode/crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"
cd fullnode
# Rust 1.98.1 is pinned by rust-toolchain.toml; first build pulls RocksDB and Plonky3, 10 to 20 minutes
cargo build --release # target/release/rand-node, target/release/rand, target/release/rand-prover
# All crates; release because STARK proving is slow in debug. One to two hours, mostly proving
cargo test --release
# One machine, two validators
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
Die Forschungs-zkVM in zkp-circuits/research:
# Toolchain is pinned by rust-toolchain.toml; the first build pulls Plonky3
cargo build --release
# Narrated demo: thirteen proofs, one at production FRI parameters (~6-7 min)
cargo run --release
# Emulator, per-table constraints, cheating provers, ZK, end-to-end, viewing keys, compiled guests (395 tests, ~17 min)
cargo test
Die Fullnode-Suite, gemessen bei v0.6.1 auf einer Maschine mit 16 vCPUs: core 521 Tests, node 373, client 117, die Cheating-Prover-Suite 116, die Hidden-Bundle-Cheats 21 (75 Min.), der Wallet-Ablauf 6 (53 Min.), der Cluster 26 (44 Min.) und das zUSD-End-to-End-Gate 2 (51 Min.). Die Produktionsbeweise der Recursion-VM sind darin nicht enthalten und benötigen den oben aufgeführten Arbeitsspeicher.
Running a node beschreibt, wie man dem öffentlichen testnet mit dem Build beitritt; das testnet-Genesis, die Bootstrap-Peers und die Startskripte liegen im Verzeichnis deploy/ des Fullnode, und die Download-Seite enthält die Kurzfassung.
Contribute
Der Fullnode steht unter der GNU General Public License v3.0 (GPL-3.0-only); zuvor stand er unter Apache-2.0. Eröffnen Sie Issues für Fehler und Designvorschläge im Repository, das von der Änderung betroffen ist. Pull Requests sind willkommen: Führen Sie vor dem Einreichen cargo fmt && cargo clippy aus und halten Sie Änderungen eng begrenzt. Die fullnode issues sind der beste Ausgangspunkt.
Die Architektur, die Privacy-Schaltung, der Fee-Token-Beweis und der Post-Quanten-Kompromiss sind im Whitepaper auf der Papers-Seite dokumentiert. Das Verzeichnis docs/ des Fullnode-Repositorys ist die Quelle, gegen die jede Seite dieser Dokumentation geprüft wird.