Rand Protocol
Документация
Справочник

API обозревателя

Обзор REST API и канала WebSocket RandScan на randscan.org: что может отдавать обозреватель экранированного блокчейна, конечные точки и лимиты запросов, со ссылкой на полное руководство.

Используйте API обозревателя, чтобы читать цепочку 21 (действующую с 2026-10-12; обозреватель переиндексировал её с генезиса) из скрипта, бота или бэкенда без запуска узла. Полное руководство со всеми полями находится в репозитории обозревателя: randscan.org/docs/api.md; эта страница — краткое изложение.

базовый URLhttps://randscan.org/api/v1
WebSocketwss://randscan.org/ws
анонимно60 запросов в минуту с одного IP
с ключом API600 запросов в минуту; ключи выдаются на randscan.org/dashboard, передаются как Authorization: Bearer rsk_… или X-API-Key

Что может показать обозреватель экранированной цепочки

В этом API нигде нет счетов, балансов, отправителей и получателей, а начиная с цепочки 14 в пакете нет и публичного актива: перевод RAND и перевод любого токена RPL имеют одинаковую форму. API отдаёт: каждый блок; пакет со скрытым активом каждой транзакции в опубликованном виде (якорь, четыре нуллификатора, четыре обязательства, комиссия, burn_a, burn_r, burn_asset, время, размеры доказательства и конверта, а начиная с цепочки 17 — auth_commit и размер доказательства авторизации); действие, которое несла транзакция, и его публичные поля, включая регистрацию токена RPL, его выпуск и сжигание, действия управления мостом и переход состояния при invoke в RPL-2; реестр токенов RPL; ячейки и хранилище программы; дерево обязательств лист за листом; множество нуллификаторов; реестр валидаторов; аудит предложения; публичное состояние моста, включая паузу выпуска и набор PQ-хранителей. Какой актив переместил перевод, показывается только ключу просмотра или ключу транзакции, в браузере. GET /accounts/:address отвечает 410 { "error": "no_accounts" }.

Соглашения: суммы — десятичные строки в единицах. Сумма, у которой asset_index указывает на токен, отличный от RAND (индекс 0), выражена в наименьшей единице этого токена, а не в девяти знаках RAND; прежде чем делить, определите индекс через GET /tokens/:id. registration_fee и next_index — два поля, которые обозреватель отдаёт как обычные числа JSON; хеши, идентификаторы программ, обязательства и нуллификаторы — 64 строчных шестнадцатеричных символа; адреса валидаторов — в base58; высоты — десятичные целые числа, начиная с 0; индексируются только зафиксированные блоки, поэтому блок в API окончателен. Списки принимают page (от 1) и limit (от 1 до 100, по умолчанию 20), возвращают { "data": [...], "pagination": { page, limit, total, total_pages, has_next, has_prev } }, сначала самые новые. Ошибки имеют вид { "error", "message", "code" } с кодом 400, 404, 410, 429 или 500.

Конечные точки

метод и путьвозвращает
GET /healthсостояние обозревателя и отставание индексатора
GET /statsидентификатор цепочки, высоту, view, размер дерева, число валидаторов, общий стейк, предложение, число программ, среднее время блока, эпоху, хеш генезиса и сборку узла; hc_bundle и hc_auth; limits (пять генезисных ограничений, затем envelope_bytes, hardening_v6, hc_auth, генезисные gas_price и byte_price, gas_metering, bundle_gas_limit, adjust_bps и, на узле начиная с v0.6.8, program_state); gas_prices — действующие цены на вершине цепочки. limits не содержит остальных новых полей v0.6.8 (binding_domain, proof_window_blocks, потолки цен, admission_by_vote, testnet) и полей v0.8.0 (hc_auth_multisig, fee_rules, perps, multisig): читайте их через rand_getLimits узла. В цепочке 21 chain_id равен 21, а сборка — 0.8.0
GET /supplyаудит предложения узла без изменений, включая четыре счётчика vesting_*, все равные "0" в цепочке 21, в генезисе которой нет секции vesting, а также program_rand_out и program_rand_held из RPL-2 — RAND, выплаченный из хранилищ программ, и RAND, который они ещё держат; на узле v0.8.0 — base_fees_burned (нижние границы комиссий пакетов, сожжённые по секции fees цепочки 21), пару perps_* и пять счётчиков multisig_* (multisig_issued — это казначейство в 100,000 RAND)
GET /bridgeпубличное состояние моста: emitter, emitters, guardian_set_index, guardians, pq_guardians, mint_paused, pause_nonce, list_nonce, pause_key, registration_fee, burn_sequence, next_index (null начиная с цепочки 14), rotation_nonce, rules_v2 (с global_minted_in_window и global_mint_headroom), min_inbound_sequence, assets и endpoints — представление обозревателя для каждого эмиттера в том виде, в каком его печатает исходная цепочка. Поля fees, rotation_rules и pending_rotations из v0.6.8 он не отдаёт: читайте их через rand_getBridgeState
GET /bridge/assetsпо строке на каждое обеспечение: строка реестра (index, chain, token, asset_id, locked, minted_today, mint_cap_per_day, а на узле v0.6.8 — minted_in_window, mint_window_secs и mint_headroom, наибольший депозит, который сейчас допускают лимиты), объединённая с symbol, name, decimals и backings, и проиндексированные итоги. По каждому обеспечению: burns, burned, outstanding (locked из реестра), а deposits/deposited — только если у токена одно обеспечение (иначе null: депозит называет токен, который он выпустил, а не монету, заблокированную под него). По каждому токену, одинаково в каждой строке с одним и тем же index: token_deposits, token_deposited, token_burns, token_burned, first_height, last_height; при подсчёте итогов учитывайте каждый index один раз
GET /bridge/tokensсписок разрешённых токенов моста, статичный: USDT и USDC на Ethereum, BSC, Tron и Solana, причём USDC на Tron прекращён
GET /tokensвесь реестр токенов RPL в том виде, в каком он кеширован с узла: enabled, registration_fee, next_index, tokens
GET /tokens/:idодин токен по индексу реестра, 64-символьному шестнадцатеричному идентификатору или текстовой форме rpl1…, плюс deploy_tx и supply_history; 404, если ничего не найдено
GET /nodesузел обозревателя и его пиры, с геолокацией
GET /proversделегированные доказывающие, о которых знает обозреватель (его собственный список; цепочка не хранит о них записей): отвечает ли каждый на prover_info, его мощность и комиссия, и где находятся его хосты
GET /blocks?page&limit&proposer, GET /blocks/latest?limit, GET /blocks/:idблоки, по высоте или хешу
GET /transactions?page&limit&kind&height&validator&program, GET /transactions/latest, GET /transactions/:hashтранзакции; kind — это 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. Значения token_transfer нет: перевод любого токена RPL — это transfer
GET /transactions/:hash/envelopesноты, созданные транзакцией, с их конвертами: четыре слота пакета, включая фиктивные, а также вычисленные цепочкой ноты, которые добавляют депозит bridge_attest, token_mint, начальный выпуск register_token или выплаты invoke; для вызова — h_in и запечатанная транскрипция входа
GET /envelopes?from_leaf&limitлистья с конвертами, сначала самые старые, до 1,000 на страницу, для сканирования истории
GET /notes?page&limit, GET /notes/:idлистья дерева, по обязательству или индексу листа
GET /nullifiers/:nfтранзакция, опубликовавшая нуллификатор
GET /validators, GET /validators/:addressреестр, с share_percent, blocks_proposed, высотой последнего предложенного блока
GET /programs?page&limit, GET /programs/:idразвёрнутые программы (base_pc, words_len, code_hash, public_words_len, public_digest) со счётчиками вызовов и invoke; недавние вызовы и invoke программы и её program_state, читаемое с узла вживую: vault (по активам), первые 100 cells в порядке ключей и cells_next
GET /programs/:id/cells?after&limitстраница ячеек программы в порядке ключей, вживую с узла (limit от 1 до 1,000, по умолчанию 100): { "cells", "next" }; 404 в цепочке без секции program_state
GET /search?q=блоки, транзакции, программы, ноты, нуллификаторы и валидаторы
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

Краткое описание транзакции (mint из крана на 10 RAND на высоте 102,197 цепочки 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 заполняется только для видов с публичной суммой — mint, bond, unbond, withdraw, bridge_attest, bridge_burn, token_mint, token_burn и register_token с начальным выпуском — и равно null для перевода, у которого asset_index тоже всегда null. has_bundle равно false для mint, unbond, withdraw, pause_mints и unpause_mints, которые не несут пакета и не платят комиссию. Подробный вид добавляет chain_id, bundle и, по видам: у deploy — words_len; у call — call_proof_len, input_envelope_len и receipt (tx, program, tier, outputs, height, index, h_in, h_pub); у bond — registered; у unbond или withdraw — action_nonce; у аттестации моста — attestation_len, recipient, note_time, deposit_r, commitment, pq_signers; у сжигания в мосте — relayer_fee, to_chain, bridge_to, bridge_token; у действия RPL — token_action (собственные поля действия, помеченные kind), с recipient, note_time, deposit_r для выпущенной ноты и action_nonce для token_mint или set_authority; у действия управления мостом — bridge_governance, с pq_signers у всех, кроме pause_mints; у invoke — call_proof_len, input_envelope_len, receipt и transition (представление узла: прочитанные и записанные ячейки, inflow и каждая нота pays и mints с её recipient, time, r и cm). Вид из v0.6.8, которого эта сборка обозревателя не знает (admit_validator, slash_equivocation, ротации _v2, cancel_rotation), обозначается как other.

Начиная с цепочки 20, с комиссиями моста, amount у bridge_attest и bridge_burn — это брутто: сумма, которую подписали хранители, или сумма, которую сжёг пакет. Обозреватель не отдаёт чистый депозит, выпущенную сумму и ноту комиссии; читайте их через rand_getTransaction узла (deposit_amount, release_amount, fee_note) и rand_getBridgeBurn. Сжигание 0.999 zUSD на высоте 2,899 выглядит здесь как "amount": "99900000"; хранители подписали выпуск 99800100.

Пакет в подробном виде транзакции — это пакет со скрытым активом, без поля актива и без второго пакета при сжигании. Этот пакет оплатил вызов из примера с curl выше, на высоте 98,335 цепочки 18; в цепочке 21 такой транзакции нет, и третий curl отвечает 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 и auth_proof_len относятся к раздельной авторизации (цепочки 17 и новее, где задано limits.hc_auth): доказательство пакета строится по ключу просмотра и публикует auth_commit, а второе, небольшое доказательство по ключу траты, привязанное к той же транзакции, должно с ним совпасть. Оба доказательства сообщаются только длиной. Каждый конверт в цепочках 20 и 21 занимает 1 860 байт (limits.envelope_bytes) и содержит зашифрованную памятку; в цепочках до 17 включительно запечатывалось 1 348 байт. Заявленный лимит газа вызова является публичным значением его доказательства, а не полем квитанции, поэтому обозреватель не показывает его для каждой транзакции; уплаченная комиссия указана в fee.

burn_a — сожжённый приватный актив, отличен от нуля только для token_burn, bridge_burn или invoke, который вносит или сжигает токен; burn_asset указывает индекс в реестре. burn_r — сожжённые RAND, отличен от нуля только для bond или invoke, который вносит RAND в хранилище программы.

В цепочке 21, как и в цепочке 20, zUSD («Shielded USD», восемь десятичных знаков) находится под индексом 1, внесён в genesis со всеми семью видами обеспечения (registered_at равен 0, поэтому deploy_tx равен null) и перенесён из цепочки 14 под тем же идентификатором актива. Поэтому GET /bridge/assets возвращает семь строк под индексом 1. В цепочке 20 было зарегистрировано ещё одиннадцать токенов (пять в первый день, под индексами от 2 до 6, у трёх из них программа выступает как орган выпуска); ни один не был перенесён в цепочку 21, в genesis которой указан только zUSD, поэтому GET /tokens в цепочке 21 возвращает одну строку, пока не будет зарегистрировано что-либо новое. В цепочке 21 GET /bridge сообщает rules_v2 с глобальным лимитом выпуска 4 000 zUSD ("400000000000") на окно в 86 400 секунд, rotation_nonce равным 0, burn_sequence равным 14 в genesis (13 в цепочке 20) и min_inbound_sequence равным 3 для исходных цепочек 2 и 4, 5 для исходной цепочки 3 и 7 для исходной цепочки 5 (3, 3, 3 и 7 в цепочке 20; 1 и 4 в цепочке 19): это нижняя граница воспроизведения в genesis, наименьший номер блокировки, который может нести аттестация исходной цепочки, чтобы здесь был выпущен токен. В цепочке 14 он был зарегистрирован на высоте 256 транзакцией register_bridged_token, а остальные шесть видов обеспечения добавлены транзакциями list_backing.

Открытие конвертов в браузере

Конверт — это публичные данные цепочки, а у обозревателя нет ключа. Страница транзакции и страница History открывают конверты в браузере с помощью сборки WebAssembly из собственного кода узла (crates/randscan-viewing): вставьте ключ просмотра (nk, 64 hex), чтобы увидеть все ноты, которые эта сторона отправила или получила, ключ транзакции, чтобы открыть один платёж, ключ вызова, чтобы открыть входные данные одного вызова, либо файл ключа кошелька, из которого сохраняется только производный ключ просмотра. Открытая нота проверяется пересчётом её обязательства. Её раскрытый asset — это индекс в реестре токенов, по которому через GET /tokens определяются символ и число десятичных знаков; это единственное место, где сумма перевода связывается с активом. Фиктивный слот не открывается ни одним ключом и выглядит так же, как нота, которая вам не принадлежит. Ничего о ключе по сети не передаётся; чтобы собрать такой же инструмент, получите /envelopes и /transactions/:hash/envelopes и используйте этот крейт.

Лента WebSocket

Подключитесь к wss://randscan.org/ws и подпишитесь на blocks, transactions или stats:

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

Отправляйте { "type": "ping" } каждые 30 секунд, если соединение идёт через прокси. У ленты нет повторной выдачи: при обрыве переподключитесь и восполните пропущенное через GET /transactions?height=.

Запуск собственного экземпляра

Всё описанное здесь обслуживается обозревателем с открытым исходным кодом в randprotocol/randscan.org; индексатору нужны только JSON-RPC rand_* узла и база данных PostgreSQL.

Последняя проверка по коммиту fullnode c0878c3f (chain 21) от 2026-10-12, а также 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. Если код и эта страница расходятся, прав код; сообщите нам.