Rand jest oprogramowaniem open source. Pełny węzeł, eksplorator, most, badania nad dowodzeniem i klienty portfela mają każdy własne repozytorium na GitHub. Czytaj kod, uruchamiaj testy, wysyłaj poprawki. Ta strona to mapa: gdzie mieszka każdy komponent, w czym jest zbudowany, jak daleko zaszedł system dowodzenia i gdzie dziś się kończy.
Repozytoria
| repozytorium | zawartość | język |
|---|---|---|
randprotocol/fullnode | Referencyjny pełny węzeł i portfel: łańcuchowy HotStuff BFT, sieć libp2p, osłonięta pula notatek RAND, weryfikator dowodów zkVM, JSON-RPC, portfel CLI rand i delegowany prover rand-prover. | Rust |
randprotocol/randscan.org | Eksplorator bloków stojący za randscan.org: indekser axum z API REST i WebSocket nad PostgreSQL oraz frontend w Next.js. | Rust · TypeScript |
randprotocol/bridge | Most strażniczy (guardian) dla USDT i USDC z Ethereum, Binance Smart Chain, Tron i Solana: kontrakty powiernicze, wspólny format poświadczeń i jego wektory testowe. | Solidity · Rust |
randprotocol/zkp-circuits | Omówienia systemów dowodzenia (Groth16 a STARK, osłonięta pula, podpisy pierścieniowe, mikser), research/, referencyjna zkVM Rand, recursion/, maszyna wirtualna rekurencji, łańcuch narzędzi dla gościa i oba translatory oraz jądra CUDA. Budowa fullnode wymaga, by to repozytorium było pobrane obok jako circuits/. | Rust |
randprotocol/clients | Klienty portfela: desktop, web, iOS i Android. | Rust · Swift · Java · JavaScript |
Stos
Rust od początku do końca. Rand to własny łańcuch: węzeł HotStuff BFT z warstwą plotkowania libp2p, w pełni osłonięta pula notatek jako księga, podpisy i szyfrowanie notatek odporne na ataki kwantowe oraz zkVM Rand do poufnych obliczeń, wszystko w repozytorium fullnode. Sam system dowodzenia jest częścią objętą aktywnymi badaniami, opisaną niżej.
| warstwa | co działa |
|---|---|
| Konsensus | Łańcuchowy HotStuff BFT, kworum ważone stawką, zatwierdzenie trzech łańcuchów |
| Sieć | libp2p: TCP, Noise, Yamux, gossipsub, Kademlia, mDNS w sieciach LAN |
| Księga | Osłonięta pula notatek: drzewo Poseidon2 o głębokości 32, zbiór nullifierów, jeden pakiet 4-in-4-out z ukrytym aktywem na transakcję (2-in-2-out do łańcucha 13); od łańcucha 17 drugi dowód autoryzacji tier-10 obok dowodu pakietu (rozdzielona autoryzacja); od łańcucha 18 koperty notatek o rozmiarze 1860 bajtów z zaszyfrowanym memo |
| Tokeny | RPL: token to wpis w rejestrze księgi z identyfikatorem rpl1…, a nie kontrakt; przemieszcza się jako notatki w tej samej puli |
| Staking | Publiczny rejestr walidatorów: depozyt z pakietu, dwuepokowe wycofywanie, epoki po 1000 bloków; od łańcucha 20 nowy walidator jest przyjmowany głosowaniem zbioru |
| Poufne obliczenia | zkVM Rand: RV32IM pod wsadowym STARK Plonky3, FRI z ukrywaniem ZK, zestaw ograniczeń 8; od łańcucha 18 wywołanie deklaruje limit gazu egzekwowany przez układ i płaci za gaz oraz za KiB; od łańcucha 20 program przechowuje stan w komórkach i trzyma wartość w skarbcu (RPL-2) |
| Kryptografia | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| Przechowywanie | Jedna baza RocksDB na węzeł, zatwierdzenia z fsync, kontrola integralności przy starcie; opcjonalne przycinanie historii (--prune-history 24h), przy czym węzły archiwalne zachowują wszystko |
| Most | Blokady poświadczane przez strażników na czterech łańcuchach, z kworum współpodpisów Dilithium2 przy każdym wybiciu; aktywo mostowane to notatka w tej samej puli |
| Język | Rust w całości; Solidity dla mostu, TypeScript dla eksploratora |
Jedna relacja dla każdego programu
Uniwersalna relacja wykonania R_exec z whitepaperu istnieje jako kod: rand_zkvm, maszyna RV32IM dowodzona pod jednym wsadowym STARK na Plonky3 nad ciałem Goldilocks. Dowodzi, że jakiś ślad wykonał program hc do tych publicznych wyjść na wejściach zobowiązanych przez solone H_IN, a nic o programie nigdy nie jest parametrem weryfikatora. Opublikowanie poufnego programu oznacza zarejestrowanie skrótu, nigdy generowanie dedykowanego układu.
System dowodzenia jest przejrzysty, bez zaufanej konfiguracji i bez krzywej z iloczynem dwuliniowym, a jego założeniem jest odporna na kolizje funkcja skrótu. Oczekuje się, że każdy inny komponent dotykający dowodów będzie zmierzał do tego crate’a, zamiast rozwijać własny. Crate mieści się w zkp-circuits/research i jest wendorowany do fullnode przy zestawie ograniczeń 8 (circuits aeacf31, fullnode v0.6.7 i v0.6.8). Poniższe tabele i pomiary opisują zestaw ograniczeń 5 (kamień milowy M4.2), chyba że wiersz wskazuje późniejszy zestaw; pochodzą z docs/zkvm.md, docs/zkvm-milestones.md i docs/confidential.md fullnode według stanu na 2026-09-13, a pomiary podano tak, jak je zmierzono na laptopie z Apple Silicon, nie jako cele.
Osiem tabel na nazwanych szynach, dziewiąta na żądanie
Jedno zobowiązanie, jedno otwarcie FRI. Tabele nigdy nie wywołują się nawzajem; wymieniają fakty przez nazwane szyny LogUp (PROGRAM, PROGRAM_WORD, MEMORY, ALU, POSEIDON2, INPUT_DIGEST, INPUT_READ, KECCAK oraz wyszukiwania zakresów i półbajtów), a weryfikator sprawdza, czy każda szyna bilansuje się globalnie. Maksymalny stopień ograniczeń każdej tabeli jest przypięty testem pod limitem 8, na jaki pozwala rozszerzenie FRI (blowup).
| tabela | rodzaj | rola |
|---|---|---|
program | świadek | Surowe słowa instrukcji dekodowane w układzie od M3.4, skracane przez cpu do hc |
cpu | świadek | Jeden wiersz na cykl, plus wiersze skrótu, które wchłaniają program do hc, a solone wejścia do H_IN |
memory | świadek | Rejestry i RAM w jednej tabeli, posortowane według (space, addr, ts); dostęp poniżej słowa od M2.5 |
alu | świadek | Arytmetyka na bajtowych kończynach, przesunięcia, porównania; mnożenie i dzielenie RV32M od M2.6 |
range | wstępnie przetworzona · 256 wierszy | Kontrole zakresu i wyszukiwanie potęg dwójki |
nibble | wstępnie przetworzona · 256 wierszy | 4-bitowe AND, OR, XOR; trafienie jest samo w sobie kontrolą zakresu obu operandów |
poseidon2 | świadek | Jeden wiersz na rundę permutacji w blokach po 32 wiersze; obsługuje szynę POSEIDON2 i oba skróty |
input | świadek · od M4.1 | Jeden wiersz na prywatne słowo wejściowe; obsługuje INPUT_DIGEST i INPUT_READ, więc odczyt nie może uciec spod zobowiązania |
keccak | świadek · opcjonalna | Keccak-f[1600] w blokach po 32 wiersze, obecna tylko w dowodzie, w którym gość wywołał KECCAK (M4.2) |
Od tego czasu pojawiły się trzy zestawy ograniczeń. Zestaw 6 dodał obowiązkową tabelę public dla publicznego wejścia programu podawanego przy wdrożeniu, związaną z niesolonym skrótem H_PUB, oraz opcjonalną tabelę sha256 obok keccak. Zestaw 7 (łańcuch 16) zaślepia każdy terminal LogUp na nowej szynie BLIND, ustala dla każdej zadeklarowanej tabeli dolną granicę 2⁷ wierszy i dodaje syscall POSEIDON2_LEN związany długością. Zestaw 8 (łańcuch 18) dodaje kolumnę GAS do tabeli cpu i jedną wartość publiczną, zadeklarowany GAS_LIMIT.
Co ujawnia dowód
Publiczne: skrót kodu hc (osiem słów skrótu w układzie), solone zobowiązanie wejścia H_IN (osiem słów), poziom gazu i osiem słów wyjścia. Od zestawu ograniczeń 6 także H_PUB, skrót publicznego wejścia, a od zestawu ograniczeń 8 zadeklarowany limit gazu. Nagłówek dowodu deklaruje wysokości tabel Keccak i SHA-256, więc pokazuje, czy wywołanie używało skrótów i, powyżej dolnej granicy 2⁷, mniej więcej w jakim stopniu.
Ukryte: prywatne wejścia (H_IN jest solone, więc jest zarówno ukrywające, jak i wiążące); każde słowo instrukcji, ponieważ weryfikator sprawdza hc, a nigdy program; każda wartość rejestru i pamięci; każda wykonana gałąź; dokładna liczba cykli i dokładnie zużyty gaz; oraz to, które syscalle zostały uruchomione, poza tym, co pokazują wysokości dwóch tabel skrótów.
Poziom jest publiczny w każdym dowodzie, ponieważ rozmiar STARK już ujawnia wysokość jego śladu; ukrycie indeksu nic by nie dało. hc jest wiążący, nie ukrywający: zobacz gdzie to dziś się kończy.
Zmierzone, przy zestawie ograniczeń 5
| FRI | 80 zapytań · 20 bitów PoW · blowup 8 · arity 8 · ZK włączone; 260 bitów w sensie przypuszczalnym, około 86 udowodnionych. Dostrojenie M2 do 27 zapytań zostało cofnięte przez audyt z 2026-09-12 |
| Wywołanie | private_payment na poziomie 10: około 7 s dowodzenia, około 1,2 MB dowodu przy 80 zapytaniach (435 KB przy 27), w porównaniu z 21,6 s i 892 KB w M1 |
| Transfer | Gość pakietu 2-in-2-out z łańcuchów do 13: 3811 słów, około 9160 cykli, poziom 14; około 100 s dowodzenia, około 1,3 MB dowodu. Gość z ukrytym aktywem 4-in-4-out z łańcucha 14 jest przypięty do tego samego poziomu: około 100 s, około 1,42 MB |
| Weryfikacja | Około 16 ms z ciepłym kluczem; pierwsza weryfikacja przy nowym kluczu (poziom, wysokości) trwa około 230 ms |
| Blok | Budżet 4 MiB i limit dowodów 2 MiB: około trzech osłoniętych transferów na blok przy 80 zapytaniach |
Laptop z Apple Silicon, build release. To podział tabeli bajtowej w M2.3 przesunął czas dowodzenia; profil 80 zapytań z powrotem podniósł rozmiar dowodu. Klucz weryfikatora nie zależy od zawartości programu, jest indeksowany poziomem oraz zadeklarowanymi w dowodzie wysokościami programu, wejścia i keccaka, więc węzeł rozgrzewa jeden klucz i używa go ponownie.
Późniejsze zestawy zmieniły rozmiary. W zestawie ograniczeń 7 dowód tier 10 ma 1 367 688 bajtów w profilu produkcyjnym, a dowód tier 10 zawierający Keccak 3 283 898 (pomiar z 2026-09-28). Od chain 17 transfer niesie dwa dowody: dowód pakietu tier 14, około 1,49 MB, oraz dowód autoryzacji tier 10, około 1,37 MB, którego wygenerowanie trwa około 7 s. Genesis chain 20 ustala blok o rozmiarze 20 MiB i limit dowodu 4 MiB, a wywołanie nie może przekroczyć tier 14.
Trzy cele, jeden obwód
Natywnie wykonuje się tylko RISC-V. Programy Solidity i Solana działają albo na gościu-interpreterze wewnątrz tej samej relacji, z ich bajtkodem jako wejściem, albo są tłumaczone poza łańcuchem na programy RISC-V, których wyjścia są identyczne z wyjściami interpretera słowo w słowo. Kosztowne kody operacji wymagają dedykowanych tabel koprocesorów zamiast symulacji bit po bicie.
| cel | ścieżka | koprocesory |
|---|---|---|
| RISC-V | Natywnie. RV32IM, albo składany ręcznie przez asm.rs, albo skompilowany no_std Rust dla riscv32im-unknown-none-elf, ładowany jako płaski plik binarny od M4.1, albo zbudowany z Rusta lub C przez rand-guest do kontenera obrazu (Wdrażanie programu w Ruście) | Poseidon2 (oraz POSEIDON2_LEN od zestawu 7); Keccak-f[1600] od M4.2; SHA-256 od zestawu 6 |
| Solidity | solc --bin-runtime do bajtkodu EVM, a następnie albo gość-interpreter evm.bin (bajtkod jako wejście), albo evm2rv, który tłumaczy bajtkod na C, z którego rand-guest buduje obraz RV32IM o tych samych wyjściach (Transpiler Ethereum) | Keccak-256 (tabela dostarczona), arytmetyka modularna 256-bitowa, ECRECOVER, wywołania systemowe ze świadkami Merkle dla pamięci trwałej |
| Solana / SVM | plik ELF sBPF, uruchamiany przez gościa-interpretera sbpf.bin albo tłumaczony przez sbpf2rv na obraz RV32IM o tych samych wyjściach (Transpiler Solana) | SHA-256, weryfikacja Ed25519, mnożenie 64-bitowe |
Kamienie milowe
Kamień milowy 1 udowodnił maszynę ogólnego przeznaczenia. Kamień milowy 3 zamienił ją w pulę chronioną (shielded pool): transfer z przynależnością dowodzoną w obwodzie jest dowodzony w R_exec, a weryfikator sprawdza hc, nie widząc ani jednego słowa programu. Kamień milowy 4 to zgodność: jego loader, zobowiązanie do wejścia i tabela Keccak zostały dostarczone jako zestawy ograniczeń 4 i 5, a tabela SHA-256 wraz z zestawem 6. Gości-interpreterów EVM i sBPF, zestaw narzędzi rand-guest oraz oba translatory zbudowano. Transfer ERC-20 został udowodniony na maszynie ze 128 GB; dowód SPL Token, na tier 20, jeszcze nie. Kamień milowy 5 to maszyna wirtualna rekurencji stojąca za agregacją bloków, która jest zbudowana i wyłączona w każdym łańcuchu. Zestawy ograniczeń 7 i 8 powstały po przeglądach z września i modelu gazu.
| id | zakres | kryterium wyjścia | status |
|---|---|---|---|
| M1 | Pięć tabel, bazowa ISA RV32I, HALT/WRITE_OUTPUT/READ_INPUT, ZK włączone, dopełnianie do tier, asembler, emulator | fib, memcpy, bubble_sort, alu_mix i balance_check są dowodzone i weryfikowane; każdy test oszustwa jest odrzucany | zrobione. 44 testy; późniejszy przegląd zamknął pięć luk w poprawności (soundness) w jednej fali |
| M1.5 | Klucze podglądu (viewing keys): gość transferu chronionego jeden-do-jednego, koperty notatek w ML-KEM-768 i ChaCha20-Poly1305, ujawnianie ograniczone do strony i do transakcji, symulowana księga | Transfer jest dowodzony na tier 12, a księga go akceptuje; każdy zakres ujawnienia otwiera dokładnie własne wiersze; klucz podglądu nie może wydawać | zrobione. Nie włączone do węzła |
| M2 | Pamięć podręczna kluczy weryfikatora, FRI przestrojony na cel 100 bitów (conjectured), tabela bajtów podzielona na zakresową i półbajtową, ładowania i zapisy poniżej słowa, rozszerzenie RV32M | Dostarczone węziej niż zakładano: loader płaskich plików binarnych i mocniejsze powiązanie READ_INPUT przeniesiono do M4.1 | zrobione. fib na tier 10: dowód z 892 KB do 268 KB, dowodzenie z 21,6 s do 3,1 s, pierwsza weryfikacja z 2,17 s do 16 ms. Zestaw ograniczeń 3, hard fork |
| M3 | Układ i wywołanie systemowe Poseidon2; NOTE_COMMIT, NULLIFY i MERKLE_VERIFY jako procedury gościa nad nim; wydane zobowiązanie usunięte z wyjścia publicznego; tabela programu jako świadek z hc obliczanym jako skrót w obwodzie | Relacja transferu jest dowodzona w R_exec z przynależnością w obwodzie, a verify(hc, proof) nigdy nie widzi słowa programu | zrobione. Gość transferu: 4 554 instrukcje, 4 903 cykle, tier 14. Przejście po drzewie Merkle jest teraz pętlą zliczaną, więc rozmiar programu nie rośnie już z głębokością drzewa |
| CUDA | Backend dowodzący na GPU: NTT i zobowiązania Merkle Poseidon2 jako jądra CUDA za cechami Dft i Mmcs Plonky3; rand send, call i deploy przyjmują --cuda | Każdy gość jest dowodzony i weryfikowany przez czysto rustowy bliźniak referencyjny i sterownik mock; weryfikator CPU nie odróżnia backendów | zrobione; pierwsze uruchomienie na sprzęcie 2026-09-28. Na NVIDIA H100 jądra kompilują się do PTX dla sm_80 i sm_90 i zgadzają się z referencjami CPU i Plonky3. Produkcyjny pomiar na węźle GPU floty jest jeszcze do wykonania. Wywołanie CUDA nie może zapieczętować koperty wejścia, ponieważ sól nigdy nie opuszcza dowodzącego (prover) |
| M4.1 | Loader płaskich plików binarnych i pierwsi skompilowani goście no_std Rust dla riscv32im-unknown-none-elf; solone zobowiązanie do wejścia H_IN z własną tabelą wejścia, tak że READ_INPUT jest wyszukiwaniem w zobowiązanym wektorze | Gość zbudowany standardowym zestawem narzędzi ładuje się, jest dowodzony i weryfikowany; dwa odczyty tego samego indeksu wejścia zgadzają się, a wejścia są związane z H_IN | zrobione. Wdrożone 2026-09-11 jako zestaw ograniczeń 4: 26 wartości publicznych, osiem tabel, hard fork |
| M4.2 | Ręcznie napisana tabela koprocesora Keccak-f[1600] i wywołanie systemowe KECCAK, obecne w dowodzie tylko wtedy, gdy gość z niego korzystał; wysokość pamięci deklarowana w dowodzie; klucz weryfikatora zależny od czterech składników; FRI z powrotem na 80 zapytań po audycie z 2026-09-12 | keccak256 jest dowodzony jako skompilowany gość, a dowód bez tabeli ma kształt identyczny bajt w bajt z dowodem z M4.1 | zrobione. Wdrożone 2026-09-12 jako zestaw ograniczeń 5, hard fork. Dowód z Keccakiem jest większy o około 1,9 MB, ponad domyślny limit 2 MiB. Łańcuch, którego genesis podnosi limit, go przyjmuje: chain 13 (8 MiB) przyjął 2026-09-19 wywołanie z Keccakiem o rozmiarze 3,41 MB, a limit chain 20 wynosi 4 MiB |
| M4.3 · M4.4 | Interpretery gości EVM i sBPF skompilowane do RV32IM, z obcym bajtkodem jako wejściem; tabela koprocesora SHA-256 obok Keccaka; następnie zestaw narzędzi rand-guest oraz translatory evm2rv i sbpf2rv (2026-09-18) | Transfer ERC-20 i SPL Transfer są dowodzone w R_exec | zbudowane; jeden dowód wyjścia wykonany. evm.bin (18 009 słów) i sbpf.bin (8 317) uruchamiają wektory ERC-20 i SPL Token, a przetłumaczone obrazy zgadzają się z nimi słowo w słowo. transfer ERC-20 został udowodniony na tier 18 na droplecie ze 128 GB 2026-09-19 (szczyt 85,0 GB, 53,8 min); dowód SPL Token, na tier 20, jest ekstrapolowany na około 330 GB i nie został wykonany (pamięć dowodzenia). Żaden nie jest wywoływalny w łańcuchu: wywołanie jest ograniczone do tier 14 |
| M5 | Maszyna wirtualna rekurencji (rVM): 24-instrukcyjna maszyna natywna dla Goldilocks, której programy weryfikują dowody Rand zkVM, jeden N-generyczny program agregujący na kształt dowodu wewnętrznego, podział na backend CPU i CUDA oraz samoweryfikator (M5.1 do M5.4, 2026-09-13 do 2026-09-16) | 50 prawdziwych produkcyjnych dowodów pakietów zaakceptowanych i 50 zmanipulowanych odrzuconych na wskazanym kroku; dowód rVM programu weryfikatora dla jednego prawdziwego dowodu pakietu weryfikuje się natywnie (profil testowy) | zbudowane; dowody produkcyjne wymagają dużej maszyny. Włączone jako crates/randprotocol-rvm. Agregacja po stronie łańcucha jest scalona i wyłączona w każdym łańcuchu (poniżej) |
| set 7 | Każdy terminal LogUp zaślepiony; każda zadeklarowana tabela z dolnym progiem 2⁷ wierszy; 32-bitowe kontrole zakresu słów wejścia, publicznych i soli; wywołanie systemowe POSEIDON2_LEN; poprawka JALR; klucze weryfikatora solone z key_derivation_v2 | Poprawki z przeglądów zkVM z 2026-09-27 i 28, które zmieniają klucz weryfikatora, wprowadzone jednym cięciem | zrobione. Fullnode v0.6.1, chain 16 (2026-09-28), hard fork |
| set 8 | Licznik gazu: kolumna GAS w tabeli cpu i publiczny GAS_LIMIT, z GAS ≤ GAS_LIMIT dowodzonym w obwodzie; dokładny gaz przebiegu pozostaje prywatny | Wywołanie płaci za limit, który deklaruje, a każdy dowód pakietu deklaruje ten sam przypięty limit | zrobione. Fullnode v0.6.7-rc1, chain 18 (2026-09-29), hard fork. bundle_gas_limit wynosi 20 479 |
Fazy puli chronionej
Księga fullnode została wdrożona w trzech fazach, z których każda była hard forkiem (docs/shielded.md §7). S1 zastąpiła księgę kont pulą notatek; S3 przywróciła most jako notatki i weszła jako pierwsza; S2 dołożyła na wierzchu staking. Wszystkie trzy są na main i na bieżącym łańcuchu.
Od wiersza S2 w dół znajduje się praca nad v0.5. Każdy wiersz to twardy fork. Wszystkie razem weszły do jednego nowego łańcucha, chain 14, wydzielonego 2026-09-20 z kompilacji b3c594c i otagowanego jako v0.5 tego samego dnia, po przejściu na żywo pełnego cyklu zUSD przez wdrożone punkty końcowe źródeł. Chain 15, działający od 2026-09-26 na v0.5.8 i nowszych, zawierał całość, z włączonymi poprawkami audytów v4 i v5 zależnymi od genesis: faucet z listą dozwolonych i budżetem na epokę, opóźniona aktywacja bondu, limit wagi stawki, rejestracje powiązane z genesis, consensus_domain 1, reguły mostu v2 oraz limit rejestru tokenów, spalana opłata rejestracyjna i granica 2⁶³ dla not. Chain 20, działający od 2026-10-01 06:17 UTC na v0.6.8 (c9c9bd3c), będący twardym forkiem chain 19, zachowuje to wszystko i dodaje prace z wydań v0.6, wymienione poniżej.
| id | zakres | kryterium wyjścia | status |
|---|---|---|---|
| S1 | Sama pula: noty, udowodnione pakiety 2-in-2-out, drzewo zobowiązań Poseidon2 o głębokości 32 i zbiór nullifierów, portfel rand z lokalnym proverem, zredagowane RPC | Transfer osłonięty między portfelami, wyścig podwójnego wydania między dwoma validatorami oraz wdrożenie i wywołanie opłacone pakietami przechodzą w zestawie testów klastra | gotowe. Na publicznej flocie od chain 6 (2026-09-12) |
| S3 | Most jako noty: aktywo z mostu niesie indeks aktywa z rejestru, attestation wpłaca jedną notę, którą łańcuch oblicza sam, BridgeBurn jest jedyną transakcją z dwoma pakietami; zapieczętowane koperty na wejścia wywołań, które może otworzyć wywołujący, klucz per wywołanie lub wskazany audytor | Aktywo z mostu zostaje wybite, wydane i spalone jako nota; wywołujący może ujawnić, na czym program działał, bez publikowania tego, a rand open-call sprawdza otwarcie względem H_IN | gotowe. Weszło jako pierwsze. Chain 9 do 13 pomijały sekcję mostu w genesis; każdy łańcuch od 14 ją zawiera. Od chain 14 spalenie to jeden pakiet, nie dwa |
| S2 | Staking na osłoniętym łańcuchu: publiczny rejestr validatorów, Bond z spalenia pakietu, Unbond w ciągu dwóch epok, Withdraw do noty pod adresem wypłaty, epoki po 1 000 bloków, które wyprowadzają zbiór na nowo, oraz audyt podaży obejmujący rejestr i pulę | Piąty validator rejestruje się, wnosi bond i proponuje bloki od następnej epoki; jeden wychodzi ze zbioru przez unbond i wypłaca do noty, którą wydaje jego portfel wypłat; oba przypadki przechodzą w zestawie testów klastra | gotowe. Lokalne drzewo zobowiązań portfela doszło 2026-09-21: portfel sam oblicza swoje świadectwa i nie mówi już swojemu węzłowi, który liść wydaje |
| RPL | Standard tokenów (docs/tokens.md): token to wpis rejestru w księdze z 62-znakowym identyfikatorem bech32m rpl1…; tworzenie jest bez zezwoleń za opłatą rejestracyjną w RAND; uprawnienie do emisji jest ustalane przy rejestracji jako brak, klucz lub most; symbole nie są unikalne; rand token create, mint, set-authority, burn, info, list oraz rand_getTokens, rand_getToken, rand_getTokenSupply | Token zostaje zarejestrowany, wybity, wysłany przez rand send --asset i spalony jako noty w tej samej puli | działa od chain 14 (v0.5). Na chain 20 opłata rejestracyjna wynosi 1 RAND i jest spalana, rejestr mieści co najwyżej 4 096 tokenów, a genesis wymienia zUSD pod indeksem 1 |
| RPL-2 | Stan programu (docs/program-state.md): komórki per program (8-słowny klucz do 8-słowej wartości, w korzeniu stanu), publiczny skarbiec na aktywo, token emitowany wyłącznie przez swój program oraz akcja Invoke (Action 33), czyli wywołanie, które deklaruje komórki, jakie czyta i zapisuje, oraz noty, które wypłaca; rand program invoke, state, vault oraz rand_getProgramCell, rand_getProgramCells, rand_getProgramVault | Księga stosuje przejście tylko wtedy, gdy każdy zadeklarowany odczyt nadal jest aktualny, a skarbiec pokrywa każdą wypłatę; nieaktualny odczyt jest odrzucany i dowodzony ponownie | działa od chain 20 (v0.6.8). cell_fee 0,01 RAND za utworzoną komórkę; co najwyżej 8 odczytów, 8 zapisów i 4 wypłaty na invoke. Zobacz Programy |
| pakiet z ukrytym aktywem | Każda transakcja niesie dokładnie jeden pakiet 4-in-4-out zamiast pakietu 2-in-2-out: sloty 0–1 zawierają aktywo prywatne (atrapy przy transferze samego RAND), sloty 2–3 to zawsze RAND i płacą opłatę. Transfer tokenu z dwoma pakietami i spalenie z mostu z dwoma pakietami znikają | Transfer RAND i transfer dowolnego tokenu RPL publikują identyczny kształt, więc aktywo, które się przemieściło, jest ukryte | działa od chain 14 (v0.5). Tier 14, około 100 s dowodzenia, około 1,42 MB dowodu na chain 14 i 15; hc_bundle 83d3a370… tamże. Chain 18 do 20 przypinają guest pakietu v3, hc_bundle 60af094a…, około 1,49 MB |
| wiązanie transakcji | Każdy dowód pakietu jest tworzony nad H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked) i względem niego weryfikowany; wartość jest niesiona w segmencie wejść publicznych | Skopiowany, niezmodyfikowany dowód przesłany ponownie ze zmienionym adresatem, validatorem lub memo zostaje odrzucony | działa od chain 14 (v0.5). Od chain 20 (binding_domain 1) przedobraz to H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …), a każda podpisana wiadomość akcji niesie także hash genesis, więc nic, co udowodniono lub podpisano dla jednego łańcucha, nie weryfikuje się na innym |
| B1–B4 | Utwardzenie mostu (docs/bridge.md §§14–20). B1: dzienny limit emisji na backing oraz klucz pauzy, który może tylko wstrzymać (wznowienie wymaga kworum PQ). B2: znacznik czasu bloku późniejszy niż 60 s od jego rodzica jest nieprawidłowy, a validator nie głosuje na blok wyprzedzający jego zegar o więcej niż 15 s, więc validatorzy potrzebują NTP. B3: kworum współpodpisów Dilithium2 przy każdej emisji. B4: wpisanie tokenu z mostu lub backingu po genesis pod kworum strażników PQ, bez cięcia łańcucha | zUSD, jeden token z siedmioma backingami (USDT i USDC na Ethereum, Binance Smart Chain, Tron oraz Solana), jest rejestrowany transakcją, a total_supply == Σ backings.locked zachodzi z konstrukcji. Lokalna dziewięciofazowa bramka (zusd_e2e.rs: czterech validatorów, prawdziwe dowody, faucet, rejestracja, wpłata, transfer, spalenie, audyt) przeszła 9 z 9 | działa od chain 14 (v0.5). Na chain 20: limit emisji 100 000 zUSD dziennie na backing plus globalnie 4 000 zUSD na kroczące 24 godziny (reguły mostu v2), zbiór strażników 1 z ośmioma strażnikami PQ, opłata 10 bps w zUSD od każdej emisji i każdego spalenia (bridge.fees) oraz rotacje strażników, które wymagają posiadania klucza i czekają 86 400 s (bridge.rotation). zUSD jest wpisany w genesis chain 20 wraz z siedmioma backingami i 99 zUSD zablokowanymi w chwili cięcia |
| audyt v3 | Poprawki trzeciej wewnętrznej rundy audytu, prowadzonej przez współzałożyciela (2026-09-19; nie przeprowadzono żadnego niezależnego audytu). POOL-1: Mint z faucetu niesie otwarcie swojej noty (pk, time, r), przyjęcie przelicza zobowiązanie, a emitent podpisuje rand-mint-2; noty alokacji genesis także niosą otwarcie. RPC-1: rand_getWitness(es) wykonuje co najwyżej dwie przebudowy drzewa naraz i odpowiada -32000 busy po 10 s. OPS-1: wszystkie osiemnaście kluczy validatorów zrotowano, wygenerowano poza repozytorium i żaden klucz nie jest śledzony w repozytorium | Emisja, której zobowiązanie otwiera się na więcej niż jej kwota, zostaje odrzucona; żaden klucz chain 14 nigdy nie znalazł się w repozytorium | działa od chain 14 (v0.5). PRIV-1, czyli żądanie świadectwa wskazujące liść, zostało zamknięte 2026-09-21 przez własne drzewo portfela |
Wydania od v0.5
Każde wydanie to tag git z wpisem w CHANGELOG.md fullnode’a. Wydanie, które zmienia konsensus, format przesyłu lub klucz weryfikatora, wychodzi z nowym łańcuchem; pozostałe wchodzą na działający łańcuch po jednym węźle naraz.
| wydanie | co przyniosło | łańcuch |
|---|---|---|
| v0.5 do v0.5.8 | tokeny RPL, zUSD i wzmocniony most (powyżej); poprawki z audytu; przycinanie historii; wzmocnienie konsensusu i synchronizacji | 14, 15 |
| v0.5.9 | Poprawki ponownego skanowania: faucet mintuje tylko od walidatorów genesis, wycofywanie (back-off) synchronizacji, wstępne kontrole gossipu | 15 |
| v0.5.10 | Udostępnianie adresów: odciski, linki randpay: i kody QR; zaszyfrowane memo, po raz pierwszy włączone w łańcuchu 18 | 15 |
| v0.5.11 | Alokacje genesis z blokadą czasową (vesting) dla zespołu, inwestorów i partnerów. Bramkowane przez genesis i aktywne w żadnym łańcuchu | brak |
| v0.6 | zkVM, rVM i poprawki agregacji z przeglądów wrześniowych | 15 |
| v0.6.1 | Zbiór ograniczeń 7: zaślepianie LogUp, dolna granica tablicy 2⁷, 32-bitowe kontrole zakresu, POSEIDON2_LEN, poprawka JALR. Łańcuch 16 powstał z hardening_v6 i gościem pakietowym (bundle guest) v2 | 16 |
| v0.6.2 | Delegowane dowodzenie, faza 1: binarka rand-prover i --prover w portfelu. Prover fazy 1 otrzymuje klucz wydatkowania | 16 |
| v0.6.3, v0.6.4 | Delegowane dowodzenie, faza 2: podzielona autoryzacja. Dowód pakietu (bundle) nie przyjmuje już klucza wydatkowania, przyjmuje go dowód autoryzacji poziomu 10, a domena identyfikatora transakcji zmienia się na rand-txid-3 | 17 |
| v0.6.6, v0.6.7-rc1 | Gas: zbiór ograniczeń 8, zadeklarowany limit gazu na dowód, dynamiczne ceny gazu i bajtów; włączone memo. v0.6.6 nigdy nie został wydany z tagiem | 18 |
| v0.6.7 | Poprawki w łańcuchu 18, które nie zmieniają żadnej reguły konsensusu: przycinanie zapieczętowanych dowodów (uśpione), przypięcie formatu koperty, higiena kluczy podglądu, alokator rVM, aliasing jąder GPU, pokrycie testami ALU. Otagowane, zanim zakończył się jego pełny zestaw testów workspace | 18, 19 |
| v0.6.8 | RPL-2: komórki programów, skarbce programów i akcja Invoke. Opłaty mostu zUSD w obu kierunkach. Ostatnie poprawki audit-v6: brak automatycznego zwalniania blokad (CON-4) i pacemaker oparty na certyfikacie timeoutu (CH-1); nasłuch --public-rpc, limity odczytu, zarezerwowani peerzy walidatorów, budżety synchronizacji i gossipu, limit bajtów puli, ograniczenie zadeklarowanego stopnia nagłówka dowodu (ZKV-4); oraz reguły bramkowane przez genesis, które włącza łańcuch 20: powiązanie z hashem genesis, testnet, okno dowodu o długości 1 024 bloków, pułapy cen gazu i płacące obciążenie bajtowe, dopuszczanie przez głosowanie, limit wejścia stawki jako ułamek, posiadanie i opóźnienie dla rotacji mostu. Portfele potrzebują tej wersji, aby wysyłać w łańcuchu 20 | 20 |
Gdzie to się dziś kończy
Odstępstwa od whitepapera, opisane wprost, bez wygładzania. Każde jest śledzone w dokumentacji własnej danego crate’a, wraz z kamieniem milowym, który je zamyka.
hcjest wiążące, ale nie ukrywa: nie zawiera soli, więc zgadnięty program można potwierdzić, a dwa wdrożenia tego samego programu są powiązywalne. M3.4 usunęło to, że weryfikator trzyma cały program jawnie.- Portfel zbudowany przed 2026-09-21 prosi swój węzeł o świadków, a żądanie świadka wskazuje liść, który ma zostać wydany. Obecny
randtrzyma własną kopię drzewa i nigdy o nic nie pyta; węzeł nadal obsługujerand_getWitnessdla starszych portfeli. - Wpłaty są jawne na granicy: mint z faucetu, nota genesis i wpłata przez most niosą swoją kwotę jawnie (od łańcucha 14 mint i nota genesis niosą też swoje otwarcie, więc klucz właściciela również jest publiczny), czyli ta sama widoczność o jeden skok, jaką ma wpłata z puli przejrzystej do osłoniętej w każdym innym systemie.
- Zero knowledge jest statystyczne, nie doskonałe. Taką właściwość faktycznie zapewnia ukrywające FRI w Plonky3 0.7, i crate to mówi.
- Hash transkryptu to Poseidon2 z deweloperskimi stałymi rund, a nie SHA3-384 / BLAKE3-384 z papierów. To zmiana konfiguracji, nie przepisywanie.
- Przy 80 zapytaniach FRI dowód pakietu miał około 1,42 MB w łańcuchach 14 i 15 (około 1,3 MB do łańcucha 13). Od łańcucha 17 transfer niesie około 2,85 MB dowodu: dowód pakietu, około 1,49 MB, i dowód autoryzacji, około 1,37 MB. W łańcuchu domyślnym, z blokami 4 MiB i limitem dowodu 2 MiB, dowód zawierający Keccak wprost przekracza limit dowodu; genesis łańcucha 20 ustawia bloki 20 MiB i limit dowodu 4 MiB (łańcuchy 13 do 16 ustawiają 8 MiB).
- Nagłówek dowodu wywołania nie jest ukryty. Deklaruje poziom oraz wysokości tablic Keccak i SHA-256, więc pokazuje, czy wywołanie haszowało. Wywołania zatwierdzone w łańcuchu 15 przed dolną granicą provera v0.6 ujawniały więcej: prywatną tablicę poniżej 2⁷ wierszy dało się odczytać z dowodu. Dolna granica provera v0.6 zamknęła to dla nowych wywołań, a zbiór ograniczeń 7 z
hardening_v6uczynił to regułą łańcucha od łańcucha 16. - Wywołanie jest ograniczone do poziomu 14, z co najwyżej 2¹² wierszy Keccak (128 permutacji) i 2¹³ wierszy SHA-256 (128 kompresji), a przy
hardening_v6nie można wdrożyć programu dłuższego niż 8 180 słów. Goście interpretera EVM i sBPF oraz przetłumaczone obrazy ERC-20 i SPL Token są wszystkie powyżej tego progu. - Kto trzyma świadka, widzi wszystko. ZK chroni widok weryfikatora, nie provera. Od łańcucha 17 portfel może przekazać dowód pakietu sparowanemu
rand-proverbez przekazywania klucza wydatkowania, ale ten prover nadal trzyma klucz podglądu i widzi noty. Backend CUDA po raz pierwszy uruchomiono na sprzęcie 2026-09-28 i nie ma jeszcze pomiaru produkcyjnego.
Układ repozytorium
Workspace Cargo fullnode’a, tak jak opisują go jego README i katalog crates/.
| ścieżka | co zawiera |
|---|---|
crates/randprotocol-core/ | Czysta logika, bez I/O: kryptografia, noty i drzewo zobowiązań, reguły księgi, gas, genesis, maszyna stanów HotStuff |
crates/randprotocol-zkvm/ | zkVM Rand, wendorowana z zkp-circuits/research przy zbiorze ograniczeń 8 (obwody aeacf31; ponownie zsynchronizowana przez deploy/sync-zkvm.sh), plus weryfikator dowodów po stronie łańcucha i jego pamięć podręczna kluczy weryfikatora |
crates/randprotocol-rvm/ | Maszyna rekurencji, wendorowana z zkp-circuits/recursion: maszyna natywna dla ciała, której programy weryfikują dowody zkVM Rand |
crates/bridge-codec/ | Format przesyłowy mostu strażników i reguła kworum, współdzielone bajt w bajt z kontraktami Solidity i programem Solana |
crates/randprotocol-node/ | Magazyn RocksDB, sieć libp2p, mempool, synchronizacja bloków, serwer JSON-RPC i binarka rand-node |
crates/randprotocol-client/ | Binarka portfela rand i biblioteka RpcClient, bez zależności od RocksDB ani libp2p |
crates/randprotocol-prover/ | Binarka rand-prover: delegowany prover, który dowodzi pakiety dla sparowanych portfeli |
deploy/ | Pliki genesis testnetu, nodes.env, skrypty uruchomieniowe, provisioning w chmurze, skrypty przełączenia i przebudowy. Od przygotowań łańcucha 14 nie śledzi się tu żadnego klucza |
docs/ | Dokumentacja referencyjna i specyfikacja projektowa |
scripts/ | Lokalny testnet z dwoma walidatorami |
Określone, jeszcze niewdrożone
Te komponenty są opisane w papierach lub w dokumentacji fullnode’a, ale nie działają: albo nie ma ich w repozytoriach, albo są zbudowane i włączone w żadnym łańcuchu. Wymieniono je, aby przerwa między specyfikacją a kodem była czytelna, a nie domyślna.
| komponent | status |
|---|---|
| bridge · guardian | Demony strażnika i przekaźnika (relayer), które uruchamiają format atestacji od końca do końca; kontrakty, kodek i odbierająca połowa fullnode’a są dostarczone, demony nie |
| fullnode · aggregation | Agregacja bloków z maszyną rekurencji: pieczętowanie, przycinanie i synchronizacja w formie zapieczętowanej. Zbudowana i wyłączona w każdym łańcuchu; rand-node odrzuca genesis z sekcją aggregation. Wciąż wymaga kompletnego ćwiczenia ze sfałszowanym agregatem i usuwa tylko dowód pakietu, nie dowód autoryzacji. Produkcyjne dowody rVM wymagają dużej maszyny: przy zbiorze ograniczeń 7 agregat dwóch zajął 133 GB, trzech 221 GB, a dowód wyjścia więcej niż 256 GB (zmierzone 2026-09-28 i 29; nie mierzono ponownie przy zbiorze ograniczeń 8) |
| fullnode · vesting | Alokacje genesis z blokadą czasową dla zespołu, inwestorów i partnerów (v0.5.11, docs/vesting.md). Bramkowane przez genesis: bez sekcji vesting cztery akcje vestingu są odrzucane, a żaden łańcuch jej nie ma. Audyt podaży łańcucha 20 raportuje każdy licznik vestingu jako zero. Od v0.6.8 odwoływalny wpis jest odwoływany progiem swoich odwołujących i tylko na skarbiec wskazany w jego wpisie genesis |
| fullnode · slashing | Slashing i jailing za ekwiwokację lidera są zbudowane w v0.6.8 za staking.slashing i wyłączone w łańcuchu 20 (jego genesis go nie ma, a wszystkie 26 kluczy walidatorów należy do jednego operatora). Nagrody za bloki, beacon lidera oparty na sortition z hashem, akumulator nullifierów i wywołania między programami nie są zbudowane. Trwały stan na program został dostarczony jako RPL-2 (powyżej) |
prover/ | Demon dowodzenia na GPU: pobiera partie z kolejki, ściga się przy zgłaszaniu. Jądra CUDA żyją w zkp-circuits i po raz pierwszy uruchomiono je na NVIDIA H100 2026-09-28; demona rynkowego nie ma. rand-prover, który jest dostarczany, dowodzi dla sparowanych z nim portfeli i nie jest rynkiem |
| zkp-circuits · M4.4 exit proof | Dowód transferu SPL Token (poziom 20), ekstrapolowany na około 330 GB. Transfer ERC-20 (poziom 18) udowodniono na droplecie 128 GB 2026-09-19. Żadnego z nich nie można wywołać w łańcuchu 20, który ogranicza wywołanie do poziomu 14 |
Budowanie i testy
Standardowy przepływ pracy Rust w każdym repozytorium. Fullnode to jeden workspace Cargo z przypiętą wersją toolchainu oraz zestawem testów klastrowych, który uruchamia prawdziwe węzły przez TCP. Jego kompilacja wymaga repozytorium circuits sklonowanego obok, w katalogu o nazwie circuits, na commicie, z którego zsynchronizowano dołączone (vendored) crate’y (aeacf31 dla v0.6.7 i v0.6.8). zkVM to samodzielny crate w zkp-circuits z własnym przypięciem toolchainu oraz demonstracją, która opisuje, co poufne wywołanie ujawnia, a czego nie.
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
Badawcza zkVM, w 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
Zestaw testów fullnode zmierzony w v0.6.1 na maszynie z 16 vCPU: core 521 testów, node 373, client 117, zestaw cheating-prover 116, oszustwa z ukrytymi pakietami (hidden-bundle) 21 (75 min), przepływ portfela 6 (53 min), klaster 26 (44 min) oraz bramka end-to-end zUSD 2 (51 min). Produkcyjne dowody maszyny wirtualnej rekurencji nie wchodzą w jego zakres i wymagają pamięci wymienionej powyżej.
Running a node opisuje dołączenie do publicznego testnet na podstawie tej kompilacji; genesis testnet, węzły początkowe (bootstrap peers) i skrypty uruchomieniowe znajdują się w katalogu deploy/ fullnode, a strona pobierania zawiera wersję skróconą.
Współtworzenie
Fullnode jest udostępniany na licencji GNU General Public License v3.0 (GPL-3.0-only); wcześniej był na licencji Apache-2.0. Zgłaszaj błędy i propozycje projektowe jako zgłoszenia (issues) w repozytorium, którego dotyczy zmiana. Pull requesty są mile widziane: przed wysłaniem uruchom cargo fmt && cargo clippy i ograniczaj zakres zmian. Miejscem na początek są zgłoszenia fullnode.
Architektura, obwód prywatności, dowód tokena opłat oraz kompromis postkwantowy są opisane w whitepaperze na stronie artykułów. Katalog docs/ w repozytorium fullnode jest źródłem, względem którego sprawdzana jest każda strona tej dokumentacji.