Rand Protocol
Dokumentacja
Dokumentacja techniczna

Explorer API

Podsumowanie interfejsu REST API i kanału WebSocket RandScan pod adresem randscan.org – co może udostępniać eksplorer łańcucha z transakcjami shielded, jakie są endpointy i limity zapytań – wraz z odnośnikiem do pełnego przewodnika.

Użyj API eksploratora, aby odczytywać łańcuch 20 ze skryptu, bota lub backendu bez uruchamiania węzła. Pełny przewodnik ze wszystkimi polami znajduje się w repozytorium eksploratora, randscan.org/docs/api.md; ta strona jest jego streszczeniem.

bazowy adres URLhttps://randscan.org/api/v1
WebSocketwss://randscan.org/ws
anonimowo60 żądań na minutę na adres IP
z kluczem API600 żądań na minutę; klucze pobierzesz na randscan.org/dashboard, przesyłane jako Authorization: Bearer rsk_… lub X-API-Key

Co może pokazać eksplorator łańcucha osłoniętego

W tym API nigdzie nie ma kont, sald, nadawców ani odbiorców, a od łańcucha 14 także publicznego aktywa w pakiecie (bundle): transfer RAND i transfer dowolnego tokena RPL mają ten sam kształt. API udostępnia: każdy blok; ukryty pakiet aktywów każdej transakcji w opublikowanej postaci (kotwica, cztery nullifiery, cztery zobowiązania, opłata, burn_a, burn_r, burn_asset, czas, rozmiary dowodu i koperty, a od łańcucha 17 auth_commit i rozmiar dowodu autoryzacji); akcję, którą niosła transakcja, wraz z jej polami publicznymi, w tym rejestrację tokena RPL, jego emisje i spalenia, akcje zarządzania mostem oraz przejście stanu wywołania invoke RPL-2; rejestr tokenów RPL; komórki i skarbiec programu; drzewo zobowiązań liść po liściu; zbiór nullifierów; rejestr walidatorów; audyt podaży; publiczny stan mostu, w tym wstrzymanie emisji i zbiór strażników PQ. Informację o tym, które aktywo przeniósł transfer, widzi wyłącznie klucz podglądu lub klucz transakcji, w przeglądarce. GET /accounts/:address odpowiada 410 { "error": "no_accounts" }.

Konwencje: kwoty są ciągami dziesiętnymi jednostek. Kwota, której asset_index wskazuje token inny niż RAND (indeks 0), jest wyrażona w najmniejszej jednostce tego tokena, a nie w dziewięciu miejscach dziesiętnych RAND; przed dzieleniem rozwiąż indeks przez GET /tokens/:id. registration_fee i next_index to dwa pola, które eksplorator zwraca jako zwykłe liczby JSON; hasze, identyfikatory programów, zobowiązania i nullifiery to 64 małe znaki szesnastkowe; adresy walidatorów są w base58; wysokości są liczbami całkowitymi dziesiętnymi od 0; indeksowane są tylko zatwierdzone bloki, więc blok widoczny w API jest ostateczny. Listy przyjmują page (od 1) i limit (od 1 do 100, domyślnie 20), zwracają { "data": [...], "pagination": { page, limit, total, total_pages, has_next, has_prev } }, od najnowszych. Błędy mają postać { "error", "message", "code" } z kodem 400, 404, 410, 429 lub 500.

Punkty końcowe

metoda i ścieżkazwraca
GET /healthstan eksploratora i opóźnienie indeksera
GET /statsidentyfikator łańcucha, wysokość, widok, rozmiar drzewa, liczby walidatorów, łączny stake, podaż, liczbę programów, średni czas bloku, epokę, hasz genesis i build węzła; hc_bundle i hc_auth; limits (pięć limitów genesis, następnie envelope_bytes, hardening_v6, hc_auth, genesis gas_price i byte_price, gas_metering, bundle_gas_limit, adjust_bps oraz program_state na węźle od v0.6.8); gas_prices, bieżące ceny na końcu łańcucha. limits nie zawiera pozostałych nowych pól v0.6.8 (binding_domain, proof_window_blocks, pułapów cen, admission_by_vote, testnet): odczytaj je z rand_getLimits węzła
GET /supplyaudyt podaży węzła w postaci niezmienionej, w tym cztery liczniki vesting_*, wszystkie "0" w łańcuchu 20, którego genesis nie ma sekcji vesting, oraz program_rand_out i program_rand_held z RPL-2, czyli RAND wypłacone ze skarbców programów i RAND, które nadal w nich leżą
GET /bridgepubliczny stan mostu: emitter, emitters, guardian_set_index, guardians, pq_guardians, mint_paused, pause_nonce, list_nonce, pause_key, registration_fee, burn_sequence, next_index (null od łańcucha 14), rotation_nonce, rules_v2 (z global_minted_in_window i global_mint_headroom), min_inbound_sequence, assets oraz endpoints, czyli własny zapis eksploratora każdego emitenta w postaci, w jakiej drukuje go łańcuch źródłowy. Nie zwraca pól węzła z v0.6.8: fees, rotation_rules ani pending_rotations: odczytaj je z rand_getBridgeState
GET /bridge/assetsjeden wiersz na zabezpieczenie: wiersz rejestru (index, chain, token, asset_id, locked, minted_today, mint_cap_per_day, a na węźle v0.6.8 minted_in_window, mint_window_secs i mint_headroom, czyli największy depozyt, jaki limity dopuszczają obecnie) połączony z symbol, name, decimals i backings oraz zindeksowanymi sumami. Dla zabezpieczenia: burns, burned, outstanding (locked z rejestru), a deposits/deposited tylko wtedy, gdy token ma jedno zabezpieczenie (w przeciwnym razie null: depozyt wskazuje token, który wyemitował, a nie monetę zablokowaną na jego poczet). Dla tokena, identyczne w każdym wierszu o tym samym index: token_deposits, token_deposited, token_burns, token_burned, first_height, last_height; przy sumowaniu licz każdy index raz
GET /bridge/tokenslistę dozwolonych tokenów, listę statyczną: USDT i USDC na Ethereum, BSC, Tron i Solana, przy czym USDC na Tron zostało wycofane
GET /tokenscały rejestr tokenów RPL w postaci zapisanej w pamięci podręcznej z węzła: enabled, registration_fee, next_index, tokens
GET /tokens/:idjeden token według indeksu rejestru, 64-znakowego identyfikatora szesnastkowego lub postaci tekstowej rpl1…, plus deploy_tx i supply_history; 404, gdy nic nie pasuje
GET /nodeswęzeł eksploratora i jego peery, z geolokalizacją
GET /proversdelegowani dowodzący (provers) znani eksploratorowi (jego własna lista; łańcuch nie prowadzi ich rejestru): czy każdy odpowiada na prover_info, jego przepustowość i opłata oraz położenie jego hostów
GET /blocks?page&limit&proposer, GET /blocks/latest?limit, GET /blocks/:idbloki, według wysokości lub hasza
GET /transactions?page&limit&kind&height&validator&program, GET /transactions/latest, GET /transactions/:hashtransakcje; kind to transfer, mint, deploy, call, bond, unbond, withdraw, bridge_attest, bridge_burn, register_token, token_mint, set_authority, token_burn, pause_mints, unpause_mints, register_bridged_token, list_backing, invoke. Nie istnieje token_transfer: transfer dowolnego tokena RPL to transfer
GET /transactions/:hash/envelopesnotatki utworzone przez transakcję wraz z ich kopertami: cztery sloty pakietu, w tym atrapy, oraz notatki obliczone przez łańcuch, które dopisuje depozyt bridge_attest, token_mint, początkowa emisja register_token lub wypłaty invoke; dla wywołania h_in i zapieczętowany transkrypt wejścia
GET /envelopes?from_leaf&limitliście z kopertami, od najstarszych, do 1000 na stronę, do skanowania historii
GET /notes?page&limit, GET /notes/:idliście drzewa, według zobowiązania lub indeksu liścia
GET /nullifiers/:nftransakcję, która opublikowała nullifier
GET /validators, GET /validators/:addressrejestr, z share_percent, blocks_proposed, wysokością ostatniej propozycji
GET /programs?page&limit, GET /programs/:idwdrożone programy (base_pc, words_len, code_hash, public_words_len, public_digest) z liczbą wywołań call i invoke; ostatnie wywołania i invoke programu oraz jego program_state, odczytany na żywo z węzła: vault (według aktywa), pierwsze 100 cells w kolejności kluczy i cells_next
GET /programs/:id/cells?after&limitstronę komórek programu w kolejności kluczy, na żywo z węzła (limit od 1 do 1000, domyślnie 100): { "cells", "next" }; 404 w łańcuchu bez sekcji program_state
GET /search?q=bloki, transakcje, programy, notatki, nullifiery i walidatorów
curl -s https://randscan.org/api/v1/stats
curl -s https://randscan.org/api/v1/tokens/1
curl -s https://randscan.org/api/v1/transactions/8aa13d1f76d28f63a46c30bb09ef44b1ba35083ca80ba7301997f98e5f783666

Podsumowanie transakcji (mint z faucetu na 10 RAND na wysokości 102 197 łańcucha 18):

{
  "hash": "a20b…feb5", "height": 102197, "block_hash": "f362…a06f", "tx_index": 0,
  "kind": "mint", "fee": "0", "timestamp_ms": 1790777106034,
  "has_bundle": false, "program": null, "validator": "EdrEC2QRQrQF64iRXxF9927jNj6RidiHHByzx5xD6F1e",
  "amount": "10000000000", "asset_index": null
}

amount jest wypełnione tylko dla rodzajów z kwotą publiczną — mint, bond, unbond, withdraw, bridge_attest, bridge_burn, token_mint, token_burn oraz register_token z początkową emisją — i ma wartość null dla transferu, którego asset_index również zawsze jest null. has_bundle jest fałszem dla mint, unbond, withdraw, pause_mints i unpause_mints, które nie niosą pakietu i nie płacą opłaty. Szczegóły dodają chain_id, bundle oraz, zależnie od rodzaju: words_len wdrożenia; call_proof_len, input_envelope_len i receipt wywołania (tx, program, tier, outputs, height, index, h_in, h_pub); registered dla bond; action_nonce dla unbond lub withdraw; attestation_len, recipient, note_time, deposit_r, commitment, pq_signers dla atestacji mostu; relayer_fee, to_chain, bridge_to, bridge_token dla spalenia mostu; token_action akcji RPL (własne pola akcji, oznaczone przez kind), z recipient, note_time, deposit_r dla wyemitowanej notatki oraz action_nonce dla token_mint lub set_authority; bridge_governance akcji zarządzania mostem, z pq_signers we wszystkich poza pause_mints; call_proof_len, input_envelope_len, receipt i transition dla invoke (zapis węzła: odczytane i zapisane komórki, inflow oraz każda notatka pays i mints z jej recipient, time, r i cm). Rodzaj z v0.6.8, którego ten build eksploratora nie zna (admit_validator, slash_equivocation, rotacje _v2, cancel_rotation), to other.

W łańcuchu 20, z opłatami mostu, amount w bridge_attest i bridge_burn jest kwotą brutto: kwotą, którą podpisali strażnicy, lub kwotą spaloną przez pakiet. Eksplorator nie zwraca depozytu netto, wypłaconej kwoty ani notatki opłaty; odczytaj je z rand_getTransaction węzła (deposit_amount, release_amount, fee_note) oraz rand_getBridgeBurn. Spalenie 0,999 zUSD na wysokości 2 899 jest tu zapisane jako "amount": "99900000"; strażnicy podpisali wypłatę 99800100.

Pakiet w szczegółach transakcji to ukryty pakiet aktywów, bez pola aktywa i bez drugiego pakietu przy spaleniu. Ten zapłacił za wywołanie w przykładzie curl powyżej, na wysokości 98 335 łańcucha 18; ta transakcja nie istnieje w łańcuchu 20, gdzie trzecie curl odpowiada 404:

"bundle": {
  "anchor": "b814…b1ed",
  "nullifiers": ["49d4…a766", "3363…61ea", "aac0…fcfc", "546c…3efd"],
  "commitments": ["b52b…4f7b", "9ddd…0448", "5fa7…1630", "2827…8343"],
  "fee": "6191437", "burn_a": "0", "burn_r": "0", "burn_asset": 0, "time": 98185,
  "proof_len": 1504260, "envelope_len": [1860, 1860, 1860, 1860],
  "auth_commit": "0bda…6512", "auth_proof_len": 1367303
}

auth_commit i auth_proof_len to podzielona autoryzacja (łańcuchy 17 i nowsze, w których ustawione jest limits.hc_auth): dowód pakietu powstaje z klucza podglądu i publikuje auth_commit, a drugi, mały dowód nad kluczem wydatkowania, związany z tą samą transakcją, musi się z nim zgadzać. Oba dowody są raportowane wyłącznie przez długość. Każda koperta w łańcuchu 20 ma 1860 bajtów (limits.envelope_bytes) i niesie zaszyfrowane memo; łańcuchy do 17 zapieczętowywały 1348 bajtów. Zadeklarowany limit gazu wywołania jest publiczną wartością jego dowodu, a nie polem receipt, więc eksplorator nie pokazuje go przy każdej transakcji; zapłacona opłata znajduje się w fee.

burn_a to prywatny zasób spalony, różny od zera tylko przy token_burn, bridge_burn albo invoke, które wpłaca lub spala token, a burn_asset wskazuje indeks w rejestrze; burn_r to spalony RAND, różny od zera tylko przy bond albo invoke, które wpłaca RAND do skarbca programu.

W chain 20 zUSD („Shielded USD”, osiem miejsc dziesiętnych) znajduje się pod indeksem 1, wpisany w genesis ze wszystkimi siedmioma zabezpieczeniami (registered_at 0, więc deploy_tx ma wartość null) i przeniesiony z chain 14 pod tym samym identyfikatorem zasobu. GET /bridge/assets zwraca zatem siedem wierszy pod indeksem 1. Pięć kolejnych tokenów zarejestrowano w chain 20 pierwszego dnia, pod indeksami od 2 do 6, z czego trzy mają program jako organ emisji; GET /tokens je wylicza. W chain 20 GET /bridge zwraca rules_v2 z globalnym limitem emisji 4 000 zUSD ("400000000000") na okno 86 400 sekund, rotation_nonce równe 0, burn_sequence równe 13 w genesis oraz min_inbound_sequence równe 3 dla łańcuchów źródłowych 2, 3 i 4 oraz 7 dla łańcucha źródłowego 5 (1 i 4 w chain 19): to dolny próg odtwarzania z genesis, czyli najniższy numer sekwencji blokady, jaki może nieść poświadczenie łańcucha źródłowego, aby zostać tu wyemitowane. W chain 14 został zarejestrowany na wysokości 256 przez register_bridged_token, a pozostałe sześć zabezpieczeń dodano transakcjami list_backing.

Otwieranie kopert w przeglądarce

Koperta to publiczne dane łańcucha, a eksplorator nie przechowuje żadnego klucza. Strona transakcji i strona History otwierają koperty w przeglądarce za pomocą kompilacji WebAssembly kodu samego węzła (crates/randscan-viewing): wklej klucz podglądu (nk, 64 znaki hex), aby zobaczyć każdą notę wysłaną lub otrzymaną przez daną stronę, klucz transakcji, aby otworzyć jedną płatność, klucz wywołania, aby otworzyć dane wejściowe jednego wywołania, albo plik klucza portfela, z którego zachowywany jest wyłącznie wyprowadzony klucz podglądu. Otwarta nota jest weryfikowana przez ponowne obliczenie jej zobowiązania. Ujawniony asset to indeks tokena w rejestrze, rozwiązywany przez GET /tokens do symbolu i liczby miejsc dziesiętnych; to jedyne miejsce, w którym kwota transferu jest powiązana z zasobem. Slot pozorny nie otwiera się dla żadnego klucza i wygląda tak samo jak nota, która nie jest twoja. Nic o kluczu nie przechodzi przez sieć; aby zbudować to samo narzędzie, pobierz /envelopes i /transactions/:hash/envelopes i użyj tego crate’a.

Kanał WebSocket

Połącz się z wss://randscan.org/ws i zasubskrybuj blocks, transactions lub stats:

{ "type": "subscribe", "channel": "blocks" }
{ "type": "new_block", "block": { … BlockSummary … } }
{ "type": "new_transaction", "transaction": { … TransactionSummary … } }
{ "type": "stats_update", "stats": { … } }

Wysyłaj { "type": "ping" } co 30 sekund przez serwery proxy. Kanał nie odtwarza historii: po zerwaniu połączenia połącz się ponownie i uzupełnij dane przez GET /transactions?height=.

Uruchomienie własnej instancji

Wszystko to jest serwowane przez otwartoźródłowy eksplorator w randprotocol/randscan.org; indekser potrzebuje wyłącznie JSON-RPC rand_* węzła i bazy danych PostgreSQL.

Ostatnio zweryfikowano względem commitu fullnode c0878c3f (łańcuch 21) dnia 2026-10-12, a także randscan commit fffa404 (docs/api.md), the live API at randscan.org, 2026-09-20, the live API at randscan.org on chain 18, 2026-09-30, the live API at randscan.org on chain 19, 2026-10-01, randscan commit 4390731 (docs/api.md: RPL-2, BRG-19 and `/provers`) and the live API at randscan.org on chain 20, 2026-10-01; `/stats` on chain 21, 2026-10-12. Jeśli kod i ta strona się różnią, rację ma kod; prosimy o zgłoszenie.