Node ini melayani JSON-RPC 2.0 melalui HTTP pada --rpc (bawaan 127.0.0.1:8545), dan WebSocket pada port yang sama untuk langganan. Sejak v0.6.8 node juga dapat membuka listener kedua yang bersifat publik (--public-rpc, di bawah). randprotocol_client::RpcClient (Rust) membungkus setiap metode di bawah ini. Halaman ini adalah daftar metode sebagaimana disajikan v0.6.8 (c9c9bd3c), build yang dijalankan chain 20; bila suatu metode ada dalam kode tetapi tidak aktif di chain 20, hal itu dinyatakan.
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_getHead","params":[]}'
Endpoint publik
https://rpc.randprotocol.org (proxy yang sama juga tersedia di https://randprotocol.org/api/rpc) meneruskan permintaan ke node arsip chain 20 yang menyimpan setiap blok, bagi wallet dan halaman web yang tidak memiliki node sendiri (rand --rpc https://rpc.randprotocol.org …). Endpoint ini hanya menerima HTTP POST, dengan CORS terbuka dan tanpa WebSocket, dan cakupannya lebih sempit daripada node:
- Satu permintaan per panggilan. Batch ditolak dengan
-32600. - Daftar izin (allowlist) metode: sejak 2026-10-01 sama dengan himpunan pada listener publik node itu sendiri (
rpc::PUBLIC_METHODSdi v0.6.8). Dengan demikian pembacaan status program yang dibutuhkanrand program invoke,rand_getAdmitted, pembacaan agregasi, dan pembacaan vesting termasuk di dalamnya, bersamarand_checkTransactiondanrand_sendTransaction.rand_mint,rand_importViewingKey,rand_getViewingNotes,rand_removeViewingKey, danrand_getPeerstidak termasuk, dan dijawab dengan-32601method not allowed heretanpa mencapai node: faucet publik adalah permukaan penyalahgunaan, dan viewing key hanya boleh dikirim ke node yang Anda jalankan sendiri. - Badan permintaan paling banyak 12 MiB, yang memuat setiap transfer, aksi token, atau deploy, serta panggilan dengan proof hingga sekitar 3,4 MB (transaksi dikodekan dalam hex, dan proof bundle serta auth-nya memakan sekitar 2,85 MB sebelum proof panggilan). Panggilan yang lebih besar harus dikirim ke node Anda sendiri. Bila melampaui batas: HTTP 413 dan
-32600. - Per alamat, 1.200 permintaan per menit, dan 6 per menit untuk
rand_sendTransaction. Bila melampauinya: HTTP 429 dan-32005. Anggaran pembacaan disesuaikan dengan sinkronisasi pertama sebuah wallet, yaitu beberapa ratus permintaan dalam satu rentetan (645 pada ketinggian 99.000 chain 18). -32000upstream unavailablebila node di belakangnya tidak menjawab.
Segala hal lain di halaman ini menjelaskan node itu sendiri.
Dua listener node
Sejak v0.6.8 (audit v6) sebuah node memiliki dua listener JSON-RPC.
--rpc <ADDR>, listener operator. Semua metode, batch, dan WebSocket. Listener ini mengenali pemanggil dari alamat socket-nya dan memercayai loopback: metode viewing key hanya dijawab untuk loopback, dan loopback tidak diukur. Biarkan tetap pada127.0.0.1. Reverse proxy atau SSH forward tiba melalui loopback, sehingga di belakang salah satunya setiap pengunjung adalah operator: jangan pernah mengarahkan endpoint publik ke port ini.--public-rpc <ADDR>, listener publik, untuk lompatan (hop) tersebut. Listener ini melayani himpunan metode yang tetap, yakni pembacaan yang dibutuhkan wallet, explorer, atau halaman web, sertarand_sendTransaction(rpc::PUBLIC_METHODS).rand_importViewingKey,rand_getViewingNotes,rand_removeViewingKey,rand_mint, danrand_getPeerstidak pernah dilayani di sana, begitu pula metode apa pun yang ditambahkan kemudian sampai metode itu didaftarkan; panggilan semacam itu dijawab-32000<method> is not served on this node's public listener. Batch dijawab-32600, dan tidak ada rute WebSocket. Satu pengukur mencakup seluruh pemanggil secara bersama, 600 permintaan dalam satu rentetan dan 150 per detik; di atas itu, HTTP 429 dengan badan-32000. Batas per pengunjung menjadi urusan proxy, yang dapat melihat para pengunjung. Para pemanggilnya memegang paling banyak separuh slot pembacaan blocking milik node, sehingga listener operator tidak pernah kekurangan.
Kedua listener berbagi dua batas pembacaan. Pembacaan blocking yang belum kembali dalam 30 detik dijawab -32000 this read took longer than 30 s on this node; retry with a smaller range. rand_getBlocks mengakhiri halamannya setelah membaca 64 MiB blok.
--rpc-viewing-token-file <PATH> memasang bearer token pada metode viewing key milik --rpc: baris pertama berkas tersebut, minimal 32 karakter, dikirim sebagai Authorization: Bearer <token>. Dengan opsi ini, loopback saja tidak cukup, dan pemanggil mana pun yang menyodorkan token itu akan dilayani.
Konvensi
- Alamat validator adalah string base58 (32 byte). Hash terdiri dari 64 karakter hex, dengan atau tanpa
0x. Nilai shielded — commitment, nullifier, anchor, akar pohon, tingkat witness — berupaWord8: delapan wordu32little-endian sebagai 64 karakter hex huruf kecil. - Alamat shielded berbentuk
rand1+ base58, 1.667 karakter. Parameter yang lebih panjang dari 2.000 karakter ditolak berdasarkan panjangnya sebelum diurai. - Setiap jumlah
u64adalah string desimal ("1500000000"= 1,5 RAND; 1 RAND = 10⁹ unit): unit RAND atau unit token, status chain atau field milik transaksi yang didekode. Angka JSON bukan bilangan bulat yang eksak di atas 2⁵³, dan suplai token 9 desimal melewati batas itu pada beberapa puluh juta unit. Lihat catatan bertanggal di bawah mengenai apa yang berubah karenanya. - Indeks, nonce, ketinggian, indeks daun, view, panjang, desimal, dan penghitung hari (
mint_day) bukan jumlah dan selalu berupa bilangan bulat JSON. - Setiap permintaan harus memuat anggota
id. Objek tanpaidadalah notifikasi dan ditolak dengan-32600;"id": nullyang eksplisit adalah permintaan biasa. - Tidak ada metode saldo dan tidak ada metode akun. Wallet menghitung saldonya dengan memindai
rand_getCommitmentsdanrand_getNullifiersmenggunakan viewing key-nya.rand_getBalance,rand_getAccount, danrand_getAssetBalancedijawab-32601.
Perubahan yang memutus kompatibilitas, 2026-09-20 (chain 14): setiap jumlah adalah string desimal
Sebelum chain 14, jumlah di dalam transaksi yang didekode berupa bilangan bulat JSON. Pengecualian itu telah dihapus. Field berikut berubah dari angka JSON menjadi string desimal, tanpa perubahan lain pada makna atau posisinya:
bundle.fee, padatxmilikrand_getTransactiondan padatransactions[]milikrand_getBlockByHeight/rand_getBlockByHash;action.amountuntukkind=mint,bond,unbond,withdraw,bridge_attest(pada ketiga metode yang sama);action.amountdanaction.relayer_feeuntukkind=bridge_burn(pada ketiga metode yang sama);lockedpada barisrand_getAssetsdanrand_getBridgeState.assets[].
Klien yang membaca salah satu field ini sebagai angka harus mengurainya sebagai string. aggregation.subsidy_base milik rand_status (hanya pada chain dengan agregasi) menjadi string dalam perubahan yang sama. Setiap jumlah lainnya sudah berupa string: rand_getSupply, rand_getEmission, rand_getValidators, viewing note, dan setiap field yang diperkenalkan bersama chain 14 — burn_a dan burn_r milik bundle, suplai token, locked, mint_cap_per_day, dan minted_today pada setiap backing, registration_fee, serta amount milik token_mint, token_burn, dan register_token (initial_amount, initial.amount).
Batch
Badan POST dapat berupa array berisi paling banyak 20 objek permintaan, yang dijawab dengan array berpanjang sama dalam urutan permintaan, termasuk kesalahannya. Permintaan dijalankan satu per satu. Array kosong, array berisi lebih dari 20, atau badan yang bukan objek maupun array dijawab dengan satu -32600 dengan id null. Seluruh badan tetap dibatasi oleh batas badan permintaan node, yang disesuaikan untuk satu transaksi pembawa proof: batch berisi dua panggilan rand_sendTransaction pembawa proof ditolak dengan 413. Batch-kan pembacaan, bukan pengiriman yang disertai proof.
Chain dan node
rand_chainId
Parameter []. Hasil: id chain (bilangan bulat); 20 pada testnet.
rand_tokenInfo
Parameter []. Hasil { "symbol": "RAND", "decimals": 9 }.
rand_getHead
Parameter []. Hasil { "height": 1998, "hash": "…", "view": 2251 }. view adalah view konsensus node saat ini, yang mendahului ketinggian ketika view mengalami timeout.
rand_status (alias rand_syncStatus)
Parameter []. Hasil:
{
"height": 1998, "head_hash": "…", "view": 2251, "high_qc_view": 2250,
"syncing": false, "sync_target": 1998,
"sync_inflight_age_ms": null, "sync_failures": 0, "sync_late_batches": 0,
"peer_count": 26, "connected_peers": 26, "reserved_peers": 25, "ws_clients": 0, "refused_cache": 0,
"verify_queue": 0, "mempool_size": 0,
"is_validator": true, "active_validator": true, "faucet": true, "confidential": true,
"testnet": true, "fri_profile": "production", "programs": 10, "viewing_keys": 0,
"notes": 197, "nullifiers": 160, "tree_root": "72b9…1197", "hc_bundle": "60af…3fce", "hc_auth": "1e4e…39c1",
"binding_domain": 1,
"address": "5TAofR…", "peer_id": "12D3KooW…",
"gas_prices": { "gas_price": "100", "byte_price": "800" }
}
is_validator: node ini memegang kunci validator; active_validator: kunci tersebut berada dalam himpunan yang menjalankan epoch saat ini. reserved_peers (v0.6.8) menghitung peer yang diterima melampaui batas koneksi masuk: bootstrap, setiap --reserved-peer, dan setiap identitas validator yang dipelajari dari peer binding bertanda tangan, masing-masing satu kali; pada node armada, nilainya seharusnya mencapai jumlah validator dalam waktu satu menit setelah mulai. viewing_keys adalah jumlah viewing key yang disimpan node di memori untuk pemindaian di sisi node. verify_queue adalah jumlah transaksi yang menunggu salah satu dari empat worker verifikasi proof (maksimum sedalam 64). hc_bundle adalah bundle guest yang menjadi acuan proof chain ini dan hc_auth adalah auth guest yang dipatok oleh genesis-nya (otorisasi terpisah, sejak chain 17), atau null pada chain yang tidak memilikinya; node yang build-nya tidak sesuai dengan salah satunya menolak untuk mulai. testnet dan binding_domain adalah field genesis dengan nama yang sama, sebagaimana disajikan rand_getLimits. gas_prices adalah harga gas saat ini dari tip ledger, diperbarui pada setiap commit, sebagai string desimal; null pada chain tanpa bagian gas. Harga di chain 20 bersifat dinamis dan bergerak per blok menurut tingkat keterisian, tidak pernah di bawah batas bawah 100 dan 800 dan tidak pernah di atas batas atas 10.000 dan 80.000, jadi bacalah di sini atau di rand_getLimits dan jangan menuliskannya secara permanen dalam kode. Objek ini juga memuat objek aggregation (subsidy_base-nya string desimal, sisanya bilangan bulat), yang terbaca nol semua pada chain tanpa bagian aggregation, seperti chain 20.
Objek ini juga memuat disk_free_bytes (angka) dan disk_low, serta pasangan retensi: prune_floor, ketinggian terendah yang masih disimpan node ini (0 pada node arsip), dan prune_history_secs, jendela waktu yang disimpan node yang dimulai dengan --prune-history (null bila menyimpan semuanya). Pada chain 20, seperti pada chain 19, 24 dari 26 validator menyimpan blok selama 24 jam; kedua node arsip menyimpan semuanya. Lihat Node terpangkas.
rand_getPeers
Parameter []. Hasil: array berisi { "peer_id": "12D3KooW…", "addrs": ["/ip4/…/tcp/30303"], "connected_secs": 1241 }.
rand_getBlockByHeight / rand_getBlockByHash
Parameter [height] atau [hash]. Hasil null bila tidak dikenal, jika tidak:
{
"hash": "647b…", "height": 50, "view": 92, "parent": "2d41…",
"proposer": "3v3VBJ…", "timestamp_ms": 1788000123456,
"tx_root": "0000…", "state_root": "a1b2…", "justify_view": 91,
"tx_count": 0, "transactions": [ ]
}
Hanya blok yang telah di-commit yang disajikan. transactions memiliki bentuk yang sama dengan tx pada rand_getTransaction. Setiap blok juga memuat sealed, dan setiap transaksinya memuat sealed_by; keduanya bernilai false dan null pada chain tanpa agregasi.
rand_getBlocks
Parameter [from_height, to_height]. Hasil: header blok, dari yang tertua, paling banyak 1.024 mulai dari from_height (128 pada node sebelum 2026-09-24): field dari rand_getBlockByHeight tanpa transactions. Rentang yang melebihi batas, atau melewati head, dipotong, bukan ditolak, dan sejak v0.6.8 sebuah halaman juga berakhir setelah membaca 64 MiB blok; lanjutkan dari tinggi terakhir yang dikembalikan. -32602 jika to_height lebih kecil daripada from_height.
Sejak v0.6.8 setiap header juga memuat public_notes: transaksi bridge_attest, token_mint, dan register_token milik blok tersebut, serta pada chain dengan biaya bridge, transaksi bridge_burn-nya, dalam bentuk [{ "hash", "raw" }] (encoding yang disajikan oleh rand_getRawTransaction); kosong untuk semua blok lainnya. Sebuah burn disajikan dengan proof-nya dikosongkan dan "proofs_stripped": true; hash-nya adalah id transaksi yang sebenarnya. Sinkronisasi pertama sebuah wallet membaca halaman-halaman ini dan tidak memerlukan hal lain untuk membangun kembali note publik.
rand_getFinality
Parameter [height] atau [hash]. Hasil, salah satu dari { "status": "committed", "height", "hash" }, { "status": "certified", "height", "hash", "qc_view" }, { "status": "proposed", "height", "hash" }, { "status": "unknown" }. Sebuah height hanya diperiksa terhadap chain yang telah di-commit, sehingga jawabannya committed atau unknown; sebuah hash juga dapat berstatus certified (berada di pohon replika yang belum di-commit, dengan quorum certificate) atau proposed (berada di pohon tanpa quorum certificate).
rand_getProposer
Parameter [view] atau [from_view, to_view], paling banyak 64 view. Hasil { "epoch": 3, "proposers": [ { "view": 2251, "proposer": "2nRdFC…" } ] }: pemimpin setiap view di bawah set validator saat ini, bukan set yang berjalan pada view tersebut secara historis. -32602 untuk rentang mundur atau lebih dari 64 view.
rand_getVersion
Parameter []. Hasil { "version", "git_sha", "chain_id", "hc_bundle", "hc_auth", "fri_profile" }. version adalah versi crate workspace; git_sha adalah hash commit yang ditangkap saat build, dengan -dirty ditambahkan jika file yang dilacak berbeda, atau "unknown". hc_auth adalah guest auth genesis, seperti pada rand_status, atau null. Endpoint publik pada 2026-10-01, pada chain 20:
{ "version": "0.6.8", "git_sha": "c9c9bd3c1903aa4cc5833b7ab8c62fc3e6942017", "chain_id": 20,
"hc_bundle": "60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce",
"hc_auth": "1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1",
"fri_profile": "production" }
rand_getGenesisHash
Parameter []. Hasil: hash genesis dalam bentuk hex; "6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135" pada chain 20 (milik chain 19 adalah a3defc93…228a). Id chain saja tidak membedakan dua pemotongan chain; hash ini membedakannya. Pada chain 20 hash ini juga menjadi bagian dari setiap binding transaksi dan setiap pesan aksi bertanda tangan (binding_domain: 1, lihat rand_getLimits).
rand_getHealth
Parameter []. Hasil, salah satu dari { "status": "disk_low", "free_bytes": "3221225472" }, { "status": "ok" }, { "status": "syncing", "behind": 412 }, { "status": "behind", "behind": 30 }. disk_low didahulukan di atas yang lain, ketika ruang kosong pada filesystem direktori data kurang dari empat kali --min-free-disk-mb milik node (default 1024, sehingga di bawah 4 GB); free_bytes adalah string desimal. ok jika sync_target - height paling besar 2 dan tidak ada permintaan batch sinkronisasi yang tertunda; syncing selama masih ada; behind jika node tidak sedang melakukan sinkronisasi dan ketertinggalannya masih di atas 2.
rand_getMempoolInfo
Parameter []. Hasil { "count": 2, "bytes": 2611200, "oldest_ms": 1450, "max_count": 10000 }. bytes menjumlahkan panjang terenkode setiap transaksi dalam pool; oldest_ms bernilai null ketika pool kosong. Sejak v0.6.8 pool juga dibatasi dalam byte, sebesar delapan kali max_block_bytes genesis (160 MiB pada chain 20): melewatinya, transaksi yang membayar lebih banyak di atas batas minimumnya per KiB menggeser yang termurah, dan transaksi yang membayar lebih sedikit atau sama ditolak dengan mempool full. Aksi tata kelola melewati kedua batas tersebut.
Submitting
rand_sendTransaction
Parameter [hex], dengan hex adalah bincode(Transaction). Hasil: hash transaksi. Node memvalidasi sesuai urutan admisi (Transactions), memasukkannya ke pool, dan menyebarkannya melalui gossip. Kesalahan berupa -32000 beserta alasannya: nullifier already spent, anchor is not one of the last 1024 roots, time 12 is outside [1500, 2524] (kedua jendela adalah proof_window_blocks genesis, 1.024 pada chain 20; 256 pada chain hingga 19), fee 1000000 below minimum 2000000, the bundle's digest is not what its proof published, invalid bundle proof: …, unknown program …, already in mempool, conflicts with a pending transaction over <nullifier>, faucet is disabled on this chain; untuk sebuah invoke, cell <key> is no longer what this transition read (vonis state: baca ulang cell lalu buktikan lagi) atau the vault holds … of asset … and the transition pays …; untuk Bond pendaftaran di bawah admisi melalui voting, validator … has not been admitted by the validator set's vote (staking.admission_by_vote); ask the validators for an AdmitValidator first; untuk bundle yang tidak sesuai dengan genesis chain 20, envelope is 1348 bytes, this chain requires exactly 1860, this chain requires an auth proof on every bundle (genesis hc_auth), the auth proof publishes a different commitment than the bundle's auth_commit, auth proof: …, bundle proof declares gas limit …, this chain requires exactly 20479, non-canonical proof: … — re-prove with an up-to-date wallet; untuk aksi bridge bridge: attestation already consumed, the attestation names a different recipient, the attestation deposits under asset 2, and the transaction names 1, the bundle burns 399, not the 400 the action declares; untuk bundle yang membawa burn yang tidak boleh dibawa aksinya, the bundle burns asset 2 on an action that burns no token, a burn of 5 is not allowed on this action atau RAND burned through burn_a (5); a RAND burn goes through burn_r; untuk state bridge, bridge minting is paused, mint cap … per backing per day, already paused, not paused, wrong pause nonce, wrong list nonce, chain N has no registered emitter; untuk registry token, wrong mint nonce dan wrong token index. Penerimaan bukan commitment: lakukan polling pada rand_getTransaction atau rand_getTransactionStatus.
Transaksi yang lebih besar daripada batas blok chain (max_block_bytes dari rand_getLimits) ditolak dengan -32000, dengan menyebutkan kedua ukuran, sebelum mencapai mempool. Badan permintaan dibatasi pada 2 × (2 × max_proof_bytes + 4 × 2048 + max_call_envelope_bytes + 16,384 + 64 KiB) + 256 KiB, dihitung dari genesis saat startup: 8.867.840 byte pada chain default dan 17.350.656 pada batas chain 20, sama seperti chain 17 hingga 19 (34.127.872 pada chain 13 hingga 15, yang batas proof-nya 8 MiB). 4 × 2048 adalah empat envelope bundle pada batas envelope. Badan di atas batas itu dijawab -32600, dengan menyebutkan batasnya.
Hanya -32000 (admisi menolaknya) dan -32602 (tidak dapat didekode) yang merupakan vonis atas transaksi. Kegagalan lain, termasuk -32603, membuat nasibnya tidak diketahui: node memasukkan transaksi ke pool dan menyebarkannya sebelum membalas, sehingga node yang berhenti pada jendela itu dapat telah mengadmisi sesuatu yang tidak pernah dijawabnya. randprotocol_client memperlakukan sebuah pengiriman sebagai ditolak hanya pada kedua kode tersebut.
rand_getTransactionStatus
Parameter [[hash, …]], 1 hingga 64 hash. Hasil: satu entri per hash, berurutan:
[ { "hash": "…", "status": "committed", "height": 1998, "index": 0 },
{ "hash": "…", "status": "pending" },
{ "hash": "…", "status": "rejected", "reason": "bad mint signature" },
{ "hash": "…", "status": "unknown" } ]
Urutan pencarian per hash: committed (storage), pending (mempool), rejected (cache penolakan yang dihitung oleh refused_cache pada rand_status), selain itu unknown. rejected hanya mencakup penolakan mengenai byte transaksi itu sendiri, yang tidak dapat diubah oleh blok mana pun kemudian: proof yang tidak valid, digest bundle yang bukan seperti yang dipublikasikan proof-nya, tanda tangan mint yang buruk, chain id yang salah, bagian yang terlalu besar, nullifier atau commitment yang berulang di dalam transaksi, envelope dengan ukuran yang salah, auth proof yang hilang atau tidak cocok, bundle atau auth proof yang mendeklarasikan gas limit yang salah. Penolakan yang bergantung pada state node pada saat itu — nullifier yang telah dibelanjakan, anchor atau time di luar jendela, fee di bawah batas minimum (yang pada chain 20 bergerak mengikuti harga gas), program yang tidak dikenal, nonce register, pembacaan invoke yang usang — tidak diingat dan terbaca unknown. -32602 untuk daftar kosong atau lebih dari 64 hash.
rand_mint (testnet faucet)
Parameter [address] atau [address, amount]; address adalah alamat rand1…, amount adalah string satuan paling besar 100000000000 (100 RAND, default). Hasil: hash transaksi mint. Hanya pada chain yang genesis-nya memiliki "faucet": true; jika tidak, -32000 faucet is disabled on this chain. Observer menjawab faucet mints are signed by validators; ask a validator node.
Pada chain yang genesis-nya menetapkan staking.faucet_recipients, seperti pada chain 20 (16 wallet), hanya wallet yang terdaftar yang dapat dibayar: mint ke alamat lain ditolak dengan the faucet may not mint to this recipient (not in staking.faucet_recipients). Genesis chain 20 juga menetapkan staking.faucet_minters (18 kunci validator): hanya kunci yang terdaftar yang boleh menandatangani mint. Faucet juga memiliki anggaran per epoch, staking.faucet_budget_per_epoch (10.000 RAND per epoch 1.000 blok pada chain 20); mint yang melewatinya ditolak dengan FaucetBudgetExhausted, vonis state yang terbaca unknown setelah meninggalkan pool.
Faucet dibatasi lajunya per proses node: delapan pencetakan berturut-turut, terisi ulang satu per detik. Di luar batas itu, panggilan dijawab dengan faucet is rate limited on this node (8 mints back to back, refilling at 1/s); try again shortly. Banjir permintaan faucet dengan demikian tidak dapat memenuhi pool lebih dahulu daripada PauseMints bridge. PauseMints, seperti tiga aksi tata kelola bridge lainnya, juga dikecualikan dari penolakan mempool full milik pool dan diurutkan pertama dalam blok.
Sejak chain 14, sebuah mint dibuka: aksi Mint membawa pk, time, dan r milik note di samping cm dan amount; admisi menghitung ulang komitmen dan menolak cm yang tidak terbuka menjadi nilai-nilai tersebut (the mint's commitment does not open to its published note and amount); dan minter menandatangani ketujuh bidang itu di bawah domain rand-mint-2. Pada chain 20 (binding_domain: 1), penandatanganan memakai rand-mint-3, dengan hash genesis di urutan pertama. Pemilik dan jumlah sebuah note faucet karena itu bersifat publik, seperti pembayaran sebuah withdraw. Parameter rand_mint tidak berubah.
rand_estimateFee
Params [spec], salah satu dari {"kind":"bundle"}, {"kind":"deploy","words":n,"public_words":m}, {"kind":"call","tier":t,"bytes":b,"gas":g} dengan t bernilai 10, 12, 14, 16, 18, 20. Hasil: fee minimum dalam unit, sebagai string. {"kind":"bundle"} bernilai "1000000". public_words (opsional, bawaan 0) dibayar per word seperti kode, sehingga fee-nya adalah fee deploy untuk n + m word. bytes (opsional, bawaan 0) adalah panjang proof panggilan ditambah panjang amplop inputnya.
Cara sebuah panggilan dihargai bergantung pada gas_metering dari rand_getLimits:
"circuit", chain dengan seksigassendiri, seperti chain 20.gasadalah batas gas yang dideklarasikan proof panggilan, dan nilainya wajib: tanpagas, panggilan dijawab-32602under the gas section a call estimate needs its gas. Jawabannya adalah1,000,000 + gas_price × gas + byte_price × ⌈bytes / 1024⌉pada harga terkini di ujung rantai, yaitu harga yang disajikanrand_getLimits. Pada harga dasar chain 20 sebesar 100 dan 800, panggilan yang mendeklarasikan 20.479 gas dengan 1.300.000 byte proof dan amplop bernilai"4063900". Harga bergerak setiap blok, jadi lakukan estimasi mendekati saat pengiriman."header", kebijakan gas tingkat node pada chain tanpa seksi tersebut. Spesifikasi panggilan menerimakeccak_log_heightdansha256_log_height(opsional, bawaan 0, masing-masing dalam rentang 0 sampai 40, jika tidak-32602), yaitu tinggi tabel hash yang dideklarasikan header proof, dan jawabannya adalah nilai yang lebih besar antara batas bawah tier pada ledger dan batas bawah gas dari header tersebut. Di bawah seksigas, kedua tinggi itu diterima tetapi tidak dipakai.null, bukan keduanya. Hanya jadwal tier pada ledger: pada atau di bawah jatah gratis (2.097.152 + 18.432 byte), sebuah panggilan membayar fee tier-nya; setiap KiB di atasnya, dengan KiB parsial dihitung utuh, menambah 1.000 unit.
Sejak v0.6.8, {"kind":"invoke", …, "created_cells": c} menghargai invoke RPL-2: setiap bidang pada spesifikasi panggilan, ditambah created_cells (opsional, bawaan 0, paling banyak max_writes, jika tidak -32602), yaitu sel yang akan dibuat oleh transisi. Masing-masing menambah cell_fee milik chain (rand_getLimits.program_state). Pemanggil yang menghitungnya: penulisan nilai bukan nol ke sel yang dibaca rand_getProgramCell sebagai nol. Pada chain 20, panggilan di atas dengan dua sel yang dibuat bernilai "24063900". Pada chain tanpa seksi program_state, kind ini menghasilkan -32602.
Fee memuat jadwalnya.
Pool
rand_getTreeInfo
Params []. Hasil { "next_index": 41, "root": "6b1d…c4", "nullifiers": 12 }: jumlah daun, root saat ini, dan jumlah note yang telah dibelanjakan.
rand_getCommitments
Params [from_index] atau [from_index, limit]. Hasil: satu halaman daun mulai dari from_index, yang terlama lebih dahulu, paling banyak 1.000 baris berapa pun besar limit.
[ { "index": 40, "cm": "2a9f…07", "height": 37,
"envelope": { "kem_ct": "b41c…", "to_receiver": "77e0…", "to_sender": "0c31…", "body": "9dd2…" } } ]
rand_getNullifiers
Params [from_height] atau [from_height, limit]. Hasil: setiap nullifier yang dipublikasikan sejak tinggi tersebut, dengan batas 1.000 baris yang sama. Sebuah halaman dapat berhenti di tengah satu tinggi; mundurlah ke tinggi tertinggi yang telah terlihat.
[ { "height": 37, "nullifier": "8c04…d1" }, { "height": 41, "nullifier": "12be…9a" } ]
rand_getCompactBlocks
Params [from_height, to_height], keduanya wajib. Hasil: satu baris per blok, yang terlama lebih dahulu, berisi apa yang dibutuhkan dompet ringan dan tidak lebih:
[ { "height": 192, "hash": "63f6…08", "timestamp_ms": 1788000123456,
"commitments": [],
"transactions": [
{ "hash": "4f2c…e7",
"commitments": [ { "index": 40, "cm": "2a9f…07", "envelope": { "kem_ct": "…", "to_receiver": "…", "to_sender": "…", "body": "…" } } ],
"nullifiers": ["8c04…d1", "5e77…20", "03aa…6f", "e19b…42"] } ] } ]
Setiap transaksi pembawa bundle memiliki empat note dan empat nullifier di sini, yaitu keempat slotnya, termasuk slot dummy yang tidak dapat dibedakan oleh pembaca mana pun dari slot asli (hanya baris komitmen pertama pada contoh yang ditampilkan). Sejak v0.6.8 sebagian memiliki lebih banyak note, setelah keempat itu: sebuah invoke memiliki satu note per pembayaran, pays lalu mints, masing-masing dengan amplop milik pembayaran itu sendiri, sehingga penerima menemukannya melalui dekripsi percobaan; pada chain dengan fee bridge, seperti chain 20, sebuah bridge_burn memiliki note fee treasury-nya, dan sebuah bridge_attest memiliki note fee-nya setelah depositnya. Amplop sebuah note fee kosong, disegel untuk tak seorang pun: dompet treasury membangun ulang note tersebut dari bidang publik transaksi.
Paling banyak 128 blok per panggilan (rentang yang lebih lebar dipangkas) dan, setelah blok pertama yang selalu disajikan utuh, 1.000 note; lanjutkan dari height terakhir yang dikembalikan ditambah satu. Larik commitments tingkat blok memuat deposit genesis pada tinggi 0 dan kosong di tempat lain; note turunan dari sebuah Withdraw dan sebuah BridgeAttest muncul di bawah transaksinya. -32602 untuk rentang mundur atau batas yang tidak ada.
rand_getAnchor
Params [] untuk ujung rantai, atau [height]. Hasil { "height": 192, "root": "6b1d…c4" }, atau -32001 untuk tinggi yang tidak memiliki anchor tercatat. Hanya root akhir blok yang menjadi anchor. Node dapat menjawab untuk tinggi yang lama, tetapi anchor sebuah bundle hanya dapat diterima jika ia salah satu dari proof_window_blocks root terakhir: 1.024 pada chain 20, 256 pada chain sampai 19. Bangunlah terhadap ujung rantai.
rand_getWitness
Params [index]. Hasil null jika melewati ujung tree, jika tidak jalur Merkle dari daun itu, dimulai dari daun, tepat 32 level, dengan root tree yang saat ini:
{ "index": 40, "root": "6b1d…c4", "path": ["0000…00", "f2a1…3b", "…"] }
Pembacaan paling mahal yang disajikan node (ia membangun ulang tree penuh berkedalaman 32) dan satu-satunya permintaan yang mengungkapkan sesuatu tentang pemanggil. Sebuah node menjalankan paling banyak dua pembangunan ulang tree sekaligus, rand_getWitness dan rand_getWitnesses digabungkan; permintaan yang menunggu lebih dari 10 detik untuk mendapat slot ditolak dengan -32000 witness builds are busy on this node; retry shortly.
rand_getWitnesses
Params [[index, …]], 1 sampai 32 indeks daun. Hasil { "root": "…", "witnesses": [ { "index": 7, "path": ["…"] }, { "index": 9, "path": null } ] }: rand_getWitness yang dilipat atas banyak daun dalam satu pembangunan tree, sehingga dompet yang membuktikan beberapa note membayar pembangunan ulang hanya sekali. Indeks yang melewati ujung tree terbaca path: null untuk entri tersebut. -32602 untuk daftar kosong atau lebih dari 32 indeks.
Kunci pelihat dan pengungkapan
rand_importViewingKey
Params [viewing_key] atau [viewing_key, rescan_from_height], kuncinya berupa 64 karakter heksadesimal. Hasil { "imported": true, "rescan_from_height": 0, "viewing_keys": 3 }. Node menyimpan kunci hanya di memori: paling banyak 64 per node, dibersihkan saat restart; kunci yang sudah dipegang tidak berefek ("imported": false). Import tidak pernah memindai; pemindaian digerakkan oleh metode berikutnya. -32602 untuk kunci yang cacat; -32000 pada kunci ke-65.
Ketiga metode kunci pelihat hanya dijawab untuk pemanggil loopback dan menolak yang lain dengan -32000, kecuali node dijalankan dengan --rpc-viewing-open di belakang sesuatu yang melakukan autentikasi. rand_removeViewingKey ([viewing_key] → { "removed": bool, "viewing_keys": n }) membebaskan satu slot dan menolkan kunci tersebut. Registri diindeks oleh id satu arah dari kunci, blake3("rand-viewing-registry-id-1" ‖ nk), tidak pernah oleh kunci itu sendiri, sehingga import adalah satu-satunya salinan berumur panjang dan penghapusan menghapusnya. Teks JSON permintaan itu sendiri dan salinan sementara yang dibuat dekripsi percobaan tidak dihapus.
rand_getViewingNotes
Params [viewing_key] atau [viewing_key, from_index, limit] (limit bawaan dan maksimum 1.000). Setiap panggilan memajukan pemindaian kunci hingga 10.000 daun, lalu menyajikan halamannya:
{ "scanned_index": 10041, "next_index": 10041, "complete": true,
"notes": [
{ "index": 40, "cm": "2a9f…07", "height": 37, "role": "received",
"note": { "pk": "…", "from": "…", "amount": "1500000000", "asset": 0, "time": 5, "memo": "coffee" },
"nullifier": "8c04…d1", "spent": false },
{ "index": 43, "cm": "b310…88", "height": 39, "role": "sent",
"note": { "pk": "…", "from": "…", "amount": "25000000", "asset": 0, "time": 9, "memo": null },
"nullifier": null, "spent": null } ] }
role adalah received (amplop terbuka sebagai penerima dan note menyebut pk milik kunci) atau sent (terbuka melalui kunci pelihat keluar). memo pada note adalah memo terenkripsi dari pengirim, teks UTF-8 sepanjang paling banyak 510 byte, atau null bila tidak ada atau bidangnya terbuka dalam keadaan cacat; memo yang cacat tidak pernah membuat penerima kehilangan note. Memo adalah teks milik siapa saja: tampilkan sebagai tidak tepercaya. -32001 untuk kunci yang belum diimpor node ini.
rand_checkTransaction
Params [hash, key], key berupa TxKey per transaksi sebagai 64 karakter heksadesimal. Hasil null untuk hash yang tidak dikenal, jika tidak apa yang diungkapkan kunci tersebut:
{ "tx": "4f2c…e7", "height": 192,
"disclosed": [ { "output": "bundle:0", "cm": "2a9f…07", "index": 40,
"note": { "pk": "…", "from": "…", "amount": "1500000000", "asset": 0, "time": 5, "memo": "invoice 7" } } ] }
Tanpa status: kunci dibuang bersama pemanggilannya. output adalah bundle:0 … bundle:3 untuk empat slot keluaran bundle (slot 0–1 keluaran aset privat, slot 2–3 keluaran RAND, termasuk dummy), deposit untuk amplop deposit pada atestasi bridge, token_mint untuk catatan sebuah TokenMint, initial_mint untuk mint awal sebuah RegisterToken, mint:0 untuk satu-satunya amplop pada mint faucet, atau (v0.6.8) payout:0 … payout:3 untuk catatan yang dibayarkan oleh sebuah invoke, bernomor menurut urutannya dalam transisi, pays lalu mints; asset_bundle:* telah dihapus bersama bundle kedua. Pada chain dengan biaya bridge, deposit membuka deposit bersih, yaitu jumlah bruto dikurangi biaya. note yang diungkapkan memuat asset-nya: panggilan ini, dengan kunci yang dipakai pengirim untuk menyegel, adalah satu-satunya tempat RPC mengungkapkan aset mana yang dipindahkan oleh sebuah transfer. Panggilan ini juga memuat memo, seperti rand_getViewingNotes: kunci yang membuka catatan juga membuka memo, dari badan tersegel yang sama. Kunci yang salah mengembalikan { "disclosed": [] }, tidak dapat dibedakan dari transaksi yang tidak mengungkapkan apa pun. Amplop milik withdraw dan genesis alloc tidak dicoba: keduanya disegel di dalam node dengan kunci yang langsung dibuang, sehingga tidak ada TxKey untuk keduanya. Amplop milik mint faucet dicoba: penerimanya memulihkan kunci melalui bagian KEM dari amplop tersebut (rand tx-key).
Transaksi
rand_getTransaction
Parameter [hash]. Hasilnya null sampai transaksi di-commit, lalu:
{
"height": 192, "index": 0, "block_hash": "63f6…08",
"tx": {
"hash": "4f2c…e7", "chain_id": 20,
"bundle": { "anchor": "6b1d…c4",
"nullifiers": ["8c04…d1", "5e77…20", "03aa…6f", "e19b…42"],
"commitments": ["2a9f…07", "b310…88", "77c1…0e", "5d20…b3"],
"fee": "1000000", "burn_a": "0", "burn_r": "0", "burn_asset": 0, "time": 5,
"proof_len": 1490435, "envelope_len": [1860, 1860, 1860, 1860],
"auth_commit": "9217…ee9e", "auth_proof_bytes": 1361161 },
"action": { "kind": "none" }
}
}
bundle bernilai null pada aksi tanpa bundle. Bukti dan amplop dilaporkan hanya berupa panjangnya. envelope_len bernilai 1.860 untuk setiap slot pada chain 20, yang genesis-nya menetapkan amplop catatan pada ukuran itu (envelope_bytes pada rand_getLimits); nilainya 1.348 pada chain 14 sampai 17. auth_commit dan auth_proof_bytes adalah milik split authorisation (sejak chain 17): komitmen publik c = H(AUTH, nk, salt) yang dipublikasikan oleh bukti bundle maupun bukti auth, dan panjang bukti auth. Pada chain tanpa hc_auth, nilainya nol dan 0.
bundle adalah bundle aset tersembunyi (sejak chain 14): empat slot masukan dan empat slot keluaran, sehingga selalu ada empat nullifiers, empat commitments, dan empat envelope_len, termasuk dummy. Setiap transaksi membawa paling banyak satu; tidak ada bundle kedua. Bundle ini tidak memiliki field asset: slot 0–1 membawa aset privat dan slot 2–3 membawa RAND, dan tidak ada yang secara publik menyatakan aset mana yang dipindahkan oleh slot 0–1. Transfer RAND dan transfer token RPL apa pun sama-sama berupa "kind": "none" dengan burn_a, burn_r, dan burn_asset semuanya 0: bentuknya sama, field demi field. Tidak ada kind token_transfer. Ketiga field burn tersebut adalah satu-satunya pernyataan publik dari bundle tentang nilai yang meninggalkan pool:
burn_a/burn_asset— jumlah aset privat yang di-burn, dan aset mana. Bernilai bukan nol padatoken_burnataubridge_burn, yang nilainya sama denganamountdanassetmilik aksi tersebut, serta padainvokeyanginflow-nyadepositatauburn.burn_r— RAND yang di-burn. Bernilai bukan nol padabond(sama denganamount-nya),register_aggregator, daninvokeyang menyetor RAND ke vault program.fee— biaya RAND, selalu berasal dari slot 2–3.
Representasi aksi (setiap amount, relayer_fee, dan initial_amount berupa string desimal; jumlah token dinyatakan dalam satuannya sendiri, bukan satuan RAND):
| kind | fields |
|---|---|
none | — |
mint | cm, amount, minter (validator base58) |
deploy | program, words, public_words_len |
call | program, proof_len, input_envelope_len (null bila pemanggilan tidak membawa amplop) |
bond | validator, amount, registered |
unbond | validator, amount, nonce |
withdraw | validator, amount, nonce, time |
bridge_attest | attestation_len, recipient, asset, asset_index, amount, time, r, commitment, pq_signers (indeks guardian penanda tangan bersama dalam pq_guardians; tanda tangan 2.420 byte tidak ditampilkan). asset_index, amount, dan commitment bernilai null untuk rotasi guardian set. r diturunkan, blake3("rand-deposit-r-1" ‖ mu) atas digest yang ditandatangani para guardian. Sejak v0.6.8 juga ada deposit_amount (catatan milik penyetor: amount, jumlah bruto yang ditandatangani para guardian, dikurangi biaya bridge) dan fee_note ({ amount, asset, time, r, commitment }, catatan milik treasury tanpa pemiliknya, atau null bila tanpa biaya bridge); commitment adalah leaf dari deposit bersih |
bridge_burn | asset, amount, relayer_fee, to_chain, token (backing yang ditebus), to. Satu bundle membawa seluruh burn: burn_asset dan burn_a miliknya sama dengan asset dan amount milik aksi. Sejak v0.6.8 juga ada release_amount (yang dilepas oleh badan bertanda tangan, yaitu amount dikurangi biaya bridge) dan fee_note, seperti pada attest |
register_token | name, symbol, decimals, authority ("none", "key", "bridge", atau "program"), index, initial_amount, initial ({ amount, recipient, time, r } atau null) |
token_mint | asset, amount, recipient, time, r, nonce |
set_authority | asset, nonce, new_authority (base58, atau null untuk pelepasan otoritas) |
token_burn | asset, amount; burn_asset / burn_a milik bundle mengulanginya |
pause_mints | nonce; tanpa bundle dan tanpa biaya, ditandatangani oleh kunci jeda genesis |
unpause_mints | nonce, pq_signers; tanpa bundle dan tanpa biaya |
register_bridged_token | name, symbol, salt, chain, token, decimals (desimal sumber dari backing pertama), nonce, asset_id, pq_signers |
list_backing | token_index, chain, token, decimals, nonce, pq_signers |
rotate_pq_guardians | new_pq_guardians, nonce (rotation_nonce yang terpakai), pq_signers (indeks pada set PQ sebelum rotasi); tanpa bundle dan tanpa biaya, hanya pada chain bridge rules_v2 |
rotate_pause_key | new_pause_key, nonce, pq_signers; sama seperti di atas |
rotate_pq_guardians_v2, rotate_pause_key_v2 | v0.6.8: field v1, ditambah possession_signatures (sebuah hitungan) pada bentuk PQ. Tanpa bundle dan tanpa biaya; wajib pada chain yang bridge.rotation di genesis-nya menetapkan needs_possession, seperti chain 20. Rotasi berlaku delay_secs kemudian (86.400 s pada chain 20) |
cancel_rotation | v0.6.8: rotation_kind ("pq_guardians" atau "pause_key"), nonce; ditandatangani oleh kunci jeda saat ini, membatalkan rotasi yang tertunda |
admit_validator | v0.6.8: candidate (alamat), candidate_key (hex), voters (alamat). Tanpa bundle dan tanpa biaya: suara validator set untuk mengizinkan kunci baru mendaftar, pada chain dengan staking.admission_by_vote, seperti chain 20 |
slash_equivocation | v0.6.8: offender, view, first dan second ({ hash, height }); hanya pada chain dengan staking.slashing, yang tidak dimiliki chain 20 |
invoke | v0.6.8, RPL-2: field sebuah call (program, proof_len, input_envelope_len) dan transition-nya (di bawah). Hanya pada chain dengan bagian program_state, seperti chain 20 |
register_aggregator, unbond_aggregator, withdraw_aggregator, slash_aggregator, aggregate | field publik masing-masing; hanya pada chain dengan agregasi |
claim_vested, revoke_vesting, bond_vested, unbond_vested | entry (hex), amount (unvested pada revoke), nonce; time pada claim atau revoke; validator dan registers pada bond; sejak v0.6.8 signers pada revoke (posisi para penanda tangannya dalam revokers milik entry). Tanpa bundle; hanya pada chain dengan bagian vesting di genesis, yang tidak dimiliki chain 20 |
Registrasi dan mint sebuah token bersifat publik, seperti deposit bridge: setiap word dari catatan yang di-mint ada di dalam aksi (from-nya adalah MINT_FROM tetap milik chain), sehingga penerima membangun ulang catatan dari field-field ini tanpa mendekripsi apa pun. String kind bridge_attest, token_mint, register_token, dan invoke adalah yang menjadi kunci pemindaian wallet dan dikunci oleh sebuah tes.
Sebuah invoke pada tinggi 3.079 di chain 20, yang membaca satu cell, menghapusnya, dan membayarkan dua catatan dari vault:
{ "kind": "invoke", "program": "aaaf…4b21", "proof_len": 1433874, "input_envelope_len": null,
"transition": {
"reads": [{ "key": "0100…fa98", "value": "0000000004000000…00000000" }],
"writes": [{ "key": "0100…fa98", "value": "0000000000000000000000000000000000000000000000000000000000000000" }],
"inflow": "none",
"pays": [{ "asset": 0, "amount": "1000000000", "recipient": "rand1…", "time": 3027, "r": "87e6…9a67", "cm": "2555…6487" },
{ "asset": 4, "amount": "2000000000", "recipient": "rand1…", "time": 3027, "r": "b833…f390", "cm": "2b70…f204" }],
"mints": [] } }
Semuanya publik secara desain. reads adalah cell yang dibaca program, beserta nilai yang dibacanya: bukti dibuat terhadap nilai-nilai itu, dan ledger menolak transaksi kecuali nilai-nilai itu masih berlaku. writes adalah cell yang ditulisnya; nilai tertulis berupa 64 nol menghapus cell. Kunci atau nilai sebuah cell adalah Word8. Yang masuk adalah milik bundle: burn_r adalah RAND yang disetor ke vault program, dan burn_a dari burn_asset adalah token yang disebut oleh inflow, deposit ke vault atau burn (token milik program itu sendiri), none bila burn_a bernilai 0. Yang keluar adalah satu catatan hasil komputasi chain untuk setiap payout, pays dari vault, lalu mints dari token yang otoritas mint-nya adalah program ini. Setiap word dari tiap catatan ada di sini dengan nama field milik token_mint; time adalah milik bundle, cm adalah leaf yang ditambahkan chain, dan from dari catatan tersebut adalah PROGRAM_FROM tetap milik chain. Delapan word keluaran program ada pada receipt, seperti pada sebuah call.
Tidak ada balasan transfer yang memuat pengirim, penerima, nonce, jumlah, atau aset: field semacam itu tidak ada dalam transfer yang tersimpan.
rand_getRawTransaction
Parameter [hash]. Hasil: transaksi lengkap yang telah di-commit dalam bincode hex, termasuk byte bukti, yaitu apa yang dibutuhkan aggregator dan tidak pernah ditampilkan oleh rand_getTransaction.
Program dan receipt
rand_getProgram
Parameter [program_id]. Hasil null atau { "id", "base_pc", "words_len", "code_hash", "deployed_at", "public_words_len", "public_digest" }. Tidak ada field deployer: sebuah deploy dibayar oleh bundle. public_words_len adalah panjang input publik program pada saat deploy (0 bila tidak ada); public_digest adalah digest-nya, nilai yang menjadi acuan pemeriksaan bukti setiap call, atau null bila tidak ada.
rand_getProgramCode
Parameter [program_id]. Hasil null atau { "base_pc": 0, "words": [ … ] }.
rand_getProgramPublic
Parameter [program_id]. Hasil: kata-kata publik program pada saat deploy sebagai satu string hex, setiap kata berupa 4 byte little-endian (8 digit hex per kata): [1, 2, 0xdeadbeef] menjadi "0100000002000000efbeadde". "" untuk program yang di-deploy tanpa input publik, null untuk id yang tidak dimiliki program mana pun. Dompet yang membuktikan sebuah panggilan meneruskan kata-kata ini kepada prover; ledger memeriksa komitmen bukti tersebut terhadap public_digest milik program.
rand_getProgramCell
v0.6.8, RPL-2. Parameter [program_id, key], dengan key berupa Word8 dalam 64 digit hex (dengan atau tanpa 0x). Hasil { "key": "<64 hex>", "value": "<64 hex>" }. Sel yang tidak pernah ditulis program, atau yang ditulisi nol (yang menghapusnya), terbaca sebagai 64 angka nol, satu-satunya penyandian untuk “tidak ada”; demikian pula kunci mana pun dari program yang tidak pernah di-deploy, karena keberadaan program tidak diperiksa. { "enabled": false } pada chain tanpa bagian program_state. Sebuah sel bersifat publik secara desain: inilah yang dibaca dompet untuk menyusun reads milik sebuah invoke.
rand_getProgramCells
v0.6.8. Parameter [program_id, { "after": "<64 hex>" | null, "limit": n }], objek bersifat opsional. Hasil { "cells": [{ "key", "value" }, …], "next": "<64 hex>" | null }: sel-sel milik program berdasarkan urutan kunci (perbandingan tanpa tanda atas kedelapan kata), dimulai setelah after, paling banyak limit sel (dibatasi pada 1 hingga 1.000). next adalah kunci terakhir yang disajikan ketika masih ada lanjutan; teruskan kembali sebagai after. Nilainya null pada halaman terakhir. Program tanpa sel menjawab { "cells": [], "next": null }; { "enabled": false } tanpa bagian tersebut.
rand_getProgramVault
v0.6.8. Parameter [program_id]. Hasil [{ "asset": 0, "amount": "123" }, …], berurutan menaik berdasarkan indeks aset (0 adalah RAND, setiap indeks lain berasal dari registri token), jumlah berupa string desimal dalam satuan aset itu sendiri. Baris bernilai nol tidak ada, sehingga vault kosong, dan program yang tidak pernah di-deploy, adalah []. { "enabled": false } tanpa bagian tersebut. Nilai masuk ke dalam vault melalui bundel sebuah invoke (burn_r, dan burn_a dari burn_asset ketika inflow adalah deposit) dan keluar sebagai note yang disebutkan oleh pays pada transisi tersebut.
rand_getLimits
Parameter []. Hasil: apa yang dibutuhkan dompet dari genesis chain untuk menyusun sebuah transaksi: kelima batas panggilan, ukuran amplop note, sakelar v0.6, guest auth, ketentuan gas, dan, sejak v0.6.8, bidang genesis audit-v6 serta batas program-state. Pada chain 20:
{ "max_program_words": 65535, "max_proof_bytes": 4194304, "max_block_bytes": 20971520,
"max_call_envelope_bytes": 65536, "max_program_public_words": 32768,
"envelope_bytes": 1860, "hardening_v6": true,
"hc_auth": "1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1",
"gas_metering": "circuit", "gas_price": "100", "byte_price": "800",
"bundle_gas_limit": 20479, "adjust_bps": 1250,
"max_gas_price": "10000", "max_byte_price": "80000", "byte_load": "paying",
"admission_by_vote": true, "testnet": true, "slashing": null, "binding_domain": 1,
"proof_window_blocks": 1024,
"program_state": { "cell_fee": "10000000", "max_reads": 8, "max_writes": 8, "max_payouts": 4 } }
Genesis tanpa kelima bidang batas (chain 12) memperoleh 4096, 2097152, 4194304, 18432, dan 0. max_proof_bytes bernilai 8.388.608 pada chain 13 hingga 15.
| field | meaning |
|---|---|
envelope_bytes | 1860 ketika genesis menetapkan setiap amplop pembuat note pada panjang tepat tersebut, yaitu format pembawa memo; null pada genesis tanpa bidang itu (chain 14 hingga 17), di mana dompet menyegel amplop 1.348 byte tanpa memo. Tidak ada nilai lain |
hardening_v6 | true ketika genesis menjalankan aturan validitas v0.6. Dompet kemudian membuktikan sebuah panggilan atas input publik program yang diikuti oleh pengikatan panggilan (call binding) transaksi, bukan atas input publik saja: note milik bundel biaya dipilih lebih dahulu, panggilan dibuktikan kedua, bundel terakhir. Chain dengan flag ini menolak bukti lama, chain tanpa flag ini menolak bukti baru |
hc_auth | guest auth yang dipatok genesis, dalam hex, atau null. Jika terisi, hc_bundle adalah bundle guest v3 dan setiap bundel membawa auth_commit serta bukti auth: dompet memberikan nk dan salt baru kepada bundle guest, dan membuktikan auth guest atas spend key |
gas_metering | "circuit" pada chain yang genesisnya memiliki bagian gas (meter di dalam sirkuit); "header" pada chain tanpa bagian itu ketika node menjalankan kebijakan gas sendiri (--gas-price, --byte-price); null jika keduanya tidak ada |
gas_price, byte_price | unit per gas, dan unit per KiB bukti serta amplop input sebuah panggilan, sebagai string desimal. Di bawah bagian gas, keduanya merupakan state konsensus dan sama di setiap node: dengan gas.dynamic, seperti pada chain 20, yaitu harga terkini di ujung chain, yang bergerak per blok menurut tingkat keterisian, tidak pernah turun di bawah batas bawah genesis (100 dan 800) dan tidak pernah naik di atas batas atas; tanpa itu, harga tetap dari bagian tersebut. Tanpa bagian gas, keduanya merupakan kebijakan node itu sendiri, dan dua node dapat menjawab secara berbeda |
bundle_gas_limit | gas tetap yang wajib dideklarasikan setiap bukti bundel, dari bagian gas genesis; null tanpa bagian itu |
adjust_bps | pergerakan harga satu blok terbesar oleh pengendali dinamis, dalam basis poin; null pada chain tanpa gas.dynamic |
max_gas_price, max_byte_price | v0.6.8: batas atas yang tidak pernah dilampaui pengendali dalam menaikkan harga, string desimal; "10000" dan "80000" pada chain 20, null jika genesis tidak menetapkannya (chain 18 dan 19) |
byte_load | v0.6.8: "paying" ketika hanya bukti dan amplop input sebuah panggilan yang menggerakkan byte_price, sehingga satu blok berisi transfer tidak menggerakkannya, seperti pada chain 20; null jika byte setiap transaksi dihitung (chain 18 dan 19) |
admission_by_vote | v0.6.8: apakah bond yang mendaftarkan kunci validator baru memerlukan suara himpunan validator terlebih dahulu (rand_getAdmitted); true pada chain 20 |
testnet | v0.6.8: penanda testnet pada genesis, yang memungkinkan faucet berdampingan dengan bagian bridge; true pada chain 20, false pada setiap chain sebelumnya |
slashing | v0.6.8: { "equivocation_bps", "jail_epochs" }, biaya yang ditimbulkan equivocation seorang leader, atau null; null pada chain 20 |
binding_domain | v0.6.8: 0 jika pengikatan transaksi dan setiap pesan aksi bertanda tangan hanya mengikat chain id (chain 14 hingga 19), 1 jika keduanya turut membawa hash genesis, sehingga bukti atau tanda tangan yang dibuat untuk satu chain tidak terverifikasi di chain lain mana pun (chain 20). Dompet menentukan bentuk mana yang dibuktikan berdasarkan chain id, tidak pernah berdasarkan balasan ini: dompet rand v0.6.8 memberikan bentuk chain-id kepada chain id 14 hingga 19 dan bentuk terikat-genesis kepada setiap id lain, serta membaca bidang ini hanya untuk menolak lebih awal. Dompet yang lebih tua dari v0.6.8 tidak dapat mengirim di chain 20 |
proof_window_blocks | v0.6.8: seberapa tua, dalam blok, anchor sebuah bundel boleh berumur dan seberapa jauh time-nya boleh tertinggal dari tinggi blok, satu jendela untuk keduanya; 1024 pada chain 20, null (256) pada chain hingga 19. Dompet dengan prover yang lambat atau terdelegasi membacanya untuk mengetahui berapa lama sebuah bukti boleh memakan waktu |
program_state | v0.6.8, RPL-2: bagian program_state pada genesis beserta batas invoke-nya, atau null, yang berarti setiap invoke ditolak dan tidak ada token program yang dapat didaftarkan. cell_fee adalah unit RAND (string desimal) yang ditambahkan pada batas bawah biaya sebuah invoke untuk setiap sel yang dibuatnya, yaitu penulisan nilai bukan nol ke sel yang terbaca sebagai nol; menulis ulang, menghapus, atau menulis nol tidak dikenai biaya. max_reads, max_writes, dan max_payouts (pays dan mints digabung) adalah batas keras. Dalam praktiknya aturan segmen yang membatasi lebih dahulu: kata konteks transisi (11 + 16 per read atau write + 3 per payout) harus muat di samping input publik program dan 8 kata pengikat tanpa membuat tabel publik zkVM bertambah; untuk program tanpa input publik tabel itu berisi 128 baris, yang menyisakan 119 kata konteks |
Node yang mendahului sebuah bidang menjawab tanpa bidang itu. Tidak ada isi balasan ini yang diautentikasi, sehingga dompet tidak menerima envelope_bytes hanya berdasarkan keterangan node: dompet rand menyegel amplop lama pada chain id 14 hingga 17 apa pun jawaban node, dan klien lain sebaiknya melakukan hal yang sama.
rand_getReceipt
Parameter [tx_hash]. Hasil null sampai panggilan di-commit, lalu { "tx", "program", "tier": 14, "outputs": [1, 0, 25, 0, 0, 0, 0, 0], "height": 17, "index": 0, "h_in": "9c0e…7f", "h_pub": null }. Tanpa bidang effect. h_pub adalah digest input publik program pada saat deploy yang menjadi acuan pemeriksaan bukti panggilan, null untuk program tanpa input publik. Sebuah invoke (v0.6.8) memiliki tanda terima panggilan, dan rand_getReceipts serta topik receipts membawanya tanpa perubahan.
rand_getReceipts
Parameter [program_id, from_height, to_height, limit?]. Hasil { "receipts": [ … ], "next_height": 2051 }: tanda terima milik program_id dengan from_height <= height <= to_height, berdasarkan tinggi lalu indeks, masing-masing persis objek rand_getReceipt. limit secara bawaan bernilai 256 dan dibatasi pada 256, dan tidak pernah memecah satu tinggi: begitu sebuah halaman memuat limit tanda terima, sisa tanda terima pada tinggi tersebut tetap disajikan. next_height adalah tinggi pertama yang tidak disajikan, atau null ketika to_height mengakhiri halaman. -32602 untuk to_height di bawah from_height.
rand_getCallEnvelope
Parameter [tx_hash]. Hasil null, atau { "tx", "h_in", "kem_ct", "to_sender", "to_auditor", "body" } dalam hex — transkrip input tersegel milik panggilan tersebut, disajikan apa adanya; node tidak memegang kunci yang membukanya. null jika panggilan tidak menerbitkan satu pun (--no-envelope), transaksi bukan sebuah panggilan, atau tidak ada tanda terima.
Staking dan suplai
rand_getValidators
Parameter []. Hasil: satu baris untuk setiap entri register, berurutan menurut alamat, jumlah berupa string desimal:
[{ "address": "…", "stake": "1000000000000",
"pending": [{ "release_epoch": 41, "amount": "5000000000" }],
"rewards": "4000000", "payout": "rand1…", "nonce": 3, "active": true, "jailed_until": null }]
jailed_until (v0.6.8) adalah epoch pertama ketika sebuah kunci yang terkena slashing boleh kembali masuk ke dalam sebuah himpunan (18446744073709551615 untuk selamanya), null jika tidak sedang dipenjara. Chain 20 tidak memiliki staking.slashing, sehingga nilainya selalu null di sana.
rand_getAdmitted
v0.6.8. Parameter []. Hasil { "admission_by_vote": true, "max": 256, "admitted": ["<address>", …] }: kunci yang telah dipilih masuk oleh set validator melalui AdmitValidator dan belum terdaftar, diurutkan menurut alamat. Pada chain yang genesis-nya menetapkan staking.admission_by_vote, seperti milik chain 20, sebuah Bond yang mendaftarkan kunci baru harus termasuk di dalamnya. max adalah jumlah yang dapat ditampung ledger sekaligus. Pada chain tanpa flag tersebut, admission_by_vote bernilai false, daftar selalu kosong, dan pendaftaran tidak memerlukan pemungutan suara. Chain 20 menjawab "admitted": [] pada 2026-10-01.
rand_getEpoch
Parameter []. Hasil { "epoch": 41, "epoch_blocks": 1000, "next_set": ["…", "…"] }; next_set merupakan proyeksi.
rand_getSupply
Parameter []. Hasil:
{ "height": 1998,
"genesis_deposited": "…", "genesis_staked": "…", "faucet_minted": "…",
"faucet_epoch": "…", "faucet_minted_in_epoch": "…",
"withdraw_deposited": "…", "fees_paid": "…", "burned": "…",
"subsidised": "…", "sealed_blocks": "…", "aggregator_bonds": "…", "slashed": "…",
"registration_fees_burned": "…",
"vesting_issued": "…", "vesting_released": "…", "vesting_in_register": "…", "vesting_locked": "…",
"program_rand_out": "…", "program_rand_held": "…",
"pool_value": "…", "register_total": "…", "total_supply": "…", "invariant_holds": true }
subsidised, sealed_blocks, aggregator_bonds, dan slashed hanya bergerak pada chain agregasi. faucet_epoch dan faucet_minted_in_epoch adalah penghitung faucet per epoch terhadap staking.faucet_budget_per_epoch (state konsensus pada chain 20). Keempat bidang vesting_* adalah penghitung vesting genesis, seluruhnya "0" pada chain tanpa bagian vesting, seperti chain 20. program_rand_out dan program_rand_held (v0.6.8, RPL-2; "0" tanpa bagian program_state) adalah RAND yang telah dibayarkan invoke dari vault program sebagai catatan (sisi pool, di dalam pool_value) dan RAND yang masih disimpan vault (sisi register, di dalam total_supply); RAND tersebut masuk melalui burn_r sebuah invoke, sehingga berada di dalam burned pada sisi pool. registration_fees_burned adalah Σ biaya pendaftaran token yang dibakar berdasarkan tokens.burn_registration_fee genesis, yang ditetapkan chain 20; invariant_holds mengurangkannya, bersama slashed, dari yang telah diterbitkan chain. Pasokan menjelaskan identitas tersebut.
rand_getEmission
Parameter []. Hasil { "inflation": "0", "subsidy": null, "faucet": true }. inflation selalu bernilai tetap "0". subsidy adalah jadwal agregasi blok (current, base, halving_blocks, sealed_blocks, next_halving_at) dan bernilai null pada chain tanpa bagian aggregation, seperti chain 20. faucet mencerminkan rand_status.
Bridge
Keempatnya menjawab di chain mana pun; pada chain tanpa bagian bridge, state-nya adalah { "enabled": false } dan registrinya []. Genesis chain 20 memilikinya: guardian set 1 (guardian_set_index 1) dengan delapan guardian, delapan guardian PQ, sebuah kunci jeda, burn_sequence 13 pada genesis, batas bawah replay (min_inbound_sequence 3 untuk chain sumber 2, 3, dan 4, serta 7 untuk chain sumber 5), rules_v2 bridge dengan batas mint global sebesar 4.000 zUSD per jendela 24 jam di seluruh backing, dan dua kelompok yang baru di v0.6.8: rotation (rotasi guardian PQ atau kunci jeda memerlukan bukti kepemilikan oleh kunci baru dan berlaku 86.400 detik setelah di-commit) serta fees (10 bps dari setiap deposit dan 10 bps dari setiap burn, disimpan di Rand sebagai catatan zUSD ke alamat treasury). Chain 19 memiliki burn_sequence 8, batas bawah 1 dan 4, serta tidak memiliki kedua kelompok tersebut. Bagian tokens-nya memiliki registration_fee sebesar 1 RAND (dibakar), mint_cap_per_day per backing sebesar 10000000000000 (100.000 zUSD dengan delapan desimal), dan mencantumkan zUSD itu sendiri: dibawa dari chain 14 pada genesis, dengan asset id yang sama, indeks 1, tujuh backing.
rand_getBridgeState
Parameter []. Hasil { "enabled": false }, atau:
{
"enabled": true,
"emitter": "01…",
"emitters": { "2": "02…" },
"guardian_set_index": 0,
"guardians": ["aabb…"],
"pq_guardians": ["…"],
"mint_paused": false,
"pause_nonce": 0,
"list_nonce": 0,
"pause_key": "…",
"registration_fee": "1000000000",
"burn_sequence": 1,
"rotation_nonce": 0,
"rules_v2": { "global_mint_cap_per_window": "…", "cap_window_secs": 86400,
"global_minted_in_window": "…", "global_mint_headroom": "…" },
"min_inbound_sequence": { "2": 2, "3": 2, "4": 2, "5": 2 },
"rotation_rules": { "delay_secs": 86400, "needs_possession": true },
"pending_rotations": [],
"fees": { "mint_bps": 10, "burn_bps": 10, "recipient": "rand1…" },
"assets": [ … ]
}
| bidang | arti |
|---|---|
emitter | alamat emitter keluar chain ini, hex 32 byte |
emitters | id chain sumber → alamat emitter yang dipercaya di sana |
guardians | alamat 20 byte dari set saat ini, hex |
pq_guardians | set PQ: kunci publik Dilithium2 (1.312 byte), hex, sejajar indeks dengan guardian set saat ini (set 1 pada chain 20). Setiap BridgeAttest membawa kuorum tanda tangan bersama dari set ini. Rotasi guardian set tidak pernah memindahkannya; hanya rotate_pq_guardians yang dapat, pada chain rules_v2 |
mint_paused | selama bernilai true, setiap attest transfer ditolak dengan bridge minting is paused; burn dan rotasi tetap terbuka |
pause_nonce | nilai yang harus dibawa oleh jeda atau pencabutan jeda berikutnya; keduanya menaikkannya |
list_nonce | nilai yang harus dibawa oleh register_bridged_token atau list_backing berikutnya; keduanya menaikkannya |
pause_key | satu-satunya kunci Dilithium2 yang boleh menjeda minting, hex. Kunci ini hanya dapat menjeda: pencabutan jeda memerlukan kuorum guardian PQ |
registration_fee | biaya yang terutang oleh RegisterBridgedToken di atas dasar bundle, dalam satuan RAND, string desimal |
burn_sequence | jumlah pesan keluar yang telah dipancarkan sejauh ini |
rotation_nonce | nilai yang harus dibawa oleh rotate_pq_guardians / rotate_pause_key berikutnya |
rules_v2 | batas mint global beserta jendela bergulirnya, atau null pada chain tanpa aturan bridge v2. Di bawahnya, batas per backing juga berupa jendela bergulir, dan listing ditolak selama minting dijeda. Sejak v0.6.8 ia juga membawa global_minted_in_window dan global_mint_headroom, string desimal |
min_inbound_sequence | batas bawah replay genesis: id chain sumber → sequence terendah yang boleh dibawa transfer dari chain itu, angka biasa; null pada chain tanpa batas tersebut (chain 15 dan sebelumnya). Sebuah bridge_attest di bawahnya ditolak dengan BelowReplayFloor, putusan permanen. Relayer membacanya untuk membuang lock yang telah di-mint oleh chain asal chain ini |
rotation_rules | v0.6.8: { "delay_secs", "needs_possession" } dari bridge.rotation genesis, atau null. Di bawahnya, rotasi adalah aksi _v2, membawa tanda tangan kepemilikan dari kunci baru, dan menunggu delay_secs sebelum berlaku |
pending_rotations | v0.6.8: rotasi yang telah di-commit dan belum berlaku, masing-masing { "kind": "pq_guardians", "new_pq_guardians", "effective_at_secs" } atau { "kind": "pause_key", "new_pause_key", "effective_at_secs" }; null tanpa rotation_rules. cancel_rotation yang ditandatangani kunci jeda saat ini membatalkan salah satunya |
fees | v0.6.8: { "mint_bps", "burn_bps", "recipient" } dari bridge.fees genesis, atau null (chain 14 hingga 19). Chain menyimpan bagian tersebut dari setiap deposit dan setiap burn, dibulatkan ke bawah ke satuan rilis utuh dari backing, sebagai catatan zUSD untuk recipient. Deposit dikreditkan sebesar jumlah kotor dikurangi biaya; badan bertanda tangan sebuah burn merilis jumlahnya dikurangi biaya. Wallet membacanya untuk menilai depositnya sendiri dan, bila ia adalah recipient, untuk membangun ulang catatan biayanya |
assets | baris-baris dari rand_getAssets |
Tanpa saldo: nilai yang dijembatani adalah catatan. Tidak ada lagi next_index: token yang dijembatani didaftarkan, di bawah indeks yang sudah ditetapkan oleh registrasinya, sebelum dapat dideposit, sehingga tidak ada indeks tersisa yang perlu diprediksi. Baca indeks token yang terdaftar dari assets atau rand_getTokens.
rand_getAssets
Parameter []. Hasil: registri aset bridge, naik menurut indeks, atau []:
[{ "index": 1, "chain": 2, "token": "aaaa…", "asset_id": "…", "decimals": 6, "locked": "600",
"mint_cap_per_day": "10000000000000", "minted_today": "1000", "mint_day": 20350,
"minted_in_window": "1000", "mint_window_secs": 86400, "mint_headroom": "390000000000" }]
Sejak v0.6.8 setiap baris backing, di sini dan di mana pun backing disajikan (rand_getBridgeState.assets, backings dari rand_getToken, rand_getTokens, dan rand_getTokenSupply), membawa minted_in_window (string desimal) dan mint_window_secs, keduanya null pada chain penghitung harian, serta mint_headroom: deposit terbesar ke backing tersebut yang diizinkan oleh batas pada waktu blok head, yaitu batas per backing dikurangi yang telah di-mint dan, di bawah rules v2, tidak lebih dari sisa jendela seluruh registri. Bacalah mint_headroom, bukan mint_cap_per_day − minted_today, yang mengabaikan batas global. Di bawah rules v2, seperti pada chain 20, minted_today adalah hitungan jendela bergulir, angka yang dipakai untuk memeriksa batas per backing; deskripsi penghitung harian di bawah ini berlaku untuk chain 14.
Satu baris per backing (koin sumber), sehingga token dengan tujuh backing menjadi tujuh baris di bawah satu index. index adalah kata asset yang dibawa oleh catatan aset tersebut; indeks 0 adalah RAND dan tidak pernah ada di registri. decimals adalah desimal sumber backing. locked, mint_cap_per_day, dan minted_today adalah string desimal dalam satuan delapan desimal milik token itu sendiri, bukan milik RAND; mint_day adalah bilangan bulat biasa, nomor hari UTC. mint_cap_per_day adalah tokens.mint_cap_per_day genesis, jumlah terbanyak yang boleh di-mint satu backing per hari UTC menurut waktu blok. minted_today adalah yang telah di-mint backing pada mint_day, hari UTC (timestamp_ms / 86,400,000) dari blok head, sehingga penghitung sisa dari hari sebelumnya terbaca "0" setelah head melewati tengah malam. Deposit yang melampaui batas ditolak dengan MintCapExceeded dan dapat diterima keesokan harinya. chain dan token adalah identitas wire yang ditandatangani guardian; asset_id adalah blake3 dari keduanya, yang dihitung oleh rand_bridgeAssetId.
rand_bridgeAssetId
Parameter [token_chain, token_address] (bilangan bulat, hex 32 byte). Hasil: asset id, 64 karakter hex. Aritmetika murni.
rand_getBridgeBurn
Parameter [sequence]. Hasil null atau { "sequence": 0, "body_hex": "…", "digest": "…", "tx": "…", "height": 2, "amount": "…", "release_amount": "…", "fee": "…" }.
Ketiga yang terakhir adalah v0.6.8, pada setiap chain, sebagai string desimal dalam satuan delapan desimal milik token. release_amount adalah jumlah yang dibawa badan bertanda tangan, dibaca langsung dari body_hex: yang dirilis kontrak sumber, yang darinya ia membayar biaya relayer milik badan tersebut. fee adalah biaya bridge yang disimpan chain sebagai catatan treasury, dan amount adalah yang dibakar bundle, release_amount + fee. Tanpa bridge.fees (chain 14 hingga 19), fee adalah "0". Sequence 13 pada chain 20, burn sebesar 0,999 zUSD: "amount": "99900000", "fee": "99900", "release_amount": "99800100".
Token (RPL)
Registri token RPL: setiap token, baik yang dijembatani maupun asli. Token menjelaskan standarnya.
rand_getTokens
Parameter [from_index, limit], keduanya opsional (0 dan 1000; limit dibatasi hingga 1.000). Hasil: registri naik menurut indeks mulai dari from_index, dibaca berdasarkan rentang dari indeks tersebut:
{ "enabled": true, "registration_fee": "1000000000", "next_index": 3, "max_tokens": 4096,
"burn_registration_fee": true, "bound_note_value": true,
"tokens": [
{ "index": 2, "id": "<64 hex>", "id_text": "rpl1…", "name": "Test Coin", "symbol": "TST",
"decimals": 6,
"authority": { "kind": "key", "key": "<Dilithium2 key, hex>", "address": "<base58>" },
"mint_nonce": 1, "total_supply": "5700", "registered_at": 3 }
] }
Pada chain tanpa bagian tokens: { "enabled": false, "tokens": [] }. index adalah kata asset yang dibawa oleh note milik token tersebut (0 adalah RAND dan tidak pernah dicantumkan). id adalah asset id token dan id_text adalah bentuk teksnya yang memiliki checksum: bech32m, HRP rpl, atas 32 byte id, 62 karakter. authority adalah salah satu dari:
kind | bidang lain |
|---|---|
none | — (suplai tetap, atau dilepaskan) |
key | key, address |
bridge | backings: [{ "chain", "token", "decimals", "locked", "mint_cap_per_day", "minted_today", "mint_day" }], bidang-bidang rand_getAssets, satu baris untuk setiap backing |
program | program |
Suplai, locked, mint_cap_per_day, minted_today, dan registration_fee adalah string desimal (satuan RAND untuk registration_fee, satuan token untuk sisanya); next_index, mint_day, dan max_tokens adalah angka. max_tokens adalah batas genesis pada registry (4.096 pada chain 20; null bila tanpa batas), yang bila terlampaui membuat pendaftaran ditolak dengan RegistryFull. burn_registration_fee menyatakan apakah biaya pendaftaran dibakar, bukan dibayarkan kepada proposer; bound_note_value menyatakan apakah mint atau deposit sebesar 2⁶³ atau lebih merupakan aturan validitas (admisi menolaknya di setiap chain, apa pun kondisinya). Ketiganya diatur pada chain 20. Halaman yang lebih pendek dari limit adalah halaman terakhir.
Otoritas program ({ "kind": "program", "program": "<id>" }) hanya dapat didaftarkan pada chain yang memiliki bagian program_state, seperti chain 20 (v0.6.8): token dimulai dari suplai nol, dan hanya invoke dari program tersebut yang dapat mencetak atau membakarnya.
Sebuah wallet menyelesaikan id token melalui daftar ini, tidak pernah melalui rand_getToken: aset pada sebuah transfer bersifat privat di chain, dan membaca seluruh registry berbiaya sama untuk token mana pun yang dimaksud.
rand_getToken
Parameter [token]: indeks registry (angka atau string desimal), id 64-hex (dengan atau tanpa 0x, huruf besar atau kecil), atau bentuk teks rpl1… (seluruhnya huruf kecil atau seluruhnya huruf besar). Hasil: baris rand_getTokens milik token tersebut, atau null. Id yang cacat — checksum salah, HRP lain, panjang salah, huruf campuran, bukan hex — menghasilkan -32602, sehingga kesalahan ketik tidak pernah menunjuk ke token lain. Pencarian per token memberi tahu node token mana yang diminati pemanggil; fitur ini untuk explorer dan pembacaan satu kali.
rand_getTokenSupply
Parameter [token], dalam bentuk yang sama. Hasil null, atau:
{ "total_supply": "600",
"backings": [{ "chain": 2, "token": "<32 bytes hex>", "decimals": 6, "locked": "600",
"mint_cap_per_day": "10000000000000", "minted_today": "1000", "mint_day": 20350 }] }
backings kosong untuk token native; untuk token yang dijembatani, jumlah locked bila dijumlahkan sama dengan total_supply. Catatan privasi yang sama seperti pada rand_getToken.
Agregasi blok (tidak aktif pada chain 20)
Metode-metode ini ada di node untuk chain yang genesis-nya memuat bagian aggregation. Pada chain 20 register-nya kosong dan tidak ada yang pernah di-unseal.
| metode | parameter | hasil |
|---|---|---|
rand_getAggregate | [hash] | covers, aggregator, subsidy, proving_share, n, height dari agregat yang menyegel; null untuk transaksi lainnya |
rand_getAggregators | [] | register aggregator: address, bond, payout, nonce, unbonding per baris |
rand_getUnsealed | [from, limit] | { "bundles": [{ "hash", "height", "excess" }], "next_from" }, bundle yang masih dapat dicakup oleh aggregator |
Sebuah Aggregate dikirim melalui rand_sendTransaction seperti yang lainnya.
Vesting genesis (tidak aktif pada chain 20)
Metode-metode ini ada di node untuk chain yang genesis-nya memuat bagian vesting. Belum ada chain yang memilikinya: pada chain 20 masing-masing menjawab { "enabled": false }. Endpoint publik meneruskannya sejak 2026-10-01.
| metode | parameter | hasil |
|---|---|---|
rand_getVesting | [id] atau [id, at_ms], id 64-hex dari entri | entri tersebut: kelasnya, penerima manfaat, jadwal (amount, start_ms, cliff_ms, linear_ms, step_ms), jumlah yang telah diklaim, dicabut, dan di-bond, serta vested_now, claimable_now, unvested_now pada as_of_ms (secara default waktu blok head); null untuk id yang tidak dikenal. Sejak v0.6.8 entri yang dapat dicabut mencantumkan revokers, threshold dari mereka yang dibutuhkan untuk pencabutan, dan treasury yang dibayar oleh pencabutan (semuanya menggantikan revoker tunggal), dan entri tersebut memuat revoke_nonce dan locked_now |
rand_getVestingSummary | [] | { "enabled": true, "height", "as_of_ms", "entries", "issued", "released", "locked", "classes": [ … ] }: total per kelas, tanpa kunci atau pemilik |
rand_getVestingSchedule | [from_ms, to_ms, step_ms], paling banyak 1.000 titik | { "enabled": true, "issued", "points": [{ "t_ms", "locked" }] }: total terkunci pada register dari waktu ke waktu |
Jumlah berupa string desimal. Keempat aksi vesting dikirim melalui rand_sendTransaction.
Langganan (WebSocket)
ws://127.0.0.1:8545/ atau /ws. Socket ini hanya melayani rand_subscribe dan rand_unsubscribe dan menjawab -32601 untuk yang lain. Tiga topik, aliran yang independen tanpa jaminan urutan di antaranya:
newHeads— bentukrand_getHead, dikirim sekali untuk setiap blok yang di-commit, berurutan, termasuk selama sinkronisasi.viewdi sini adalah view milik blok itu sendiri.receiptsataureceipts <program_id>— satu notifikasi untuk setiap blok yang di-commit dan membawa sedikitnya satu receipt panggilan yang cocok:{ "height", "hash", "receipts": [ … ] }, setiap receipt dalam bentukrand_getReceipt.transaction <hash>— satu notifikasi, lalu node menghapus langganan tersebut:{ "status": "committed", "height", "index" }, atau{ "status": "rejected", "reason" }untuk penolakan yang berkaitan dengan byte transaksi itu sendiri (batas yang dimilikirand_getTransactionStatus). Penolakan yang bergantung pada state tidak pernah diumumkan, jadi padukan dengan timeout.
{ "jsonrpc": "2.0", "id": 1, "method": "rand_subscribe", "params": ["newHeads"] }
{ "jsonrpc": "2.0", "id": 2, "method": "rand_unsubscribe", "params": ["1"] }
{ "jsonrpc": "2.0", "id": 3, "method": "rand_subscribe", "params": ["receipts", "<program_id>"] }
{ "jsonrpc": "2.0", "id": 4, "method": "rand_subscribe", "params": ["transaction", "<hash>"] }
{ "jsonrpc": "2.0", "id": 1, "result": "1" }
{ "jsonrpc": "2.0", "id": 2, "result": true }
{ "jsonrpc": "2.0", "method": "rand_subscription",
"params": { "subscription": "1", "result": { "height": 1998, "hash": "…", "view": 2251 } } }
Batas: 64 koneksi per node (koneksi ke-65 ditolak pada saat upgrade dengan 503), 8 langganan per koneksi, 64 KiB per frame klien, ping setiap 30 s yang dijawab dalam 5 s, dan 256 entri backlog per aliran — pelanggan yang tertinggal lebih jauh pada aliran yang didengarkannya akan ditutup dengan kode 1008, tidak di-buffer; sambungkan kembali dan isi celahnya dengan rand_getCompactBlocks (head), rand_getReceipts (receipt), atau rand_getTransactionStatus (sebuah transaksi). GET / biasa tanpa header upgrade dijawab dengan 400.
Galat
| kode | arti |
|---|---|
-32601 | metode tidak dikenal (termasuk metode akun yang telah dihentikan) |
-32602 | parameter tidak valid atau hilang |
-32000 | ditolak: transaksi yang ditolak mempool, panggilan faucet yang terkena pembatasan laju, pembuatan witness yang menunggu lebih dari 10 s, pembacaan lebih dari 30 s, metode yang tidak dilayani listener publik, atau langganan yang melebihi batas |
-32001 | objek yang dirujuk tidak ditemukan |
-32010 | di-prune: tinggi di bawah batas retensi node ini; data.floor menyebutkannya (lihat di bawah) |
-32603 | galat internal |
-32600 | permintaan tidak valid: isi melebihi batas ukuran, bukan JSON, batch yang cacat, atau notifikasi |
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32000, "message": "…" } }
Untuk rand_sendTransaction, hanya -32000 dan -32602 yang merupakan putusan atas transaksi; setelah kode lain nasib transaksi tidak diketahui (lihat rand_sendTransaction).
Node yang di-prune: galat -32010
Node yang dijalankan dengan --prune-history <window> menyimpan seluruh ledger (note, nullifier, anchor, register) tetapi hanya blok, transaksi, dan receipt dalam <window> terakhir; rand_status.prune_floor adalah tinggi terendah yang masih dimilikinya. Pada chain 20, 24 dari 26 validator berjalan dengan --prune-history 24h; kedua archive berjalan tanpa flag tersebut dan menyimpan setiap blok, dan endpoint publik meneruskan ke salah satunya.
- Berdasarkan tinggi, di bawah batas (genesis dikecualikan):
rand_getBlockByHeight,rand_getFinalityberdasarkan tinggi, dan rentangrand_getBlocks,rand_getCompactBlocks, ataurand_getReceiptsyang menjangkau di bawahnya dijawab dengan-32010pruned: height h is below this node's retention floor fdengandata: { "floor": f }. Tanyakan kepada sebuah archive.[0, 0]tetap melayani genesis. - Berdasarkan hash:
rand_getBlockByHash,rand_getReceipt,rand_getRawTransaction,rand_getCallEnvelope, danrand_getAggregatemenjawabnulluntuk hash yang telah di-prune, sama seperti untuk hash yang tidak pernah ada; hanya archive yang dapat membedakan keduanya.rand_getTransactiondanrand_checkTransactionjuga menjawabnull, dan-32010hanya bila sebuah baris lokasi yang bertahan menyebut tinggi di bawah batas.rand_getTransactionStatusmenambahkanfloorpada setiap entriunknowndi node yang di-prune. - Pemindaian wallet tidak terpengaruh:
rand_getCommitments,rand_getNullifiers,rand_getAnchor, dan metode witness membaca keluarga data yang tidak pernah di-prune.
Transaksi pada wire
Transaction { chain_id: u64, bundle: Option<Bundle>, action: Action }
Bundle { // the hidden-asset bundle (since chain 14)
anchor: Word8, nullifiers: [Word8; 4], commitments: [Word8; 4],
fee: u64, burn_a: u64, burn_r: u64, burn_asset: u32, time: u32,
envelopes: [Envelope; 4], proof: Vec<u8>,
auth_commit: Word8, auth_proof: Vec<u8>, // since chain 17 (v0.6.3): split authorisation's c and
} // its proof; zeros and empty without hc_auth
Envelope { kem_ct: Vec<u8>, to_receiver: Vec<u8>, to_sender: Vec<u8>, body: Vec<u8> }
Action::None
Action::Mint { cm: Word8, pk: Word8, time: u32, r: Word8, envelope: Envelope, amount: u64,
minter: PublicKey, signature: Signature }
Action::Deploy { base_pc: u32, words: Vec<u32>, public: Vec<u32> }
Action::Call { program: Hash, proof: Vec<u8>, input_envelope: Option<CallEnvelope> }
Action::Bond { validator: Address, amount: u64, registration: Option<Registration> }
Action::Unbond { validator: Address, amount: u64, nonce: u64, signature: Signature }
Action::Withdraw { validator: Address, amount: u64, nonce: u64, time: u32, r: Word8,
envelope: Envelope, signature: Signature }
Action::BridgeAttest { attestation: Vec<u8>, recipient: ShieldedAddress, r: Word8, time: u32,
asset: u32, envelope: Envelope, pq_signatures: Vec<PqSignature> }
Action::BridgeBurn { asset: u32, amount: u64, relayer_fee: u64, to_chain: u16,
token: [u8; 32], to: [u8; 32] }
// the five aggregation variants sit here in the enum's declared order
Action::RegisterToken { name: String, symbol: String, decimals: u8, authority: MintAuthority,
initial: Option<InitialMint>, salt: [u8; 32], index: u32 }
Action::TokenMint { asset: u32, amount: u64, recipient: ShieldedAddress, r: Word8, time: u32,
envelope: Envelope, nonce: u64, signature: Signature }
Action::SetAuthority { asset: u32, new: Option<PublicKey>, nonce: u64, signature: Signature }
Action::TokenBurn { asset: u32, amount: u64 }
Action::PauseMints { nonce: u64, signature: Signature } // bundle-less, fee-less
Action::UnpauseMints { nonce: u64, pq_signatures: Vec<PqSignature> } // bundle-less
Action::RegisterBridgedToken { name: String, symbol: String, salt: [u8; 32], chain: u16,
token: [u8; 32], decimals: u8, nonce: u64,
pq_signatures: Vec<PqSignature> }
Action::ListBacking { token_index: u32, chain: u16, token: [u8; 32], decimals: u8, nonce: u64,
pq_signatures: Vec<PqSignature> }
Action::RotatePqGuardians { new_pq_guardians: Vec<PublicKey>, nonce: u64,
pq_signatures: Vec<PqSignature> } // bundle-less, fee-less
Action::RotatePauseKey { new_pause_key: PublicKey, nonce: u64,
pq_signatures: Vec<PqSignature> } // bundle-less, fee-less
// the four vesting variants (ClaimVested, RevokeVesting, BondVested, UnbondVested) follow, tags 24 to 27;
// since v0.6.8 RevokeVesting carries `signatures: Vec<RevokerSignature>` in place of one `signature`
Action::AdmitValidator { candidate: PublicKey, signatures: Vec<(PublicKey, Signature)> } // tag 28, v0.6.8
Action::SlashEquivocation { first: Box<SignedHeader>, second: Box<SignedHeader> } // tag 29
Action::RotatePqGuardiansV2 { new_pq_guardians: Vec<PublicKey>, possession: Vec<Vec<u8>>,
nonce: u64, pq_signatures: Vec<PqSignature> } // tag 30
Action::RotatePauseKeyV2 { new_pause_key: PublicKey, possession: Vec<u8>, nonce: u64,
pq_signatures: Vec<PqSignature> } // tag 31
Action::CancelRotation { kind: u8, nonce: u64, signature: Signature } // tag 32
Action::Invoke { program: Hash, proof: Vec<u8>, input_envelope: Option<CallEnvelope>,
transition: Transition } // tag 33, RPL-2
MintAuthority = None | Key(PublicKey) | Bridge { backings: Vec<Backing> } | Program(Hash)
InitialMint { amount: u64, recipient: ShieldedAddress, r: Word8, time: u32, envelope: Envelope }
Transition { reads: Vec<Cell>, writes: Vec<Cell>, inflow: Inflow, pays: Vec<Payout>, mints: Vec<Payout> }
Cell { key: Word8, value: Word8 } // keys strictly ascending in each list
Inflow = None | Deposit | Burn // what the bundle's burn_a of burn_asset is to the program
Payout { asset: u32, amount: u64, recipient: ShieldedAddress, r: Word8, envelope: Envelope }
Registration { public_key: PublicKey, payout: ShieldedAddress, signature: Signature }
CallEnvelope { kem_ct: Vec<u8>, to_sender: Vec<u8>, to_auditor: Vec<u8>, body: Vec<u8> }
PqSignature { index: u8, signature: Vec<u8> } // one guardian's Dilithium2 co-signature, by set index
Konfigurasi default bincode: bilangan bulat berlebar tetap, prefiks panjang 8 byte, tag enum u32 menurut urutan deklarasi. Kelima varian agregasi mengikuti BridgeBurn dan mendahului RegisterToken dalam enum (Transaksi); chain 20 tidak pernah menerimanya, demikian pula keempat varian vesting maupun SlashEquivocation, tetapi encoder yang menulis nomor tag secara hard-code tetap harus menghitungnya.
Dua bidang terakhir bundle hadir bersama v0.6.3 dan chain 17. bincode bersifat posisional, sehingga encoder yang ditulis untuk chain 16 atau yang lebih lama tidak menghasilkan transaksi yang dapat didekode chain ini, dan setiap id transaksi ikut berubah: domain id kini rand-txid-3, yang mengikat auth_commit dan digest auth proof. Klien yang menghitung ulang id secara lokal harus mengikutinya. Pada chain 20 setiap bundle membawa auth proof, baik yang dibuktikan sendiri maupun yang didelegasikan. v0.6.8 tidak mengubah apa pun pada tata letak Transaction atau Bundle; versi ini menambahkan aksi 28 hingga 33.
Setiap transaksi membawa paling banyak satu bundle. Sebuah Bond membawa bundle yang burn_r-nya sama dengan amount-nya, dengan burn_a dan burn_asset bernilai 0. Sebuah BridgeBurn atau TokenBurn membakar melalui bundle: burn_asset harus sama dengan asset milik aksi tersebut (tidak pernah 0), burn_a sama dengan amount milik aksi, dan burn_r bernilai 0, sedangkan fee dibayar dalam RAND dari slot 2–3. Setiap aksi lainnya tidak membakar token apa pun, dan RAND hanya pernah dibakar melalui burn_r: bundle dengan burn_asset 0 dan burn_a bukan nol ditolak di mana pun. r pada sebuah BridgeAttest diturunkan, bukan dipilih: penerimaan mensyaratkan blake3("rand-deposit-r-1" ‖ mu) atas digest yang ditandatangani para guardian, dan menolak nilai lain apa pun (WrongDepositBlinding, penolakan permanen). Token yang dijembatani harus terdaftar — pada genesis, atau melalui RegisterBridgedToken / ListBacking — sebelum attestation apa pun atasnya dapat diterima; attestation atas koin yang tidak terdaftar ditolak dengan UnlistedToken.
Setiap bukti bundle dibuat atas, dan diverifikasi terhadap, transaksi yang memuatnya: seluruh transaksi dengan bukti-buktinya dikosongkan, terikat pada chain id dan, pada chain 20 (binding_domain: 1), pada genesis hash, di bawah tag baru. Pada chain 14 hingga 19 pengikatannya hanya chain id, sehingga bukti yang dibuat untuk chain 19 tidak terverifikasi pada chain 20, dan wallet yang lebih lama dari v0.6.8 tidak dapat mengirim ke sana. Pada chain 18 hingga 20, bundle tanpa kedua buktinya dikodekan menjadi 7.936 byte dan transaksi transfer tanpa keduanya menjadi 7.949 byte (5.848 dan 5.861 pada chain 14 hingga 16, dengan envelope 1.348 byte dan tanpa field auth). Sebuah transfer di jaringan berukuran sekitar 2,85 MB pada profil produksi, hampir seluruhnya bukti: bukti bundle sekitar 1,49 MB dan bukti auth sekitar 1,36 MB. Sebelum otorisasi terpisah, ukurannya sekitar 1,43 MB.