Z cargo build --release powstają trzy pliki binarne: rand-node (węzeł i polecenia operatora), rand (portfel shielded) oraz rand-prover (prover delegowany). Każde polecenie przyjmuje -h/--help. Ta strona opisuje wydanie v0.6.8 (c9c9bd3c), czyli build, na którym działa chain 20; tam, gdzie v0.6.7 zachowywał się inaczej, jest to zaznaczone. Portfel rand starszy niż v0.6.8 nie może wysyłać na chain 20, którego genesis wiąże z swoim hashem każdy dowód i każdą podpisaną wiadomość. Dwa pierwsze przechowują różne rodzaje kluczy: klucz węzła to para kluczy Dilithium2, która podpisuje bloki; klucz portfela to klucz wydatkowy shielded, który nie podpisuje niczego w łańcuchu.
rand-node
rand-node <COMMAND>
keygen Generate a new Dilithium2 key file (refuses to overwrite an existing one)
address Print the address, public key, and libp2p peer id of a key file
genesis Write a genesis.json: every validator key is staked, each --alloc becomes a deposit note
alloc-note Print one genesis alloc note as JSON, RAND or a listed token, for splicing into a genesis
init Initialise a data directory from a genesis file
run Run the node
verify Verify the chain in a data directory without running the node
db Database maintenance on a stopped node's data directory
safety status | clear-halt | release-lock: a stopped validator's consensus safety state
status Show node status
register Print this node's Registration, for the wallet that bonds it in
admit sign | submit: the validator set's vote to admit a new key (admission by vote)
unbond Move bonded stake into unbonding
withdraw Pay released stake and rewards into a note at the payout address
bridge-gov rotate-pq | rotate-pause | cancel-rotation: the bridge's post-quantum rotations
vesting status | claim | revoke | bond | unbond: genesis vesting (chains with a vesting section)
aggregator register | unbond | withdraw — the aggregator role (aggregation chains only)
aggregate The aggregate daemon (aggregation chains only)
safety, admit i bridge-gov są nowe w v0.6.8. Nie ma balance ani transfer: transfer wymaga klucza wydatkowego shielded, który posiada tylko portfel.
Jedna flaga globalna, --allow-test-fri-profile (lub RAND_ALLOW_TEST_FRI_PROFILE=1), pozwala poleceniom init, run i verify zaakceptować genesis, w którym fri_profile ma wartość test. Ten profil daje około 17 bitów bezpieczeństwa (soundness), a nazwać go może każdy, kto pisze plik genesis, dlatego od v0.6.8 węzeł odrzuca taki genesis bez tej flagi. Ustawiają ją zestawy testów; nic innego nie powinno.
keygen, address
| polecenie | argument | wartość domyślna |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | wymagany |
keygen zapisuje { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } z uprawnieniami 0600. Ten plik to jedyna kopia ziarna (seed). Od v0.6.8 keygen odmawia zapisu do istniejącego --out (… already exists or cannot be created; refusing to overwrite a key file) i nie zmienia tego pliku; nie ma --force, więc aby go zastąpić, trzeba najpierw odłożyć stary plik na bok. v0.6.7 i wcześniejsze nadpisywały go bez pytania. address wypisuje address, public_key (1 312 bajtów w hex) oraz peer_id.
genesis
| argument | wartość domyślna | znaczenie |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | identyfikator łańcucha; transakcje i tematy gossip są z nim powiązane |
--validator <KEY,STAKE,PAYOUT> | wymagany, powtarzalny | jeden wpis rejestru: ścieżka do pliku klucza lub klucz publiczny w hex, stake w RAND (co najmniej 1000), adres wypłaty rand1… |
--epoch-blocks <N> | 1000 | liczba bloków w epoce |
--alloc <ALLOCS> | brak, powtarzalny | notatka depozytowa: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | ścieżka wyjściowa |
--faucet | wyłączone | tylko testnet: włącza Mint. Obok sekcji bridge wymaga --testnet |
--testnet | wyłączone | v0.6.8: zapisuje "testnet": true, znacznik, który pozwala faucetowi działać obok sekcji bridge. Po podaniu wchodzi do hasha genesis |
--no-confidential | wyłączone | wyłącza Deploy i Call |
--fri-profile <production|test> | production | test jest niebezpieczny i służy zestawowi testów; init, run i verify odrzucają taki plik bez --allow-test-fri-profile |
--max-program-words <N> | brak (4096) | największy program, jaki może zawierać deploy, 1..=65535. Zapisywany tylko po podaniu; wchodzi do hasha genesis, ilekroć jest obecny, więc --max-program-words 4096 to inny łańcuch niż pominięcie flagi. Każdy węzeł potrzebuje binarki v0.4 przed init na takim pliku |
--max-proof-bytes <N> | brak (2 097 152) | największy dowód, jaki może zawierać transakcja, 1048576..=33554432. Wszystkie limity dowodów za nim podążają |
--max-block-bytes <N> | brak (4 194 304) | największy blok, a więc i największa transakcja, 4194304..=67108864, oraz co najmniej 2 × max_proof_bytes + 1 MiB, a z --auth-guest co najmniej 3 × max_proof_bytes + 1 MiB, gdyż wywołanie niesie trzy dowody (bundle, auth, call) |
--max-call-envelope-bytes <N> | brak (18 432) | największa koperta wejściowa wywołania, 18432..=1048576 |
--max-program-public-words <N> | brak (0) | największe wejście publiczne, jakie może ustalić deploy, 0..=65535; 0 nie dopuszcza żadnego |
--tokens <TOKENS.JSON> | brak | sekcja tokens RPL, jako plik JSON {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Gdy pominięta, plik nie ma takiej sekcji i jest hashowany jak dawniej. Sekcja bridge wymaga pliku z niezerowym mint_cap_per_day (na każde zabezpieczenie, na dzień UTC, w ośmiodziesiętnych jednostkach tokena); wymieniony token wymaga sekcji bridge |
--envelope-bytes <N> | brak (dawna 1348-bajtowa koperta) | dokładny rozmiar każdej koperty notatki: wyjścia bundle, mintu z faucetu, withdraw, depozytu bridge, alokacji genesis. Akceptowana jest tylko wartość 1860, rozmiar pozwalający każdej kopercie nieść zaszyfrowane memo. Po podaniu wchodzi do hasha genesis i jest ustawiana, zanim zostaną zapieczętowane notatki z własnych --alloc tego polecenia |
--vesting <VESTING.JSON> | brak | sekcja vesting: alokacje z blokadą czasową, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Od v0.6.8 odwoływalny wpis wymienia revokers (od 1 do 5 kluczy), threshold oraz treasury, do którego trafia wypłata po odwołaniu; plik, w którym czegoś brakuje, jest odrzucany |
--staking <STAKING.JSON> | brak | v0.6.8: sekcja staking jako plik JSON (faucet_budget_per_epoch, bond_activation_epochs, max_weight_bps, max_stake_entry_per_epoch lub max_stake_entry_bps_per_epoch, registration_v2, faucet_recipients, faucet_minters, admission_by_vote, slashing), walidowana przez build |
--consensus-domain <0|1> | brak (0) | v0.6.8: 1 wiąże z tym genesis każdy głos, new-view i propozycję |
--bundle-guest <v1|v2|v3> | v1 | guest bundle przypięty jako hc_bundle: v1 (guest z ukrytymi aktywami, na którym działały chain 14 i 15), v2 (guest bez rozgałęzień z chain 16) lub v3 (rozdzielona autoryzacja: guest przyjmuje nk i sól zamiast klucza wydatkowego). v3 wymaga --auth-guest |
--auth-guest | wyłączone | przypina auth guest tego builda jako hc_auth: każdy bundle niesie wtedy dowód auth nad kluczem wydatkowym, powiązany ze swoją transakcją, którego wynik równa się auth_commit bundle. Wymagane z --bundle-guest v3 i odrzucane z v1 lub v2, zanim zostanie zapisany jakikolwiek plik. Bez flagi plik nie ma pola hc_auth |
--hardening-v6 | wyłączone | zamienia reguły v0.6 w reguły ważności (hardening_v6): okno pc, deploye niewywoływalne, kanoniczne kształty dowodów i słowa proof-of-work, powiązanie wywołania oraz dolny próg tabeli programów. Bez flagi węzeł nadal odrzuca je w swojej puli, jako politykę |
--gas-price <UNITS> | brak (brak sekcji gas) | jednostki (10⁻⁹ RAND) za gas, które sam łańcuch pobiera za wywołanie. Ta flaga zapisuje sekcję gas (metering: "circuit"); trzy poniższe flagi są bez niej odrzucane. Wchodzi do hasha genesis |
--byte-price <UNITS> | 800, tylko z --gas-price | jednostki za KiB lub jego część dowodu wywołania wraz z kopertą wejściową, od bajtu 0 |
--bundle-gas-limit <N> | 20479, tylko z --gas-price | dokładny GAS_LIMIT, który musi zadeklarować każdy dowód bundle; dowód bundle deklarujący inną wartość jest odrzucany. Genesis akceptuje tylko 20479, czyli gas_max(14, 0, 0) dla guesta bundle tier-14 |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | brak (stałe ceny) | włącza kontroler ceny w każdym bloku, z dolnym ograniczeniem w postaci początkowych gas_price i byte_price samej sekcji. Odrzucane obok --aggregation |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | brak (bez limitu górnego) | v0.6.8: pułapy, powyżej których kontroler nigdy nie podniesie ceny, każdy co najmniej równy cenie początkowej. Odrzucane bez --gas-dynamic |
--gas-byte-load paying | brak (bajty każdej transakcji) | v0.6.8: byte_price zmieniają tylko dowód wywołania i jego koperta wejściowa, więc blok transferów nie zmienia żadnej. Odrzucane bez --gas-dynamic; paying to jedyna dozwolona wartość |
--binding-domain <0|1> | brak (brak pola) | v0.6.8: 1 wiąże hash genesis z każdym powiązaniem transakcji i każdą podpisaną wiadomością akcji (mint z faucetu, unbond, withdraw, wiadomości tokenów RPL, akcje agregatora, wiadomości zarządzania bridge), więc dowód lub podpis dla tego łańcucha nie przejdzie weryfikacji w żadnym innym. Po pominięciu polecenie ostrzega: portfel v0.6.8 dowodzi formę powiązaną z genesis na każdym chain id spoza zakresu od 14 do 19, więc każdy łańcuch od 20 wzwyż jest cięty z 1 |
--proof-window-blocks <N> | brak (256) | v0.6.8: jedno okno, od 256 do 4096 bloków, określające, jak stare mogą być kotwica bundle i jego time. Udostępniane jako rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | brak (brak sekcji program_state) | v0.6.8, RPL-2: włącza komórki programów, skarbce programów i akcję Invoke, z tą opłatą za komórkę w jednostkach RAND (co najwyżej 1000 RAND), doliczaną do dolnego progu opłaty invoke za każdą utworzoną komórkę. Wymaga --tokens, --gas-price, --hardening-v6 i --auth-guest; brak każdej z nich jest odrzucany z nazwy, zanim zostanie zapisany jakikolwiek plik |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | brak | sekcja aggregation; build v0.6.8 odmawia uruchomienia na genesis, który ją zawiera |
Wypisuje jedną linię alloc dla każdego --alloc, następnie hash genesis, liczbę validatorów i notatek, długość epoki, pięć limitów, hc_bundle i hc_auth (none bez --auth-guest), a potem linię gas: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, lub gas: none bez --gas-price, a z --program-state-cell-fee także linię program_state: cell fee N RAND. init wypisuje tę samą linię gas. Pięć flag limitów zachowuje się tak samo: po pominięciu plik nie ma takiego pola i łańcuch używa wartości domyślnej; po podaniu pole wchodzi do hasha genesis nawet przy wartości domyślnej. Chain 20 został wycięty z tymi flagami (deploy/cut-chain20-genesis.sh):
--max-program-words 65535 --max-proof-bytes 4194304 --max-block-bytes 20971520 \
--max-call-envelope-bytes 65536 --max-program-public-words 32768 \
--tokens tokens.json \
--bundle-guest v3 --auth-guest --hardening-v6 \
--gas-price 100 --byte-price 800 --bundle-gas-limit 20479 --gas-dynamic 10485760,262144,1250 \
--max-gas-price 10000 --max-byte-price 80000 --gas-byte-load paying \
--envelope-bytes 1860 \
--testnet --binding-domain 1 --proof-window-blocks 1024 --program-state-cell-fee 10000000 \
--epoch-blocks 1000 --faucet --fri-profile production
Łańcuchy 18 i 19 zostały utworzone z tymi samymi flagami, aż do --envelope-bytes 1860, i bez żadnej z flag z v0.6.8. Limit dowodu wynosi 4 MiB, w porównaniu z 8 MiB w łańcuchach od 13 do 16: transakcja z podzieloną autoryzacją niesie do trzech dowodów, a 3 × 4 MiB + 1 MiB mieści się w bloku o rozmiarze 20 MiB. Plik tokens.json zawiera registration_fee równe 1 RAND, mint_cap_per_day równe 10000000000000, max_tokens równe 4096, burn_registration_fee i bound_note_value, a także zUSD wraz z jego siedmioma zabezpieczeniami. Nie ma flagi --bridge, a skrypt tworzący genezę nadal dokleja później do pliku sekcje bridge, staking i consensus_domain (w łańcuchu 20: most przy zestawie strażników 1 z ośmioma kluczami PQ strażników, klucz wstrzymania, rules_v2, rotation i fees; sekcja staking z listą dozwolonych kranu, admission_by_vote i budżetem wejść 2,500 bps; consensus_domain: 1; oraz notatki genezy zUSD, utworzone poleceniem alloc-note --asset 1 --envelope-bytes 1860). Liczy się ten hash genezy, który init wypisuje dla gotowego pliku.
Każde --alloc buduje jedną notę depozytową ze świeżą losowością zobowiązania, więc dwukrotne utworzenie genezy daje dwa różne hashe. Polecenie zawsze zapisuje otwarcie noty obok cm i amount, czego wymaga łańcuch z sekcją tokens:
"alloc": [
{ "cm": "<64 hex>",
"envelope": { "kem_ct": "<hex>", "to_receiver": "<hex>", "to_sender": "<hex>", "body": "<hex>" },
"amount": 1000000000000,
"opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>" } }
]
Właściciel i kwota noty genezy są zatem jawne z założenia po opublikowaniu pliku; prywatne pozostaje tylko to, kiedy i na co zostanie ona później wydana. Utwórz genezę raz i zachowaj plik.
alloc-note
--to <rand1…> (wymagane), --amount <N> (wymagane), --asset <INDEX> (domyślnie 0), --envelope-bytes <N> (domyślnie: format dawny). Wypisuje jedną notę alokacji jako JSON, zaszyfrowaną dla --to tak, jak robi to genesis --alloc. Geneza, która ustawia envelope_bytes, odrzuca notę zaszyfrowaną bez odpowiadającego jej --envelope-bytes. --amount podaje się w pełnych jednostkach aktywa: dziewięć miejsc dziesiętnych dla RAND, osiem dla tokena mostkowanego (10 przy aktywie 1 to 10 zUSD). Nota tokena z listy wymaga, aby zabezpieczenia tego tokena miały kwoty locked sumujące się dokładnie do jego not.
init
| argument | znaczenie |
|---|---|
--datadir <DATADIR> | katalog danych do utworzenia |
--genesis <GENESIS> | plik genezy; kopiowany do <datadir>/genesis.json |
Wypisuje hash genezy oraz tę samą linię gas: co genesis.
run
| argument | domyślnie | znaczenie |
|---|---|---|
--datadir <DATADIR> | wymagane | zainicjowany katalog danych |
--key <KEY> | wymagane | plik klucza: tożsamość walidatora, tożsamość p2p, odbiorca opłat |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | adres multiaddr nasłuchu libp2p, można powtarzać |
--bootstrap <BOOTSTRAP> | brak, można powtarzać | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, wywoływany przy starcie i co 30 s, dopóki brak połączenia. Od v0.6.8 jego identyfikator peera jest zarezerwowany |
--reserved-peer <PEER_ID> | brak, można powtarzać | v0.6.8: peer wpuszczany ponad limit połączeń przychodzących i obsługiwany z puli budżetu synchronizacji przypadającej walidatorom. Węzły bootstrap oraz każdy walidator, którego podpisane powiązanie peera ten węzeł widział, są zarezerwowane bez tej flagi; na świeżo utworzonym łańcuchu, którego magazyn nie zawiera jeszcze żadnych powiązań, wypisz tu walidatorów floty |
--strict-gossip | wyłączone | v0.6.8: ścisła walidacja gossipsub, przyjmująca wyłącznie wiadomości z prawidłowym podpisem autora, numerem sekwencyjnym i źródłem. Węzły ścisłe i liberalne współpracują ze sobą, więc wdraża się to węzeł po węźle |
--rpc <RPC> | 127.0.0.1:8545 | nasłuch JSON-RPC operatora: każda metoda, a loopback jest zaufany. Trzymaj go na loopbacku i nigdy nie przekierowuj do niego publicznego punktu końcowego |
--public-rpc <ADDR> | wyłączone | v0.6.8: drugi, publiczny nasłuch o stałym zestawie metod (bez metod klucza podglądu, rand_mint i rand_getPeers), bez partii, bez WebSocket i z jednym licznikiem dla wszystkich wywołujących; na to powinien wskazywać reverse proxy lub przekierowanie SSH (JSON-RPC) |
--rpc-viewing-token-file <PATH> | wyłączone | v0.6.8: wymagaj Authorization: Bearer <first line of the file> (32 lub więcej znaków) przy metodach klucza podglądu na --rpc |
--validator | wyłączone | uczestnicz w konsensusie z tym kluczem |
--no-mdns | wyłączone | wyłącz wykrywanie w sieci LAN |
--block-interval-ms <MS> | 1000 | minimalny odstęp między propozycjami |
--view-timeout-ms <MS> | 3000 | bazowy limit czasu widoku; podwaja się przy każdym kolejnym przekroczeniu, do 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | wyłączone | tryb archiwalny w łańcuchu z agregacją |
--prune-history <WINDOW> | brak (zachowaj wszystko) | zachowaj tylko tyle historii bloków, <n>m, <n>h lub <n>d, co najmniej 1h: starsze bloki tracą blok, QC, transakcje i potwierdzenia; księga pozostaje. W łańcuchu 20 24 z 26 walidatorów działa z 24h, a dwa węzły są archiwalne; węzeł archiwalny i węzeł mainnet nigdy tego nie ustawiają. Wyszukiwanie według wysokości poniżej progu zwraca -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | odmów startu, gdy na systemie plików katalogu danych jest mniej wolnego miejsca; rand_getHealth zwraca disk_low poniżej czterokrotności tej wartości. 0 wyłącza zabezpieczenie |
--rpc-viewing-open | wyłączone | pozwól wywołującym spoza loopbacka używać metod klucza podglądu; wyłącznie za czymś, co uwierzytelnia |
--gas-price <UNITS> | 100 | jednostki (10⁻⁹ RAND) za gaz, których pula tego węzła wymaga od wywołania, ponad gas_max z nagłówka jego dowodu. Polityka dopuszczania, nie reguła łańcucha: blok zawierający tańsze wywołanie nadal jest ważny. 0 z --byte-price 0 oznacza brak polityki. W łańcuchu, którego geneza ma sekcję gas, jak w łańcuchu 20, regułą ważności są ceny samego łańcucha |
--byte-price <UNITS> | 800 | jednostki za KiB lub jego część dowodu i koperty wejściowej wywołania, od bajtu 0, w ramach tej samej polityki |
--prover <ADDR> | wyłączone | hostuj delegowanego provera (prover_* JSON-RPC) pod tym adresem: to osobny nasłuch, który musi różnić się od --rpc. Węzeł odmawia startu bez <prover-home>/prover.key.json, utworzonego przez rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | prover.key.json i pairings.json provera |
--prover-accept-spend-key | wycofana | odrzucana przy starcie od v0.6.8: run z tą flagą kończy działanie, zanim zostanie odczytany klucz węzła, i wskazuje flagę z nazwy. Żaden prover nie przyjmuje już świadka z kluczem wydawania; usuń ją z pliku jednostki. W v0.6.7 przyjmowała świadków z kluczem wydawania dla łańcuchów z bundle guest v1 lub v2 |
--prover-max-parallel <N> | 1 | liczba dowodów uruchamianych naraz przez hostowanego provera; start jest odrzucany, chyba że dostępne jest 5.74 GB × N + 1 GiB pamięci |
--prover-max-queue <N> | 8 | zadania w kolejce ponad te uruchomione |
--prover-cuda | wyłączone | dowodź na backendzie CUDA (build z --features cuda); bez zapasowego CPU |
--prover-skip-memory-check | wyłączone | pomiń bramkę wolnej pamięci |
--prover-fee <RAND>, --prover-fee-address <rand1…> | brak | opłata, którą musi uiścić każde zadanie wysłane do hostowanego provera, w RAND z dokładnością do dziewięciu miejsc dziesiętnych: jedno wyjście RAND na ten adres, wewnątrz dowodzonego pakietu. Każda flaga wymaga drugiej |
--prover-allow-origin <ORIGIN> | rozszerzenia przeglądarki i strony z loopbacka | origin przeglądarki, której strony mogą czytać odpowiedzi provera, można powtarzać; podane raz lub więcej, wartości stanowią całą listę. * dopuszcza każdą witrynę i wypisuje ostrzeżenie |
Środowisko: RUST_LOG (domyślnie info,libp2p=warn,libp2p_mdns=off). Ctrl-C lub SIGTERM zamyka węzeł w sposób czysty.
Publiczny punkt końcowy https://rpc.randprotocol.org to proxy z listą dozwolonych metod przed węzłem archiwalnym; od 2026-10-01 jego listą dozwolonych jest zestaw metod publicznego nasłuchu.
safety
Stan bezpieczeństwa konsensusu zatrzymanego walidatora (v0.6.8). Każde polecenie samo otwiera katalog danych, więc żadne nie działa obok działającego węzła.
rand-node safety status --datadir <dir>
rand-node safety clear-halt --datadir <dir> --i-have-compared-this-node-with-the-fleet
rand-node safety release-lock --datadir <dir> --i-give-up-this-validators-lock
status wypisuje zatwierdzoną głowę, widok i ostatnio głosowany widok, wysoki QC, informację, czy walidator jest zablokowany powyżej swojej głowy, oraz każde zapisane zatrzymanie bezpieczeństwa. Węzeł, który widzi, jak certyfikowany łańcuch trzech bloków próbuje zatwierdzić blok niewywodzący się z jego własnej zatwierdzonej głowy, zatrzymuje się i zapisuje to; run kończy się wtedy z tym zapisem aż do clear-halt (audit v6, CON-5). Porównaj głowę tego węzła z głowami dwóch innych walidatorów i przed wyczyszczeniem zatrzymania zsynchronizuj ponownie z archiwum, jeśli się różni. Od v0.6.8 (CON-4) żaden kworum odpowiedzi „nie posiadam” nie zwalnia już blokady: walidator zablokowany na bloku, którego nie może uzyskać, milczy, dopóki nie nadejdzie propozycja, której justify przewyższa blokadę, albo blok nie zostanie pobrany. release-lock obniża zapisaną blokadę do certyfikatu zatwierdzonej głowy; używaj go na jednym walidatorze naraz i tylko wtedy, gdy blok jest utracony bezpowrotnie. Bez flagi potwierdzenia każde polecenie zapisujące wypisuje, co by zrobiło, i niczego nie zmienia.
verify
| argument | domyślnie | znaczenie |
|---|---|---|
--datadir <DATADIR> | wymagane | węzeł nie może być uruchomiony |
--mode <MODE> | full | quick lub full |
--repair | wyłączone | obetnij uszkodzony koniec; stan bezpieczeństwa zostaje zachowany |
Kod wyjścia 0, jeśli spójne, 2, jeśli znaleziono problem bez --repair.
db
db drop-receipts-index --datadir <DATADIR>, przy zatrzymanym węźle: usuwa indeks receipts_by_program przed cofnięciem do kompilacji sprzed v0.3, która nie potrafi otworzyć bazy zawierającej ten indeks. Późniejszy start odbudowuje indeks z potwierdzeń.
status
--rpc <URL> (domyślnie http://127.0.0.1:8545). Wypisuje rand_status bez zmian.
register, unbond, withdraw
| polecenie | argumenty | znaczenie |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | wypisuje szesnastkowy Registration podpisany kluczem tego węzła; z RPC odczytywany jest identyfikator łańcucha, a przy --v2 także hash genesis. --v2 jest wymagane w łańcuchu, którego genesis ustawia staking.registration_v2, jak w łańcuchu 20; rejestracja v1 jest tam odrzucana, a v2 jest przyjmowana wszędzie indziej |
unbond <amount RAND> | --key, --rpc, --no-wait | przenosi stake do odwiązywania (unbonding); bez opłaty; do wypłaty dwie epoki później |
withdraw <amount RAND> | --key, --rpc, --no-wait | wypłaca uwolniony stake i nagrody do notatki na adres wypłaty, pomniejszone o opłatę bazową 0.001 RAND |
admit sign|submit
Przyjęcie w drodze głosowania (v0.6.8). W łańcuchu, którego genesis ustawia staking.admission_by_vote, jak w łańcuchu 20, nowy klucz walidatora rejestruje się dopiero wtedy, gdy walidatorzy posiadający ściśle więcej niż dwie trzecie wagi głosów podpiszą jego przyjęcie.
| polecenie | argumenty | znaczenie |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | wypisuje głos tego walidatora w jednej linii, <voter key hex>:<signature hex>, złożony nad hashem genesis i adresem kandydata, więc obowiązuje w dokładnie jednym łańcuchu. Offline: nie odczytuje żadnego węzła |
admit submit | --candidate …, --signature <line> (powtarzalne), --rpc, --no-wait | sprawdza każdy głos względem hasha genesis węzła (głos dla innego genesis lub kandydata albo dwukrotny głos tego samego głosującego zostaje wskazany), porządkuje je i wysyła bezopłatne AdmitValidator |
Kandydat to klucz, który będzie zawierać rejestracja; wypisuje go rand-node address --key, a zawiera go także szesnastkowy wynik register. Po zatwierdzeniu przyjęcia wiązanie stake’u przebiega jak dotąd (rand bond … --registration) i zużywa to przyjęcie. rand_getAdmitted wymienia przyjętych i oczekujących.
bridge-gov
Postkwantowe rotacje mostu (v0.6.8), dla strażników (guardians) i posiadacza klucza wstrzymania. Każdy krok odczytuje z --rpc (domyślnie http://127.0.0.1:8545) identyfikator łańcucha, jego domenę wiązania oraz rand_getBridgeState.rotation_nonce.
| polecenie | działanie |
|---|---|
rotate-pq message --new-key K… | wypisuje szesnastkową wiadomość rotacji dla bieżącego nonce, do porównania u każdego podpisującego |
rotate-pq sign --new-key K… --key F --index I [--possession] | wypisuje I:signature: linię kworum bieżącego strażnika PQ (I to jego indeks w bieżącym zbiorze) lub, z --possession, linię posiadacza nowego klucza (I to jego indeks w nowym zbiorze); odrzuca plik klucza, który nie jest kluczem na pozycji I |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | składa RotatePqGuardians, albo akcję V2 z liniami posiadania, i wysyła ją; odrzuca posiadanie w łańcuchu, który go nie przyjmuje, oraz jego brak w łańcuchu, który go wymaga, jak łańcuch 20 |
rotate-pause message|sign|submit --new-key K | to samo dla klucza wstrzymania (indeks posiadania 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | wypisuje 0:signature nad wiadomością anulowania, sprawdzone względem bieżącego klucza wstrzymania łańcucha |
cancel-rotation submit --kind pq|pause --signature @F | wysyła CancelRotation, porzucając oczekującą rotację przed upływem jej opóźnienia |
--new-key to szesnastkowy klucz publiczny Dilithium2, @file zawierający taki klucz albo @key-file (jego klucz publiczny). Linie podpisów mają postać index:hex, rozdzielone białymi znakami lub nowymi liniami; dozwolone są komentarze #.
vesting status|claim|revoke|bond|unbond
Strona posiadacza i strona odwołującego (revoker) alokacji genesis objętej blokadą czasową, w łańcuchu, którego genesis zawiera sekcję vesting. Genesis łańcucha 20 jej nie ma. Kluczem jest plik z rand-node keygen.
| polecenie | argumenty | znaczenie |
|---|---|---|
vesting status <ENTRY> | --rpc | wpis w postaci, w jakiej serwuje go rand_getVesting: jego warunki, ile już uwolniono i ile można odebrać teraz |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> lub --all, --key, --rpc, --no-wait | wypłaca to, co zostało odblokowane, do notatki na --to, pomniejszone o opłatę bazową 0.001 RAND; podpisane kluczem beneficjenta |
vesting revoke prepare | --entry, --margin-secs (domyślnie 600), --out (domyślnie revoke.json), --rpc | v0.6.8, bez klucza: zapisuje odwołanie, które podpisuje każdy odwołujący; notatkę z częścią wciąż nieuwolnioną --margin-secs po bieżącej głowie łańcucha, wypłaconą na treasury z genesis wpisu (nie ma --to) |
vesting revoke sign | --proposal <file>, --key, --index? | jeden klucz odwołującego, offline: wypisuje <index>:<signature hex> |
vesting revoke submit | --proposal <file>, --signature <index:hex> (powtarzalne), --rpc, --no-wait | wysyła odwołanie z co najmniej threshold podpisów wpisu, w ciągu 256 bloków od prepare. Jednokluczowe vesting revoke --to z v0.6.7 zniknęło |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | wpisy nieodwoływalne: wiąże zablokowane RAND jako stake tego walidatora; walidator, którego nie ma jeszcze w rejestrze, potrzebuje tego, co wypisało register |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | zwraca związane RAND z powrotem do blokady; ponownie do odebrania po epokach odwiązywania |
aggregator register|unbond|withdraw, aggregate
Polecenia roli agregatora (aggregator) w łańcuchu z sekcją aggregation: aggregator register --key --bond <RAND> --payout <rand1…> --rpc wypisuje podpisane AggregatorRegistration; aggregator unbond i aggregator withdraw odpowiadają parze poleceń walidatora. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] to demon, który odpytuje rand_getUnsealed, dowodzi jeden agregat i go składa. Nieaktywne w łańcuchu 20, którego genesis nie ma sekcji aggregation.
rand (portfel)
Opcje globalne, przed podpoleceniem lub po nim:
| opcja | zmienna środowiskowa | domyślnie |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http lub https (publiczny punkt końcowy to https://rpc.randprotocol.org). Odpowiedź powyżej 64 MiB jest odrzucana |
--key <KEY> | RAND_KEY | wallet.key.json; magazyn notatek leży obok, jako <key>.notes.json. Magazyn jest związany z łańcuchem, względem którego został przeskanowany (rand_getGenesisHash węzła): skierowany na inny łańcuch, na przykład w portfelu zachowanym przez przejście z łańcucha 19 na 20, zostaje opróżniony i przeskanowany od liścia 0, z ostrzeżeniem. Od v0.6.8 każde polecenie odrzuca plik klucza, który może odczytać grupa lub inni, wskazując poprawkę (chmod 600 <key>) |
--prover | wyłączone. Dowodzi pakiet (bundle) na proverze sparowanym z tym portfelem (rand prover pair), a nie na tej maszynie; dowód jest sprawdzany tutaj (jego digest, rozmiar i lokalna weryfikacja), zanim trafi do transakcji. Dotyczy każdego polecenia, które dowodzi pakiet; w call i program invoke do providera trafia tylko pakiet płatniczy, a dowód wywołania pozostaje lokalny. Odrzucane bez sparowania oraz razem z --cuda, z wyjątkiem call. W łańcuchu z rozdzielonym uwierzytelnianiem, takim jak łańcuch 20, prover otrzymuje klucz podglądu nk i sól (salt), nigdy klucza wydawania: może odczytać całą historię tego portfela, ale nie może wydawać środków. Dowód uwierzytelnienia zawsze powstaje na tej maszynie. W łańcuchu, którego guest pakietu to v1 lub v2, v0.6.8 odrzuca --prover, zanim cokolwiek zapyta providera | |
--max-prover-fee <RAND> | 1. Najwięcej, ile sparowany prover może pobrać za pakiet. Oferta powyżej tej kwoty jest odrzucana, zanim zostanie zbudowany jakikolwiek pakiet; 0 odrzuca każdą opłatę. Opłata to jedno dodatkowe wyjście RAND w tym samym pakiecie, pokazywane jako prover fee: <amount> RAND to <fingerprint> |
Kwoty są dziesiętnymi RAND z dokładnością do dziewięciu miejsc po przecinku (1, 1.5, .25, 0.000000001). Kwota tokena w send, token mint i token burn oraz w linku randpay: jest podawana w jednostkach wyświetlania tokena, według decimals jego własnego wiersza w rejestrze (10 zUSD to 10 zUSD). bridge-burn, token create --fixed-supply i --initial przyjmują zwykłe liczby całkowite w najmniejszej jednostce tokena, a asset-balance je wypisuje. Wszędzie tam, gdzie polecenie przyjmuje token, przyjmuje indeks rejestru, identyfikator rpl1… lub 64-znakowy identyfikator szesnastkowy; identyfikator jest rozwiązywany do indeksu z całej listy rejestru węzła (rand_getTokens, każda strona), nigdy przez zapytanie o pojedynczy token, które zdradziłoby węzłowi, jaki token zaraz zostanie przesunięty. Indeks liczbowy w ogóle nie trafia do węzła.
| polecenie | argumenty | działanie |
|---|---|---|
keygen | zapisuje nowy plik klucza wydawania pod --key, z uprawnieniami 0600; odmawia nadpisania | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | wypisuje na stdout adres rand1… tego portfela, dokładnie sam adres i znak nowej linii, dzięki czemu $(rand address) działa w skrypcie, a na stderr jego fingerprint XXXX-XXXX-XXXX-XXXX: 16 znaków Crockford base32, czyli weryfikację adresu przez człowieka, która nigdy nie jest wysyłana w sieci. --uri wypisuje także link randpay: (adres oraz opcjonalnie kwota, aktyw i memo). --qr renderuje ten link jako kod QR w terminalu; --qr-png zapisuje go jako plik PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | nazwane adresy, pod które ten portfel może wysyłać środki po nazwie. TO to adres rand1… lub link randpay:, z którego zachowywany jest tylko adres. add wypisuje odcisk (fingerprint) i pyta add? [y/N], chyba że podano --yes; stdin, który nie jest terminalem, jest bez tej flagi odrzucany. Zapisane w <key>.contacts.json, uprawnienia 0600. Nazwa ma od 1 do 64 znaków, nigdy nie zaczyna się od rand1 ani randpay: i jest unikalna |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | paruje ten portfel z jednym delegowanym proverem. pair przyjmuje link randprover: wypisany przez rand-prover pair, odrzuca adres URL, który nie jest https:// (zwykłe http:// tylko dla localhost, 127.0.0.1 lub [::1]), następnie podaje, co prover otrzyma (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) i pyta pair? [y/N]; --yes pomija pytanie, a stdin, który nie jest terminalem, jest bez niego odrzucany. Potem odpytuje prover_info provera, odmawia, jeśli odcisk jego klucza nie jest tym, który wskazuje link, i zapisuje <key>.prover.json z uprawnieniami 0600, zastępując każde wcześniejsze sparowanie. --trusted (v0.6.8) nie przyjmuje linku: paruje z pulą proverów walidatorów, https://prover.randprotocol.org, na podstawie linku zawartego w buildzie; jej operatorzy mogą czytać historię tego portfela i nie mogą wydawać środków. show wypisuje nazwę, URL, odcisk, own oraz klucz provera, nigdy token; forget usuwa plik. v0.6.7 nie pytał przed sparowaniem |
viewing-key | wypisuje klucz podglądu nk tego portfela, 64 znaki hex: parametr, który przyjmuje rand_importViewingKey. Odczytuje każdą notatkę, którą portfel wysłał lub otrzymał, i żadnej nie wydaje | |
balance | skanuje drzewo, zapisuje magazyn i wypisuje dostępną wartość oraz liczbę niewydanych notatek | |
sync | --rescan | skanuje bez wypisywania salda. Pierwsza synchronizacja odczytuje każdy nagłówek bloku (1 024 na wywołanie) przed liśćmi. --rescan zapomina każdą notatkę, znacznik wydania i kursor (zachowując powiązanie z łańcuchem) i skanuje ponownie od liścia 0: to droga powrotna, gdy węzeł błędnie zgłosił notatki tego portfela jako wydane. Najlepiej uruchamiać względem węzła, któremu ufasz |
notes | --memo | każda notatka, którą ten portfel otworzył: indeks, aktyw, kwota, wysokość, spent, pending oraz memo obcięte do 24 znaków lub w całości z --memo |
asset-balance [INDEX] | skanuje, a następnie wypisuje, ile ten portfel posiada w jednym aktywie, albo wiersz dla każdego posiadanego aktywa; kwoty w najmniejszej jednostce danego aktywa | |
history | --memo | każda notatka, którą ten portfel utworzył dla kogoś innego, z tą samą kolumną memo co w notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (domyślnie 0, RAND), --memo <M>, --fee <RAND> (domyślnie 0.001), --no-wait, --yes, --cuda | TO to adres rand1…, link randpay: lub nazwa zapisanego kontaktu, sprawdzane w tej kolejności. Kwota, aktyw i memo z linku uzupełniają to, czego brakuje w wierszu poleceń; AMOUNT jest opcjonalne tylko wtedy, gdy link ją zawiera, a wartość podana oboma sposobami, która się różni, jest odrzucana. Polecenie wypisuje potwierdzenie, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> oraz, gdy jest memo, osobną linię memo: "<text>", po czym pyta przed generowaniem dowodu, chyba że podano --yes. Skrypt musi przekazać --yes: stdin, który nie jest terminalem, jest odrzucany komunikatem stdin is not a terminal: pass --yes to send without confirmation. Następnie wybiera co najwyżej dwie notatki danego aktywa i co najwyżej dwie notatki RAND na opłatę, zapieczętowuje memo wyłącznie w wyjściu płatności, lokalnie generuje dowód jednego czteroslotowego pakietu z ukrytym aktywem oraz, w łańcuchu z podzieloną autoryzacją, dowód autoryzacji wydania, wysyła transakcję i czeka na zatwierdzenie. Niepuste memo jest odrzucane przed generowaniem dowodu w łańcuchu, którego genesis nie ma envelope_bytes. AMOUNT podaje się w jednostkach wyświetlania aktywa: dziesiętnie RAND dla RAND, a token według decimals własnego wiersza rejestru; tylko 0 lub rand oznacza RAND, niezależnie od indeksu, który zwrócił węzeł. Identyfikator tokena jest dekodowany, zanim zapytany zostanie węzeł, a wiersz listy, który odpowiada na niego indeksem 0 lub niezgodnymi polami identyfikatora, jest odrzucany. Potwierdzenie pokazuje kwotę tokena w jednostkach wyświetlania i w jednostkach bazowych, 10.00000000 zUSD (1000000000 units), więc węzeł kłamiący co do decimals tokena jest widoczny, zanim cokolwiek zostanie wysłane. Indeks aktywa i opłata są wypisywane przed generowaniem dowodu. W łańcuchu transfer tokena jest zwykłym pakietem, nieodróżnialnym od płatności w RAND; jego opłata jest w RAND, a portfel bez dostępnych RAND jest odrzucany przed generowaniem dowodu |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | stake’uje środki na walidatora: pakiet spala kwotę |
faucet [ADDRESS] | --amount <RAND> (domyślnie i maksymalnie 100) | tylko testnet: prosi węzeł walidatora o wyemitowanie środków. W łańcuchu 20 faucet wypłaca wyłącznie 16 portfelom z listy dozwolonych w jego genesis |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (powtarzalne), --out <file> (domyślnie program.json) | składa wbudowanego guesta; wypisuje identyfikator programu. rpl2_counter (v0.6.8) to program demonstracyjny RPL-2 |
program deploy <FILE> | .json, surowy .bin lub kontener obrazu zapisywany przez rand-guest build; --public <FILE>, --input <u32> (powtarzalne) lub --check-call, --cuda | wypisuje identyfikator programu, hc i liczbę słów; odrzuca program przekraczający limit łańcucha (przez rand_estimateFee) przed generowaniem dowodu; opłaca minimalną opłatę wdrożenia przez pakiet i czeka. --public zapisuje wraz z programem publiczne wejście (słowa u32 rozdzielone białymi znakami lub plik ELF .so), w granicach max_program_public_words łańcucha; identyfikator programu wiąże się wtedy z nim. Z --input lub --check-call portfel najpierw wykonuje na sucho wywołanie na tych prywatnych wejściach w emulatorze i odrzuca program, jeśli nie mieści się w limicie poziomu wywołania (14); na potrzeby sprawdzenia nic nie jest dowodzone |
program show <ID> | metadane wdrożonego programu | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (wymagane), --input N (powtarzalne, prywatne), --inputs-file <FILE.json> (tablica JSON u32, dołączana), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: deklaruje przejście stanu programu i zleca łańcuchowi jego zastosowanie. Zanim cokolwiek zostanie udowodnione, sprawdza, że łańcuch ma sekcję program_state, że program istnieje, że kontekst przejścia mieści się w regule segmentu, że każdy wpis reads zgadza się z aktualną komórką (rand_getProgramCell; niezgodność wskazuje nieaktualną komórkę i kończy się kodem 3), że skarbiec może pokryć każdy wpis pays oraz to, co to przejście wpłaca, i że ten portfel posiada token i RAND potrzebne na wpłatę i opłatę. Zlicza komórki tworzone przez zapisy, wykonuje na sucho program na rzeczywistych słowach kontekstu, dowodzi wywołanie powiązane z transakcją, następnie pakiet (opłata plus deposit.rand spalone przez burn_r i deposit.amount aktywa deposit.asset przez burn_a) oraz dowód autoryzacji. Domyślna opłata to minimalna opłata wywołania dla zadeklarowanego gazu plus opłata za komórkę za każdą utworzoną komórkę, z tym samym zapasem dwóch kroków ceny co w call. Wypisuje każdą wypłatę i, o ile nie podano --no-wait, osiem outputs z paragonu. Nieaktualny odczyt przy włączeniu do bloku także kończy się kodem 3, więc narzędzie wywołujące odczytuje ponownie i ponawia próbę. Nie publikuje transkryptu wejścia. Plik przejścia, każde pole opcjonalne: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}; klucze i wartości to 64-znakowe hex Word8, kwoty to ciągi dziesiętne w jednostkach własnych aktywa, to domyślnie wskazuje ten portfel |
program state <ID> | --cell <64 hex> | v0.6.8: każda komórka programu w kolejności kluczy (rand_getProgramCells, stronicowane do końca) albo jedna komórka z --cell, 64 zera, gdy jej brak. Odrzucane w łańcuchu bez sekcji program_state |
program vault <ID> | v0.6.8: skarbiec programu (rand_getProgramVault), jeden wiersz na każde posiadane aktywo, kwoty w jednostkach. Odrzucane w łańcuchu bez tej sekcji | |
call <PROGRAM-ID> | --input N (powtarzalne), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | najpierw uruchamia wywołanie w emulatorze i wypisuje gas: <exact> (declaring <limit>, tier <t>): dokładny gaz jest świadkiem i nigdy nie opuszcza portfela, zadeklarowany limit to publiczne GAS_LIMIT dowodu. W łańcuchu z sekcją gazu domyślny limit to dokładny gaz zaokrąglony w górę do wielokrotności 2^(t−2); max deklaruje pułap nagłówka gas_max, co nie ujawnia niczego, czego nie ujawnia poziom; N jest odrzucane poniżej dokładnego gazu lub powyżej pułapu. Bez sekcji albo z --cuda domyślne jest max. Następnie lokalnie dowodzi wywołanie na publicznym wejściu programu, zapieczętowuje transkrypt jego wejścia, płaci przez pakiet i wypisuje paragon. Domyślna opłata to minimum dla zadeklarowanego limitu, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB według cen serwowanych przez rand_getLimits, plus dwa kroki ceny zapasu tam, gdzie ceny się zmieniają, wypisane jako fee … RAND (incl. two price steps of headroom). W łańcuchu hardening_v6 opłata jest ustalana, zanim dowód istnieje, więc domyślnie wycenia limit dowodu łańcucha w miejsce dowodu, co może tylko przepłacić; --fee płaci dokładną kwotę. --expect-public odrzuca przed generowaniem dowodu, o ile publiczne wejście programu nie składa się ze słów tego pliku |
open-call <TXHASH> | --call-key <hex>, --as-auditor | otwiera transkrypt wywołania, sprawdza go względem H_IN, ponownie uruchamia program; kończy się kodem niezerowym przy niezgodności |
receipt <TX> | paragon zatwierdzonego wywołania | |
bridge-mint <ATTESTATION> | hex lub @path, --pq <JSON or @path> (wymagane), --to <rand1…> (domyślnie: ten portfel), --fee (domyślnie: minimum dla akcji), --no-wait, --cuda | wpłaca poświadczenie podpisane przez strażników jako notatkę. --pq to kworum współpodpisów Dilithium2 strażników, [{"index":0,"signature":"<4840 hex>"},…]. Przed jakimkolwiek generowaniem dowodu: dekoduje poświadczenie, sprawdza kworum względem pq_guardians węzła i identyfikatora łańcucha, sprawdza odbiorcę i identyfikator aktywa, odczytuje wymieniony indeks (rand_getAssets). Blinding notatki wpłaty jest wyprowadzany ze skrótu poświadczenia, r = blake3("rand-deposit-r-1" || mu), jedyne r, które łańcuch dopuszcza. Pakiet opłaty jest dowodzony względem całej transakcji, wraz z kworum. Wypisuje owner, time i r notatki |
bridge-rotate <ROTATION> | hex lub @path, --pq <JSON or @path> (wymagane), --fee (domyślnie: minimum dla akcji), --no-wait, --cuda | przesyła rotację zbioru strażników z kworum współpodpisów bieżącego zbioru PQ, jako BridgeAttest, który niczego nie wpłaca. Przed generowaniem dowodu odrzuca wszystko poza rotacją, która przesuwa zbiór Rand o jeden. Po wykonaniu wypisuje guardian_set_index |
bridge-pause | --sig <HEX or @path> (wymagane), --no-wait | wstrzymuje emisję przez most: PauseMints bez pakietu i bez opłaty, więc nie są potrzebne ani plik klucza, ani RAND. Plik to wynik rand-bridge-gov pause, 2 420-bajtowy podpis klucza wstrzymania zapisany jako hex, wykonany dla bieżącego pause_nonce mostu; przed wysłaniem sprawdzany względem pause_key węzła i identyfikatora łańcucha. Spalanie i rotacje pozostają otwarte podczas wstrzymania |
bridge-unpause | --pq <JSON or @path> (wymagane), --no-wait | zdejmuje wstrzymanie za pomocą kworum strażników PQ (plik z rand-bridge-gov pq-unpause) wykonanego dla bieżącego pause_nonce. Bez pakietu i bez opłaty; sam klucz wstrzymania nigdy nie może zdjąć wstrzymania |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (domyślnie 0.01), --no-wait, --cuda, --yes | spala aktyw pomostowy w kierunku wychodzącym: sprawdza, że moneta TOKEN w TO_CHAIN zabezpiecza ASSET i ma zablokowane co najmniej AMOUNT, oraz że AMOUNT i opłata relayera są całkowitymi jednostkami wydania; następnie dowodzi jeden pakiet, który wydaje aktyw w slotach 0–1, spala dokładnie AMOUNT tego aktywa (burn_a, burn_asset) i płaci opłatę w RAND ze slotów 2–3. --relayer-fee jest częścią AMOUNT, a nie dodatkową opłatą. W łańcuchu z opłatą mostu (rand_getBridgeState.fees), jak łańcuch 20, v0.6.8 najpierw wypisuje opłatę zatrzymywaną przez łańcuch (w aktywie) oraz kwotę, która zostanie wydana, i prosi o potwierdzenie; --yes pomija pytanie, a stdin, który nie jest terminalem, jest bez niego odrzucany. Sprawdzenia zablokowanych środków i opłaty relayera dotyczą wtedy wydawanej kwoty |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (losowy, jeśli nie podano), a następnie albo --fixed-supply <N> --to <rand1…>, --authority-key-out <FILE> [--initial <N> --to <rand1…>], albo (v0.6.8) --program <PROGRAM-ID>, token, którego uprawnieniem do emisji jest ten program, czyli tylko jego wywołania emitują lub spalają, startujący od zerowej podaży i wymagający sekcji program_state łańcucha, --fee (domyślnie: baza pakietu plus registration_fee rejestru; odrzucane, gdy węzeł zgłasza opłatę rejestracyjną powyżej 10 RAND, więc przekaż --fee, aby zapłacić większą celowo), --no-wait, --cuda | rejestruje token pod następnym indeksem rejestru: stała podaż (emituje raz, uprawnienie none) albo autoryzowany kluczem Key (świeży plik klucza Dilithium2, zapisany z uprawnieniami 0600, bez nadpisywania). Klucz uprawnienia leży w <FILE>.pending, dopóki łańcuch nie zaakceptuje rejestracji. Jeśli inna rejestracja zajmie indeks wcześniej, wypisuje another token took index N first — re-run to register at N+1; po powodzeniu wypisuje indeks i identyfikator, hex oraz rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (w jednostkach wyświetlania tokena), --authority-key <FILE>, --fee (domyślnie 0.001), --no-wait, --cuda | emituje więcej tokena autoryzowanego kluczem Key; odrzucane przed jakimkolwiek dowodem, jeśli token nie jest autoryzowany kluczem Key lub klucz nie jest jego uprawnieniem |
token set-authority | --asset, --authority-key <FILE>, a następnie albo --new-key <FILE>, albo --renounce, --fee (domyślnie 0.001), --no-wait, --cuda | przekazuje token autoryzowany kluczem Key innemu kluczowi albo na stałe rezygnuje z emisji |
token burn <ASSET> <AMOUNT> | --fee (domyślnie 0.001), --no-wait, --cuda | niszczy AMOUNT, w jednostkach wyświetlania tokena, tokena RPL posiadanego przez ten portfel; jego publiczna podaż spada dokładnie o tę wartość. Token pomostowy jest odrzucany przed generowaniem dowodu: opuszcza sieć przez bridge-burn |
token info <INDEX|rpl1…|hex> | pełny wiersz rand_getTokens jednego tokena: nazwa, symbol, decimals, uprawnienie, mint_nonce, całkowita podaż, registered_at, identyfikator (hex i id_text) oraz, jeśli pomostowy, każde zabezpieczenie (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (domyślnie 0), --limit <N> (domyślnie 1000) | jedna strona rand_getTokens: enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (decimals źródła pierwszego zabezpieczenia), --pq <JSON or @path> (wymagane), --fee (domyślnie: baza pakietu plus registration_fee węzła, z tym samym odrzuceniem powyżej 10 RAND co w token create), --no-wait, --cuda | rejestruje token pomostowy po genesis z jego pierwszym zabezpieczeniem, autoryzowany kworum strażników PQ (plik z rand-bridge-gov pq-register) wykonanym dla list_nonce węzła. Najpierw lista w Rand, setToken na punkcie końcowym potem |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (wymagane), --fee (domyślnie: baza pakietu), --no-wait, --cuda | dodaje zabezpieczenie do tokena pomostowego, autoryzowane kworum strażników PQ (plik z rand-bridge-gov pq-list) przy list_nonce węzła |
bridge | publiczny stan mostu: strażnicy, emitenci, rejestr aktywów, sekwencja spaleń | |
bridge-message <SEQUENCE> | jeden wychodzący komunikat spalenia, dosłownie | |
fee bundle / fee deploy <words> / fee call <tier> | --public-words M (deploy); --gas N, --bytes B, --keccak-log-height K, --sha256-log-height S (call) | minimalna opłata według cennika węzła. W łańcuchu z sekcją gazu fee call <tier> --gas N wycenia zadeklarowany limit, który wypisuje rand call, według cen na szczycie łańcucha i bez zapasu: samo minimum. Bez --gas wycenia pułap gas_max(tier, K, S), najwięcej, ile takie wywołanie może kosztować. --bytes to bajty dowodu wywołania plus koperty wejścia |
tx <HASH> | zatwierdzona transakcja z jej wysokością i indeksem | |
tx-key <HASH> | jeden wiersz na każde wyjście tej transakcji, które ten portfel wysłał, otrzymał lub zachował jako resztę: output (bundle:0 … bundle:3, cztery sloty jednego pakietu, albo mint:0), rola, kwota (w RAND albo N (asset I) dla tokena), memo, które niosło (-, gdy brak), oraz klucz transakcji, pod którym zostało zapieczętowane. Przekaż klucz z wiersza sent odbiorcy lub audytorowi, a rand_checkTransaction <HASH> <KEY> ujawni to jedno wyjście, wraz z memo. Slot pozorny nie otwiera się dla nikogo i nie ma wiersza | |
block <ID> | blok według wysokości lub hasha | |
head | { height, hash, view } | |
status | rand_status | |
peers | połączone węzły | |
validators | rejestr walidatorów |
--cuda wymaga kompilacji z --features cuda i nie ma rozwiązania zastępczego; PTX nie został jeszcze zbudowany. Nie potrafi zapieczętować koperty z danymi wejściowymi wywołania: rand call --cuda wymaga --no-envelope. Deklaruje wyłącznie pułap gazu i odrzuca --gas-limit N.
Każda notatka i nazwa kontaktu, które wypisuje CLI (potwierdzenie send, notes, history, tx-key), przechodzą najpierw przez jedną regułę wyświetlania: znaki sterujące, znaki formatujące Unicode (znaczniki dwukierunkowe, znaki o zerowej szerokości, miękki łącznik) oraz U+2028/U+2029 są pokazywane jako U+FFFD, a ciąg znaków odstępu jako jedna spacja.
Pierwszy przelew shielded
rand keygen # wallet.key.json
rand address # rand1… on stdout, its fingerprint XXXX-XXXX-XXXX-XXXX on stderr
rand faucet # testnet, allowlisted wallets only: 100 RAND into a note only you can open
rand balance # balance: 100 RAND
rand send rand1q9f… 1.5 # asks to confirm, then a minute and a half to two minutes of local proving, then the commit
rand notes # the spent note, and the change note
Udostępnianie adresu i notatka
rand address --uri --amount 1.5 --memo "invoice #42" --qr # a randpay: link, as a terminal QR
rand contacts add alice rand1q9f… # shows the fingerprint, asks add? [y/N]
rand send alice 1.5 --memo "coffee" # the memo is sealed into the payment output
rand history --memo # alice's row shows the whole memo
rand tx-key <hash> # hand the sent row's key to alice or an auditor
Notatka (memo) znajduje się w tym samym zapieczętowanym ciele co nota, więc kto potrafi otworzyć jedno, otworzy i drugie: odbiorca przez notes, a każdy, kto posiada klucz danej transakcji dla tego wyjścia, przez rand_checkTransaction <hash> <key>. Chain 18 jest pierwszym łańcuchem, którego genesis ustawia envelope_bytes; na łańcuchach od 14 do 17 --memo było odrzucane, zanim cokolwiek zostało udowodnione.
Poufne wywołanie, które można później otworzyć ponownie
rand program build --guest balance_check --arg 1000 --out bc.json
rand program deploy bc.json # prints the program id
rand call <id> --input 100 --input 200 --input 300 --input 400
rand open-call <txhash> # inputs: [100, 200, 300, 400] — verdict: faithful (exit 0)
Program ze stanem: licznik RPL-2
Na łańcuchu z sekcją program_state, jak chain 20. Licznik akceptuje dokładnie te przejścia, które odczytują jedną komórkę i zapisują ją z powrotem z pierwszym słowem zwiększonym o jeden; wszystko inne w przejściu (to, co pakiet wpłaca, co skarbiec wypłaca, co program emituje) przechodzi bez sprawdzenia, przez co jest to demonstracja, a nie program, za którym należy umieszczać wartość.
rand program build --guest rpl2_counter --out counter.json
rand program deploy counter.json # prints the program id
rand token create --name "Counter Share" --symbol CTR --decimals 0 --program <id> # say index 2
rand program state <id> --cell 0100000000000000000000000000000000000000000000000000000000000000 # 64 zeros: absent
cat > step.json <<'JSON'
{ "reads": [{ "key": "0100…00", "value": "0000…00" }],
"writes": [{ "key": "0100…00", "value": "0100…00" }],
"deposit": { "rand": "500000000", "kind": "none" },
"pays": [{ "asset": 0, "amount": "200000000", "to": "rand1…" }],
"mints": [{ "asset": 2, "amount": "1" }] }
JSON
rand program invoke <id> --transition step.json # exit 3 if the cell moved since; re-read and retry
rand program vault <id> # asset 0: 300000000 units (0.5 RAND in, 0.2 out)
Znak … w pliku oznacza pełne 64 znaki szesnastkowe, których wymaga portfel.
Co wypisuje deploy i wywołanie
Na łańcuchu z rozdzielonym uwierzytelnianiem każdy pakiet to dwa dowody tworzone na tej maszynie: uwierzytelnienie wydatku tier-10 i pakiet tier-14. program deploy z rand v0.6.7 na chain 18, 2026-09-30:
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1368908 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 116.7s: tier 14, 1500710 bytes
submitted deploy <hash>
0 RAND out, 59.8545 RAND change, fee 0.1007 RAND, anchored at height 97831, proved in 116.7s (bundle) + 6.8s (auth)
call wypisuje gaz i opłatę przed dowodem wywołania, po czym w ten sam sposób dowodzi pakiet płacący:
proving the call locally (90 inputs stay private, over the program's 11-word public input)…
gas: 5636 (declaring 6144, tier 12)
fee 0.006191437 RAND (incl. two price steps of headroom)
proved in 29.2s: tier 12, 3346865 bytes, outputs [...]
Tutaj 6,144 to 5,636 zaokrąglone w górę do wielokrotności 2^10, a rand fee call 12 --gas 6144 --bytes <B> wycenia ten limit według cen na szczycie łańcucha, bez zapasu.
rand-prover
Delegowany prover jako osobny plik binarny: tworzy dowód pakietu tier-14 portfela na innej maszynie. rand-node run --prover uruchamia tę samą usługę wewnątrz węzła. Każde polecenie podrzędne przyjmuje --home <DIR> (zmienna środowiskowa RAND_PROVER_HOME, domyślnie ~/.rand-prover), czyli katalog zawierający prover.key.json i pairings.json.
| command | arguments | behaviour |
|---|---|---|
keygen | zapisuje prover.key.json z trybem 0600 i wypisuje odcisk klucza; odmawia nadpisania | |
pair | --name <LABEL> (wymagane), --url <URL> (domyślnie http://127.0.0.1:8600), --own, --qr | tworzy token, zapisuje pod etykietą wyłącznie jego skrót i wypisuje link parowania randprover:, który przyjmuje rand prover pair. Token jest pokazywany raz, wewnątrz linku. --url to adres, pod którym portfel łączy się z tym proverem; --own dodaje own=1; --qr wypisuje link także jako kod QR w terminalu |
unpair | --name <LABEL> | usuwa parowanie; działający prover odczytuje plik przy starcie, więc zmiana zadziała po restarcie |
pairings | jedna linia na parowanie: etykieta, own lub -, data utworzenia | |
run | --listen <ADDR> (domyślnie 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (powtarzalne), --fee <RAND> z --fee-address <rand1…>, --accept-spend-key | obsługuje JSON-RPC prover_* do Ctrl-C lub SIGTERM. Start jest odrzucany, jeśli nie jest dostępne 5.74 GB × --max-parallel + 1 GiB pamięci. --per-token to liczba zadań, które jedno parowanie może mieć jednocześnie w kolejce lub w trakcie dowodzenia. --accept-spend-key jest wycofane w v0.6.8: run odmawia startu z tą flagą, a prover przyjmuje wyłącznie świadków z kluczem podglądu. W v0.6.7 dopuszczało świadków z kluczem wydatkowania, które wysyła tylko łańcuch na bundle guest v1 lub v2 |
Prover na chain 20 otrzymuje klucz podglądu nk portfela i świeży salt. Nie może wydawać środków, ale może odczytać wszystko, co ten portfel kiedykolwiek otrzymał lub wysłał: sparuj się z proverem, przed którym pokazałbyś swoją historię. Portfel sprawdza każdy otrzymany dowód.
Formaty plików kluczy
Klucz węzła:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Klucz portfela, wersja 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen zapisuje go z trybem 0600, a od v0.6.8 każde polecenie rand odmawia pracy z plikiem klucza portfela, który mogą odczytać grupa lub inni: klucz skopiowany lub przywrócony ręcznie trzeba ustawić z powrotem na 0600 (chmod 600 <key>). Utrata klucza portfela oznacza utratę każdej noty, którą mógł otworzyć; w tym wydaniu nie ma frazy odzyskiwania.