Rand Protocol
Dokumentacja
Dla deweloperów

Dla deweloperów

Pięć repozytoriów, stos technologiczny, Rand zkVM i jego kamienie milowe, fazy puli shielded, prace nad v0.5 i kolejne wydania, aż do v0.6.8 w chain 20, układ kodu źródłowego fullnode'a, to, co jest zaprojektowane, ale nie wydane, oraz jak budować, testować i wnosić swój wkład.

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

repozytoriumzawartośćjęzyk
randprotocol/fullnodeReferencyjny 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.orgEksplorator bloków stojący za randscan.org: indekser axum z API REST i WebSocket nad PostgreSQL oraz frontend w Next.js.Rust · TypeScript
randprotocol/bridgeMost 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-circuitsOmó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/clientsKlienty 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.

warstwaco 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ęgaOsł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
TokenyRPL: token to wpis w rejestrze księgi z identyfikatorem rpl1…, a nie kontrakt; przemieszcza się jako notatki w tej samej puli
StakingPubliczny 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 obliczeniazkVM 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)
KryptografiaDilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305
PrzechowywanieJedna 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
MostBlokady 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ęzykRust 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).

tabelarodzajrola
programświadekSurowe słowa instrukcji dekodowane w układzie od M3.4, skracane przez cpu do hc
cpuświadekJeden wiersz na cykl, plus wiersze skrótu, które wchłaniają program do hc, a solone wejścia do H_IN
memoryświadekRejestry i RAM w jednej tabeli, posortowane według (space, addr, ts); dostęp poniżej słowa od M2.5
aluświadekArytmetyka na bajtowych kończynach, przesunięcia, porównania; mnożenie i dzielenie RV32M od M2.6
rangewstępnie przetworzona · 256 wierszyKontrole zakresu i wyszukiwanie potęg dwójki
nibblewstępnie przetworzona · 256 wierszy4-bitowe AND, OR, XOR; trafienie jest samo w sobie kontrolą zakresu obu operandów
poseidon2świadekJeden wiersz na rundę permutacji w blokach po 32 wiersze; obsługuje szynę POSEIDON2 i oba skróty
inputświadek · od M4.1Jeden 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 · opcjonalnaKeccak-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

FRI80 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łanieprivate_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
TransferGość 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
WeryfikacjaOkoło 16 ms z ciepłym kluczem; pierwsza weryfikacja przy nowym kluczu (poziom, wysokości) trwa około 230 ms
BlokBudż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żkakoprocesory
RISC-VNatywnie. 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
Soliditysolc --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 / SVMplik 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.

idzakreskryterium wyjściastatus
M1Pięć tabel, bazowa ISA RV32I, HALT/WRITE_OUTPUT/READ_INPUT, ZK włączone, dopełnianie do tier, asembler, emulatorfib, memcpy, bubble_sort, alu_mix i balance_check są dowodzone i weryfikowane; każdy test oszustwa jest odrzucanyzrobione. 44 testy; późniejszy przegląd zamknął pięć luk w poprawności (soundness) w jednej fali
M1.5Klucze 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ęgaTransfer 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
M2Pamięć 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 RV32MDostarczone węziej niż zakładano: loader płaskich plików binarnych i mocniejsze powiązanie READ_INPUT przeniesiono do M4.1zrobione. 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
M3Ukł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 obwodzieRelacja transferu jest dowodzona w R_exec z przynależnością w obwodzie, a verify(hc, proof) nigdy nie widzi słowa programuzrobione. 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
CUDABackend 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ą --cudaKażdy gość jest dowodzony i weryfikowany przez czysto rustowy bliźniak referencyjny i sterownik mock; weryfikator CPU nie odróżnia backendówzrobione; 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.1Loader 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 wektorzeGość 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_INzrobione. Wdrożone 2026-09-11 jako zestaw ograniczeń 4: 26 wartości publicznych, osiem tabel, hard fork
M4.2Rę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-12keccak256 jest dowodzony jako skompilowany gość, a dowód bez tabeli ma kształt identyczny bajt w bajt z dowodem z M4.1zrobione. 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.4Interpretery 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_execzbudowane; 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
M5Maszyna 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 7Każ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_v2Poprawki z przeglądów zkVM z 2026-09-27 i 28, które zmieniają klucz weryfikatora, wprowadzone jednym cięciemzrobione. Fullnode v0.6.1, chain 16 (2026-09-28), hard fork
set 8Licznik gazu: kolumna GAS w tabeli cpu i publiczny GAS_LIMIT, z GAS ≤ GAS_LIMIT dowodzonym w obwodzie; dokładny gaz przebiegu pozostaje prywatnyWywołanie płaci za limit, który deklaruje, a każdy dowód pakietu deklaruje ten sam przypięty limitzrobione. 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.

idzakreskryterium wyjściastatus
S1Sama 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 RPCTransfer 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 klastragotowe. Na publicznej flocie od chain 6 (2026-09-12)
S3Most 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 audytorAktywo 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_INgotowe. 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
S2Staking 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 klastragotowe. 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
RPLStandard 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_getTokenSupplyToken zostaje zarejestrowany, wybity, wysłany przez rand send --asset i spalony jako noty w tej samej pulidział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-2Stan 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_getProgramVaultKsię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 ponowniedział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 aktywemKaż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 ukrytedział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 transakcjiKaż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ść publicznychSkopiowany, niezmodyfikowany dowód przesłany ponownie ze zmienionym adresatem, validatorem lub memo zostaje odrzuconydział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–B4Utwardzenie 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ńcuchazUSD, 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 9dział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 v3Poprawki 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 repozytoriumEmisja, której zobowiązanie otwiera się na więcej niż jej kwota, zostaje odrzucona; żaden klucz chain 14 nigdy nie znalazł się w repozytoriumdział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.

wydanieco przyniosłołańcuch
v0.5 do v0.5.8tokeny RPL, zUSD i wzmocniony most (powyżej); poprawki z audytu; przycinanie historii; wzmocnienie konsensusu i synchronizacji14, 15
v0.5.9Poprawki ponownego skanowania: faucet mintuje tylko od walidatorów genesis, wycofywanie (back-off) synchronizacji, wstępne kontrole gossipu15
v0.5.10Udostępnianie adresów: odciski, linki randpay: i kody QR; zaszyfrowane memo, po raz pierwszy włączone w łańcuchu 1815
v0.5.11Alokacje genesis z blokadą czasową (vesting) dla zespołu, inwestorów i partnerów. Bramkowane przez genesis i aktywne w żadnym łańcuchubrak
v0.6zkVM, rVM i poprawki agregacji z przeglądów wrześniowych15
v0.6.1Zbió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) v216
v0.6.2Delegowane dowodzenie, faza 1: binarka rand-prover i --prover w portfelu. Prover fazy 1 otrzymuje klucz wydatkowania16
v0.6.3, v0.6.4Delegowane 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-317
v0.6.6, v0.6.7-rc1Gas: 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 tagiem18
v0.6.7Poprawki 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 workspace18, 19
v0.6.8RPL-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 2020

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.

  • hc jest 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 rand trzyma własną kopię drzewa i nigdy o nic nie pyta; węzeł nadal obsługuje rand_getWitness dla 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_v6 uczynił 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_v6 nie 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-prover bez 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żkaco 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.

komponentstatus
bridge · guardianDemony 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 · aggregationAgregacja 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 · vestingAlokacje 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 · slashingSlashing 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 proofDowó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.

Ostatnio zweryfikowano względem commitu fullnode c0878c3f (łańcuch 21) dnia 2026-10-12. Jeśli kod i ta strona się różnią, rację ma kod; prosimy o zgłoszenie.