Rand Protocol
ドキュメント
リファレンス

JSON-RPC

ノードが提供するすべての rand_* メソッドについて、パラメータ、結果の形式、エラーを説明します。あわせて、バッチ処理、WebSocket サブスクリプション、トランザクションのワイヤーフォーマットも扱います。

ノードは --rpc(既定は 127.0.0.1:8545)で HTTP 上の JSON-RPC 2.0 を提供し、同じポートで購読用の WebSocket も提供します。v0.6.8 以降は、2 つ目の公開リスナーも開けます(--public-rpc、後述)。randprotocol_client::RpcClient(Rust)は、以下のすべてのメソッドをラップしています。このページは、chain 20 が稼働させているビルドである v0.6.8(c9c9bd3c)が提供するメソッドの一覧です。コード上には存在しても chain 20 では機能しないメソッドには、その旨を記しています。

curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"rand_getHead","params":[]}'

公開エンドポイント

https://rpc.randprotocol.org(同じプロキシは https://randprotocol.org/api/rpc にもあります)は、すべてのブロックを保持する chain 20 のアーカイブノードへリクエストを転送します。自前のノードを持たないウォレットやページのためのものです(rand --rpc https://rpc.randprotocol.org …)。HTTP POST のみで、CORS は開放、WebSocket はなく、ノードそのものより制限が厳しくなっています。

  • 1 回の呼び出しにつきリクエストは 1 件です。バッチは -32600 で拒否されます。
  • メソッドは許可リスト方式です。2026-10-01 以降は、ノード自身の公開リスナーと同じ集合(v0.6.8 の rpc::PUBLIC_METHODS)になっており、rand program invoke が必要とするプログラム状態の読み取り、rand_getAdmitted、アグリゲーションの読み取り、ベスティングの読み取りが含まれ、rand_checkTransaction と rand_sendTransaction も使えます。rand_mint、rand_importViewingKey、rand_getViewingNotes、rand_removeViewingKey、rand_getPeers は含まれず、ノードに届く前に -32601 method not allowed here で応答されます。公開のフォーセットは悪用されやすく、閲覧鍵は自分で運用するノードにだけ送るべきだからです。
  • リクエストボディは最大 12 MiB です。これは、あらゆる送金、トークン操作、デプロイ、そして証明が最大約 3.4 MB の呼び出しを収められる大きさです(トランザクションは hex エンコードされ、そのバンドル証明と認可証明だけで、呼び出しの証明の前に約 2.85 MB を占めます)。これより大きい呼び出しは自前のノードに送ってください。上限を超えると HTTP 413 と -32600 が返ります。
  • アドレスごとに 1 分あたり 1,200 リクエスト、rand_sendTransaction は 1 分あたり 6 回までです。超過すると HTTP 429 と -32005 が返ります。読み取りの上限は、ウォレットの初回同期、つまり 1 回のバーストで数百件に及ぶリクエスト(chain 18 の高さ 99,000 で 645 件)を想定した大きさです。
  • 背後のノードが応答しない場合は、-32000 upstream unavailable が返ります。

このページの以降の記述は、すべてノード自体について述べたものです。

ノードの 2 つのリスナー

v0.6.8(audit v6)以降、ノードは 2 つの JSON-RPC リスナーを持ちます。

  • --rpc <ADDR>:運用者用リスナー。 すべてのメソッド、バッチ、WebSocket を提供します。呼び出し元はソケットアドレスで識別され、ループバックは信頼されます。閲覧鍵のメソッドはループバックからのみ応答し、ループバックは流量計測の対象外です。127.0.0.1 に置いたままにしてください。リバースプロキシや SSH フォワードはループバックで到達するため、その背後ではすべての訪問者が運用者として扱われます。公開エンドポイントをこのポートに向けてはいけません。
  • --public-rpc <ADDR>:公開リスナー。 まさにその中継のためのものです。固定されたメソッド集合、すなわちウォレット、エクスプローラー、ページが必要とする読み取りと rand_sendTransaction を提供します(rpc::PUBLIC_METHODS)。rand_importViewingKey、rand_getViewingNotes、rand_removeViewingKey、rand_mint、rand_getPeers は決して提供されず、後から追加されたメソッドも一覧に載るまでは提供されません。そのような呼び出しには -32000 <method> is not served on this node's public listener が返ります。バッチは -32600 で、WebSocket のルートはありません。流量計測はすべての呼び出し元をまとめて 1 つで行い、バーストで 600 リクエスト、毎秒 150 リクエストまでです。超過すると、HTTP 429 と -32000 のボディが返ります。訪問者ごとの制限は、訪問者を識別できるプロキシの役割です。このリスナーの呼び出し元が使えるのはノードのブロッキング読み取りスロットの半分までで、運用者用リスナーが飢餓状態になることはありません。

2 つのリスナーは、2 つの読み取り制限を共有します。30 秒以内に完了しないブロッキング読み取りには、-32000 this read took longer than 30 s on this node; retry with a smaller range が返ります。rand_getBlocks は、64 MiB 分のブロックを読み取った時点でそのページを打ち切ります。

--rpc-viewing-token-file <PATH> は、--rpc の閲覧鍵メソッドにベアラートークンを要求します。トークンはファイルの 1 行目に書き、32 文字以上とし、Authorization: Bearer <token> として送ります。これを設定すると、ループバックだけでは足りなくなり、トークンを提示すればどこからの呼び出し元にも応答します。

規約

  • バリデータアドレスは base58 文字列(32 バイト)です。ハッシュは 64 桁の hex 文字で、0x の有無は問いません。シールドされた値、つまりコミットメント、ヌリファイア、アンカー、ツリールート、ウィットネスのレベルは Word8 で、リトルエンディアンの u32 ワード 8 個を、小文字 64 桁の hex 文字で表したものです。
  • シールドアドレスは rand1 + base58 で、1,667 文字です。2,000 文字を超えるパラメータは、パースされる前に長さを理由に拒否されます。
  • u64 の金額はすべて 10 進文字列です("1500000000" = 1.5 RAND、1 RAND = 10⁹ 単位)。RAND の単位でもトークンの単位でも、チェーン状態でもデコードされたトランザクション自身のフィールドでも同じです。JSON の数値は 2⁵³ を超えると正確な整数ではなくなり、小数 9 桁のトークンの供給量は数千万単位でそれを超えます。この変更の内容は、後述の日付付きの注記を参照してください。
  • インデックス、nonce、高さ、リーフインデックス、ビュー、長さ、decimals、日数カウンタ(mint_day)は金額ではなく、全体を通じて JSON の整数です。
  • すべてのリクエストに id メンバーが必要です。 id のないオブジェクトは通知として扱われ、-32600 で拒否されます。明示的な "id": null は通常のリクエストです。
  • 残高メソッドもアカウントメソッドもありません。 ウォレットは、閲覧鍵で rand_getCommitments と rand_getNullifiers をスキャンして残高を計算します。rand_getBalance、rand_getAccount、rand_getAssetBalance は -32601 を返します。

破壊的変更、2026-09-20(chain 14):すべての金額が 10 進文字列に

chain 14 より前は、デコードされたトランザクション内の金額は JSON の整数でした。この例外はなくなりました。次のフィールドは JSON の数値から 10 進文字列に変わりました。意味と位置に変更はありません。

  • bundle.fee。rand_getTransaction の tx と、rand_getBlockByHeight / rand_getBlockByHash の transactions[] にあります。
  • kind = mint、bond、unbond、withdraw、bridge_attest の action.amount(同じ 3 つのメソッド)。
  • kind = bridge_burn の action.amount と action.relayer_fee(同じ 3 つのメソッド)。
  • rand_getAssets の各行と、rand_getBridgeState.assets[] の locked。

これらのいずれかを数値として読んでいるクライアントは、文字列をパースするよう改める必要があります。rand_status の aggregation.subsidy_base(アグリゲーションを持つチェーンのみ)も、同じ変更で文字列になりました。それ以外の金額は、もともと文字列でした。rand_getSupply、rand_getEmission、rand_getValidators、閲覧ノート、そして chain 14 で導入されたすべてのフィールド、すなわちバンドルの burn_a と burn_r、トークンの供給量、各バッキングの locked、mint_cap_per_day、minted_today、registration_fee、さらに token_mint、token_burn、register_token の amount(initial_amount、initial.amount)です。

バッチ

POST のボディには、最大 20 件のリクエストオブジェクトからなる配列を指定できます。応答は、エラーも含めてリクエストと同じ順序・同じ長さの配列です。リクエストは 1 件ずつ順に実行されます。空の配列、20 件を超える配列、オブジェクトでも配列でもないボディは、id が null の単一の -32600 になります。ボディ全体は、証明付きトランザクション 1 件分に合わせたノードのリクエストボディ上限の制約を受けます。証明付きの rand_sendTransaction を 2 件含むバッチは 413 で拒否されます。バッチにするのは読み取りだけにし、証明付きの送信には使わないでください。

チェーンとノード

rand_chainId

パラメータは []。結果:チェーン ID(整数)。testnet では 20 です。

rand_tokenInfo

パラメータは []。結果は { "symbol": "RAND", "decimals": 9 }。

rand_getHead

パラメータは []。結果は { "height": 1998, "hash": "…", "view": 2251 }。view はノードの現在のコンセンサスビューで、ビューがタイムアウトすると高さより先に進みます。

rand_status(別名 rand_syncStatus)

パラメータは []。結果:

{
  "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:このノードがバリデータ鍵を保持していること。active_validator:その鍵が、現在のエポックを動かしている集合に含まれていること。reserved_peers(v0.6.8)は、インバウンド接続の上限を超えて受け入れられたピアの数です。ブートストラップ、--reserved-peer で指定したもの、署名付きピアバインディングから知ったすべてのバリデータ ID が、それぞれ 1 回ずつ数えられます。フリートのノードでは、起動から 1 分以内にバリデータ数に達するはずです。viewing_keys は、ノード側スキャンのためにノードがメモリ上に保持している閲覧鍵の数です。verify_queue は、4 つの証明検証ワーカーのいずれかを待っているトランザクションの数です(最大 64)。hc_bundle はこのチェーンの証明が対象とするバンドルゲストで、hc_auth はそのジェネシスが固定する認可ゲスト(chain 17 以降の分割認可)です。該当のないチェーンでは null になります。ビルドがどちらかと一致しないノードは、起動を拒否します。testnet と binding_domain は、rand_getLimits が返すのと同名のジェネシスフィールドです。gas_prices は、ティップ台帳の現在のガス価格で、コミットのたびに更新され、10 進文字列で返ります。gas セクションを持たないチェーンでは null です。chain 20 の価格は動的で、ブロックごとの充填率に応じて動き、下限の 100 と 800 を下回らず、上限の 10,000 と 80,000 を上回りません。したがって、ここか rand_getLimits で読み取り、ハードコードしないでください。このオブジェクトには aggregation オブジェクト(subsidy_base は 10 進文字列、残りは整数)も含まれます。chain 20 のように aggregation セクションを持たないチェーンでは、すべてゼロになります。

このオブジェクトにはほかに、disk_free_bytes(数値)と disk_low、そして保持に関する 2 つのフィールドがあります。prune_floor は、このノードが現在も保持している最小の高さ(アーカイブでは 0)で、prune_history_secs は、--prune-history で起動したノードが保持する期間です(すべてを保持する場合は null)。chain 20 では chain 19 と同様に、26 のバリデータのうち 24 が 24 時間分のブロックを保持し、2 つのアーカイブがすべてを保持します。プルーニングされたノードを参照してください。

rand_getPeers

パラメータは []。結果:{ "peer_id": "12D3KooW…", "addrs": ["/ip4/…/tcp/30303"], "connected_secs": 1241 } の配列。

rand_getBlockByHeight / rand_getBlockByHash

パラメータは [height] または [hash]。結果は、不明な場合は null、そうでなければ次のとおりです。

{
  "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": [ ]
}

Only committed blocks are served. 日本語:

コミット済みのブロックのみが返されます。transactions は、rand_getTransaction の tx と同じ形をしています。ブロックには sealed も含まれ、各トランザクションには sealed_by が含まれます。アグリゲーションのないチェーンでは、それぞれ false と null になります。

rand_getBlocks

パラメータは [from_height, to_height]。結果はブロックヘッダーで、古いものから順に、from_height から最大 1,024 件(2026-09-24 より前のノードでは 128 件)です。フィールドは transactions を除いた rand_getBlockByHeight のものです。上限を超える範囲やヘッドを超える範囲は、拒否されずに切り詰められます。また v0.6.8 以降は、ブロックを 64 MiB 読み込んだ時点でもページが終わります。返された最後の高さから先へ進めてください。to_height が from_height より小さい場合は -32602 を返します。

v0.6.8 以降、すべてのヘッダーに public_notes も含まれます。これはそのブロックの bridge_attest、token_mint、register_token の各トランザクションであり、ブリッジ手数料のあるチェーンでは bridge_burn トランザクションも含み、[{ "hash", "raw" }] の形式(rand_getRawTransaction が返すエンコーディング)で返されます。それ以外のブロックでは空です。burn は証明を空にし、"proofs_stripped": true を付けて返されます。その hash は実際のトランザクション ID です。ウォレットの初回同期はこれらのページを読み込むだけで、パブリックノートの再構築にほかのデータは必要ありません。

rand_getFinality

パラメータは [height] または [hash]。結果は次のいずれかです。{ "status": "committed", "height", "hash" }、{ "status": "certified", "height", "hash", "qc_view" }、{ "status": "proposed", "height", "hash" }、{ "status": "unknown" }。高さはコミット済みチェーンに対してのみ照合されるため、応答は committed か unknown のいずれかです。ハッシュの場合は、certified(レプリカの未コミットツリー内にあり、クォーラム証明書を持つ)または proposed(ツリー内にあるが証明書を持たない)になることもあります。

rand_getProposer

パラメータは [view] または [from_view, to_view]、最大 64 ビューです。結果は { "epoch": 3, "proposers": [ { "view": 2251, "proposer": "2nRdFC…" } ] } で、各ビューのリーダーを現在のバリデータセットのもとで示します。そのビューで当時稼働していたセットではありません。範囲が逆順の場合、または 64 ビューを超える場合は -32602 を返します。

rand_getVersion

パラメータは []。結果は { "version", "git_sha", "chain_id", "hc_bundle", "hc_auth", "fri_profile" } です。version はワークスペースのクレートのバージョン、git_sha はビルド時に取得したコミットハッシュで、追跡対象のファイルに差分があった場合は -dirty が付き、取得できなければ "unknown" になります。hc_auth は rand_status と同じくジェネシスの auth ゲストであり、なければ null です。2026-10-01 時点の chain 20 における公開エンドポイントの応答:

{ "version": "0.6.8", "git_sha": "c9c9bd3c1903aa4cc5833b7ab8c62fc3e6942017", "chain_id": 20,
  "hc_bundle": "60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce",
  "hc_auth": "1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1",
  "fri_profile": "production" }

rand_getGenesisHash

パラメータは []。結果はジェネシスハッシュの 16 進文字列で、chain 20 では "6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135" です(chain 19 のものは a3defc93…228a でした)。チェーン ID だけでは 2 つのチェーンカットを区別できませんが、これなら区別できます。chain 20 では、すべてのトランザクションバインディングとすべての署名済みアクションメッセージにも含まれます(binding_domain: 1、rand_getLimits を参照)。

rand_getHealth

パラメータは []。結果は次のいずれかです。{ "status": "disk_low", "free_bytes": "3221225472" }、{ "status": "ok" }、{ "status": "syncing", "behind": 412 }、{ "status": "behind", "behind": 30 }。disk_low は何よりも優先され、データディレクトリのファイルシステムの空き容量が、ノードの --min-free-disk-mb(デフォルトは 1024、つまり 4 GB 未満)の 4 倍を下回ったときに返されます。free_bytes は 10 進数の文字列です。ok は sync_target - height が 2 以下で、未処理の同期バッチリクエストがないときです。syncing は同期バッチリクエストが未処理のあいだ、behind はノードが同期中ではなく、遅れが 2 を超えているときです。

rand_getMempoolInfo

パラメータは []。結果は { "count": 2, "bytes": 2611200, "oldest_ms": 1450, "max_count": 10000 } です。bytes はプール内のすべてのトランザクションのエンコード長の合計で、oldest_ms はプールが空のとき null になります。v0.6.8 以降、プールにはバイト数の上限もあり、ジェネシスの max_block_bytes の 8 倍です(chain 20 では 160 MiB)。これを超えると、下限額を上回る KiB あたりの支払いがより多いトランザクションが最も安いものを押し出し、支払いが少ないか同額のものは mempool full で拒否されます。ガバナンスアクションは両方の上限を通過します。

送信

rand_sendTransaction

パラメータは [hex] で、hex は bincode(Transaction) です。結果はトランザクションハッシュです。ノードは受け入れ順序(トランザクション)に従って検証し、プールに入れてゴシップします。エラーは理由付きの -32000 で、nullifier already spent、anchor is not one of the last 1024 roots、time 12 is outside [1500, 2524](どちらのウィンドウもジェネシスの proof_window_blocks で、chain 20 では 1,024、chain 19 までは 256)、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 などがあります。invoke では、cell <key> is no longer what this transition read(状態に基づく判定です。セルを読み直して再度証明してください)、または the vault holds … of asset … and the transition pays … が返されます。投票による承認のもとで登録を行う Bond では、validator … has not been admitted by the validator set's vote (staking.admission_by_vote); ask the validators for an AdmitValidator first が返されます。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 が返されます。ブリッジアクションでは 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 が返されます。アクションが持てない burn を含むバンドルでは、the bundle burns asset 2 on an action that burns no token、a burn of 5 is not allowed on this action、または RAND burned through burn_a (5); a RAND burn goes through burn_r が返されます。ブリッジの状態に関しては、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 が返されます。トークンレジストリでは wrong mint nonce と wrong token index が返されます。受け入れはコミットではありません。rand_getTransaction または rand_getTransactionStatus をポーリングしてください。

チェーンのブロック上限(rand_getLimits の max_block_bytes)より大きいトランザクションは、メモリプールに届く前に、両方のサイズを示した -32000 で拒否されます。リクエストボディの上限は 2 × (2 × max_proof_bytes + 4 × 2048 + max_call_envelope_bytes + 16,384 + 64 KiB) + 256 KiB で、起動時にジェネシスから計算されます。デフォルトのチェーンでは 8,867,840 バイト、chain 20 の上限では 17,350,656 バイトで、chain 17 から 19 と同じです(chain 13 から 15 では 34,127,872 バイトで、証明の上限が 8 MiB でした)。4 × 2048 は、エンベロープの上限に達したバンドルの 4 つのエンベロープです。これを超えるボディは、上限を示した -32600 になります。

トランザクションに対する判定となるのは、-32000(受け入れが拒否した)と -32602(デコードできなかった)だけです。-32603 を含むそれ以外の失敗では、その行方は不明のままです。ノードは応答する前にトランザクションをプールに入れてゴシップするため、その間に停止したノードは、応答しないまま受け入れていた可能性があります。randprotocol_client は、この 2 つのコードの場合にのみ、送信が拒否されたものとして扱います。

rand_getTransactionStatus

パラメータは [[hash, …]]、ハッシュは 1 件から 64 件です。結果は、ハッシュごとに 1 エントリを順番に返します。

[ { "hash": "…", "status": "committed", "height": 1998, "index": 0 },
  { "hash": "…", "status": "pending" },
  { "hash": "…", "status": "rejected", "reason": "bad mint signature" },
  { "hash": "…", "status": "unknown" } ]

ハッシュごとの検索順序は、committed(ストレージ)、pending(メモリプール)、rejected(rand_status の refused_cache が数える拒否キャッシュ)、それ以外は unknown です。rejected が対象とするのは、トランザクション自身のバイト列に関する拒否のみで、後のブロックによって変わることがないものです。具体的には、無効な証明、証明が公開したものと一致しないバンドルダイジェスト、不正なミント署名、誤ったチェーン ID、サイズ超過の部分、トランザクション内で重複する nullifier またはコミットメント、サイズの誤ったエンベロープ、auth 証明の欠落または不一致、誤ったガスリミットを宣言するバンドルまたは auth 証明です。その時点のノードの状態に依存する拒否は記憶されず、unknown と読み取れます。たとえば、使用済みの nullifier、ウィンドウ外のアンカーまたは time、下限額を下回る手数料(chain 20 ではガス価格に応じて変動します)、未知のプログラム、レジスタの nonce、古くなった invoke の読み取りです。リストが空の場合、または 64 件を超える場合は -32602 を返します。

rand_mint(testnet faucet)

パラメータは [address] または [address, amount] で、address は rand1… アドレス、amount は最大 100000000000(100 RAND、デフォルト)の単位数の文字列です。結果はミントトランザクションのハッシュです。ジェネシスに "faucet": true があるチェーンでのみ動作し、それ以外では -32000 の faucet is disabled on this chain が返ります。オブザーバーは faucet mints are signed by validators; ask a validator node と応答します。

ジェネシスで staking.faucet_recipients が設定されているチェーン(chain 20 がそうで、16 ウォレットです)では、リストに載っているウォレットにのみ支払えます。それ以外のアドレスへのミントは、the faucet may not mint to this recipient (not in staking.faucet_recipients) で拒否されます。chain 20 のジェネシスでは staking.faucet_minters(バリデータ鍵 18 個)も設定されており、リストに載っている鍵のみがミントに署名できます。faucet にはエポックごとの予算 staking.faucet_budget_per_epoch(chain 20 では 1,000 ブロックのエポックあたり 10,000 RAND)もあり、それを超えるミントは FaucetBudgetExhausted で拒否されます。これは状態に基づく判定で、プールから出た後は unknown と読み取れます。

faucet はノードプロセスごとにレート制限されています。連続で 8 回までミントでき、1 秒に 1 回ずつ補充されます。これを超えると、呼び出しは faucet is rate limited on this node (8 mints back to back, refilling at 1/s); try again shortly を返します。したがって、faucet に大量のリクエストを送っても、ブリッジの PauseMints より先にプールを埋めることはできません。PauseMints は、他の 3 つのブリッジガバナンスアクションと同様に、プールの mempool full による拒否の対象外で、ブロック内でも先頭に並べられます。

chain 14 以降、ミントはオープンになりました。Mint アクションは cm と amount に加えてノートの pk、time、r を持ちます。受け付けの際にコミットメントが再計算され、これらを開いても cm にならないものは拒否されます(the mint's commitment does not open to its published note and amount)。ミンターは 7 つのフィールドすべてにドメイン rand-mint-2 で署名します。chain 20(binding_domain: 1)では、先頭にジェネシスハッシュを付けた rand-mint-3 で署名します。そのため、faucet のノートの所有者と金額は、withdraw の払い出しと同様に公開されます。rand_mint のパラメータは変わりません。

rand_estimateFee

パラメータは [spec] で、{"kind":"bundle"}、{"kind":"deploy","words":n,"public_words":m}、{"kind":"call","tier":t,"bytes":b,"gas":g} のいずれかです。t は 10、12、14、16、18、20 のいずれかです。結果は最小手数料で、単位数を文字列で返します。{"kind":"bundle"} は "1000000" です。public_words(省略可、デフォルトは 0)はコードと同じくワード単位で課金されるため、手数料は n + m ワードのデプロイ手数料になります。bytes(省略可、デフォルトは 0)は、呼び出しの証明の長さに入力エンベロープの長さを足した値です。

呼び出しの価格の決まり方は、rand_getLimits の gas_metering によって異なります。

  • "circuit":chain 20 のように、独自の gas セクションを持つチェーン。 gas は呼び出しの証明が宣言するガスリミットで、必須です。省略すると、呼び出しは -32602 under the gas section a call estimate needs its gas を返します。答えは、チップの現在の価格(rand_getLimits が返す価格)で計算した 1,000,000 + gas_price × gas + byte_price × ⌈bytes / 1024⌉ です。chain 20 の下限価格 100 と 800 では、ガス 20,479、証明とエンベロープの合計 1,300,000 バイトを宣言する呼び出しは "4063900" になります。価格はブロックごとに変動するため、見積もりは送信の直前に行ってください。
  • "header":このセクションを持たないチェーンでの、ノードレベルのガスポリシー。 呼び出しの spec は keccak_log_height と sha256_log_height(省略可、デフォルトは 0、いずれも 0 から 40 の範囲で、範囲外は -32602)を受け取ります。これらは証明ヘッダーが宣言するハッシュテーブルの高さです。答えは、台帳のティア下限と、そのヘッダーのガス下限のうち大きい方です。gas セクションがある場合、この 2 つの高さは受け付けられますが使われません。
  • null:どちらでもない場合。 台帳のティアスケジュールのみで決まります。無料枠(2,097,152 + 18,432 バイト)以内であれば、呼び出しはそのティアの手数料になります。超過した分は 1 KiB ごとに 1,000 単位が加算され、1 KiB に満たない端数も 1 KiB として数えます。

v0.6.8 以降、{"kind":"invoke", …, "created_cells": c} で RPL-2 の invoke の価格を見積もれます。呼び出し spec のすべてのフィールドに加えて、created_cells(省略可、デフォルトは 0、上限は max_writes で、超えると -32602)を指定します。これは、遷移が作成するセルの数です。1 セルごとに、チェーンの cell_fee(rand_getLimits.program_state)が加算されます。数えるのは呼び出し側です。rand_getProgramCell がゼロとして読み取るセルに、ゼロ以外の値を書き込むものが対象です。chain 20 では、上記の呼び出しに 2 つの作成セルを加えると "24063900" になります。program_state セクションを持たないチェーンでは、この kind は -32602 になります。

料金表は手数料にあります。

プール

rand_getTreeInfo

パラメータは []。結果は { "next_index": 41, "root": "6b1d…c4", "nullifiers": 12 } で、リーフ数、現在のルート、使用済みのノートの数を表します。

rand_getCommitments

パラメータは [from_index] または [from_index, limit]。結果は from_index からのリーフのページで、古い順に並びます。limit がいくら大きくても、最大 1,000 行です。

[ { "index": 40, "cm": "2a9f…07", "height": 37,
    "envelope": { "kem_ct": "b41c…", "to_receiver": "77e0…", "to_sender": "0c31…", "body": "9dd2…" } } ]

rand_getNullifiers

パラメータは [from_height] または [from_height, limit]。結果は、その高さ以降に公開されたすべてのヌリファイアで、上限は同じく 1,000 行です。ページが 1 つの高さの途中で終わることがあります。その場合は、見えた中で最も高い高さまで戻ってページを取得してください。

[ { "height": 37, "nullifier": "8c04…d1" }, { "height": 41, "nullifier": "12be…9a" } ]

rand_getCompactBlocks

パラメータは [from_height, to_height] で、どちらも必須です。結果はブロックごとに 1 行で、古い順に並びます。ライトウォレットが必要とするものだけを含み、それ以外は含みません。

[ { "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"] } ] } ]

バンドルを含むトランザクションは、ここでそれぞれ 4 つのノートと 4 つのヌリファイアを持ちます。これは 4 つのスロットのことで、ダミーのスロットも含みます。ダミーのスロットは、誰にも本物と見分けがつきません(例では最初のコミットメント行のみを示しています)。v0.6.8 以降、一部のトランザクションはこの 4 つの後ろにさらにノートを持ちます。invoke は払い出しごとに 1 つのノートを持ち、pays、mints の順に並びます。それぞれの払い出し専用のエンベロープを伴うため、受取人は試行復号で見つけます。chain 20 のようにブリッジ手数料を持つチェーンでは、bridge_burn はトレジャリー手数料のノートを持ち、bridge_attest はデポジットの後に手数料のノートを持ちます。手数料ノートのエンベロープは空で、誰にも封印されていません。トレジャリーウォレットは、トランザクションの公開フィールドからそのノートを再構築します。

1 回の呼び出しで最大 128 ブロック(それより広い範囲は切り詰められます)、そして最初のブロック(常に全体が返されます)を除いて 1,000 ノートまで返します。続きは、最後に返された height に 1 を足した値から取得してください。ブロックレベルの commitments 配列は、高さ 0 ではジェネシスのデポジットを保持し、それ以外では空です。Withdraw と BridgeAttest から派生するノートは、それぞれのトランザクションの下に表示されます。範囲が逆順の場合や、境界値が欠けている場合は -32602 になります。

rand_getAnchor

ヘッドの場合のパラメータは []、高さを指定する場合は [height]。結果は { "height": 192, "root": "6b1d…c4" } で、記録されたアンカーのない高さでは -32001 になります。アンカーになるのは、ブロック末尾のルートだけです。ノードは古い高さにも答えることがありますが、バンドルのアンカーが有効と認められるのは、直近 proof_window_blocks 個のルートのいずれかである場合に限られます。この値は chain 20 では 1,024、chain 19 までのチェーンでは 256 です。ヘッドに対して構築してください。

rand_getWitness

パラメータは [index]。結果は、ツリーの末尾を超えるインデックスでは null、それ以外ではそのリーフのマークルパスで、リーフ側から順に、ちょうど 32 レベルあり、ツリーの現在のルートが付きます。

{ "index": 40, "root": "6b1d…c4", "path": ["0000…00", "f2a1…3b", "…"] }

ノードが提供する読み取りの中で最も高コストで(深さ 32 のツリー全体を再構築します)、呼び出し側について何かを明かす唯一のリクエストです。ノードが同時に実行するツリーの再構築は最大 2 つで、rand_getWitness と rand_getWitnesses を合わせて数えます。スロットを 10 秒を超えて待ったリクエストは、-32000 witness builds are busy on this node; retry shortly で拒否されます。

rand_getWitnesses

パラメータは [[index, …]] で、リーフのインデックスを 1 個から 32 個まで指定します。結果は { "root": "…", "witnesses": [ { "index": 7, "path": ["…"] }, { "index": 9, "path": null } ] } です。これは rand_getWitness を多数のリーフにわたって 1 回のツリー構築にまとめたもので、複数のノートを証明するウォレットは再構築のコストを 1 回だけ負担します。ツリーの末尾を超えるインデックスは、そのエントリが path: null になります。リストが空の場合や、インデックスが 32 個を超える場合は -32602 です。

ビューイングキーと開示

rand_importViewingKey

パラメータは [viewing_key] または [viewing_key, rescan_from_height] で、キーは 64 桁の 16 進文字列です。結果は { "imported": true, "rescan_from_height": 0, "viewing_keys": 3 } です。ノードはキーをメモリ上にのみ保持します。上限はノードあたり 64 個で、再起動で消去されます。すでに保持しているキーのインポートは何も起こしません("imported": false)。インポートではスキャンは行われず、スキャンは次のメソッドによって進められます。キーの形式が不正な場合は -32602、65 個目のキーでは -32000 です。

3 つのビューイングキー関連メソッドはループバックの呼び出し元にのみ応答し、それ以外には -32000 で拒否します。ただし、認証を行う何かの背後でノードを --rpc-viewing-open 付きで実行している場合は除きます。rand_removeViewingKey([viewing_key] → { "removed": bool, "viewing_keys": n })は、スロットを解放してキーをゼロクリアします。レジストリは、キー自体ではなく、キーの一方向 ID である blake3("rand-viewing-registry-id-1" ‖ nk) をキーとして管理されます。そのため、インポートされたものが唯一の長期的なコピーであり、削除によって消去されます。リクエスト自体の JSON テキストと、試行復号が作る一時的なコピーは消去されません。

rand_getViewingNotes

パラメータは [viewing_key] または [viewing_key, from_index, limit] です(limit のデフォルトと上限はどちらも 1,000)。呼び出しのたびに、キーのスキャンを最大 10,000 リーフ進めてから、ページを返します。

{ "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 は received(エンベロープが受信者として開かれ、ノートがそのキーの pk を指している)か、sent(送信用ビューイングキーで開かれた)のいずれかです。ノートの memo は送信者が暗号化したメモで、最大 510 バイトの UTF-8 テキストです。メモがない場合や、そのフィールドが不正な形式で開かれた場合は null になります。不正な形式のメモのせいで、受取人がノートを失うことはありません。メモは誰でも書ける文字列です。信頼できないものとして表示してください。このノードがインポートしていないキーに対しては -32001 になります。

rand_checkTransaction

パラメータは [hash, key] で、key はトランザクションごとの TxKey を 64 桁の 16 進文字列で表したものです。結果は、不明なハッシュでは null、それ以外ではキーが開示する内容です。

{ "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" } } ] }

ステートレスです。鍵は呼び出しとともに破棄されます。output は、バンドルの four つの出力スロットを表す bundle:0 … bundle:3(スロット 0〜1 はプライベート資産の出力、スロット 2〜3 は RAND の出力で、ダミーも含みます)、ブリッジのアテステーションのデポジットエンベロープを表す deposit、TokenMint のノートを表す token_mint、RegisterToken の初期ミントを表す initial_mint、faucet ミントの 1 つのエンベロープを表す mint:0、または(v0.6.8)invoke が支払ったノートを表す payout:0 … payout:3(トランジション内での位置の順に番号が付き、pays、次に mints の順です)のいずれかです。asset_bundle:* は 2 つ目のバンドルとともになくなりました。ブリッジ手数料のあるチェーンでは、deposit は正味のデポジット、つまり総額から手数料を差し引いた額を開きます。開示された note は asset を含みます。送信者が封印に用いた鍵を使うこの呼び出しは、転送がどの資産を動かしたかを RPC が明らかにする唯一の場所です。memo も含まれます。これは rand_getViewingNotes と同じです。ノートを開く鍵がメモも開きます。どちらも同じ封印された本体から取り出されるためです。誤った鍵では { "disclosed": [] } が返り、何も開示しないトランザクションと区別がつきません。withdraw と genesis alloc のエンベロープは試行されません。これらはノード内部で、直ちに破棄される鍵のもとで封印されるため、対応する TxKey が存在しないからです。faucet ミントのエンベロープは試行されます。受信者はエンベロープの KEM 側を通じて鍵を復元します(rand tx-key)。

トランザクション

rand_getTransaction

パラメータは [hash] です。コミットされるまでは null を返し、コミット後は次を返します。

{
  "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 は、バンドルを持たないアクションでは null です。証明とエンベロープは長さだけが報告されます。envelope_len は chain 20 ではすべてのスロットで 1,860 です。chain 20 の genesis がノートのエンベロープをこのサイズに固定しています(rand_getLimits の envelope_bytes)。chain 14 から 17 では 1,348 でした。auth_commit と auth_proof_bytes は分割認可のものです(chain 17 以降)。前者はバンドル証明と認可証明の両方が公開する公開コミットメント c = H(AUTH, nk, salt)、後者は認可証明の長さです。hc_auth のないチェーンでは、それぞれゼロと 0 になります。

bundle は隠れた資産のバンドルです(chain 14 以降)。入力スロットが 4 つ、出力スロットが 4 つあるため、nullifiers、commitments、envelope_len は、ダミーを含めて常に 4 つずつです。1 つのトランザクションが持つバンドルは多くても 1 つで、2 つ目のバンドルはありません。asset フィールドはありません。スロット 0〜1 はプライベート資産を、スロット 2〜3 は RAND を運び、スロット 0〜1 がどの資産を動かしたかを示す公開情報は何もありません。RAND の転送も任意の RPL トークンの転送も、どちらも "kind": "none" で、burn_a、burn_r、burn_asset はすべて 0 です。つまり、フィールドごとに同じ形です。token_transfer という kind はありません。3 つのバーンフィールドは、価値がプールから出ていくことについて、バンドルが公に示す唯一の記述です。

  • burn_a / burn_asset — バーンされたプライベート資産の量と、その資産。token_burn または bridge_burn では 0 ではなく、アクションの amount と asset に等しくなります。inflow が deposit または burn である invoke でも同様です。
  • burn_r — バーンされた RAND。bond(その amount に等しい)、register_aggregator、およびプログラムのボールトに RAND をデポジットする invoke では 0 ではありません。
  • fee — RAND の手数料で、常にスロット 2〜3 から支払われます。

アクションの表示形式(amount、relayer_fee、initial_amount はすべて 10 進数の文字列です。トークンの量は RAND ではなく、そのトークン自身の単位です)。

kindfields
none—
mintcm, amount, minter (validator base58)
deployprogram, words, public_words_len
callprogram, proof_len, input_envelope_len (呼び出しにエンベロープがない場合は null)
bondvalidator, amount, registered
unbondvalidator, amount, nonce
withdrawvalidator, amount, nonce, time
bridge_attestattestation_len, recipient, asset, asset_index, amount, time, r, commitment, pq_signers (共同署名したガーディアンの pq_guardians へのインデックス。2,420 バイトの署名は表示されません)。ガーディアンセットのローテーションでは、asset_index、amount、commitment は null です。r は導出値で、ガーディアンが署名したダイジェスト mu に対する blake3("rand-deposit-r-1" ‖ mu) です。v0.6.8 以降は、deposit_amount(預け入れ者のノート。ガーディアンが署名した総額である amount からブリッジ手数料を差し引いた額)と fee_note({ amount, asset, time, r, commitment }。所有者を除いたトレジャリーのノートで、ブリッジ手数料がなければ null)も含まれます。commitment は正味のデポジットのリーフです
bridge_burnasset, amount, relayer_fee, to_chain, token (償還されるバッキング), to。1 つのバンドルでバーン全体を担います。その burn_asset と burn_a は、アクションの asset と amount です。v0.6.8 以降は、release_amount(署名された本体が解放する額で、amount からブリッジ手数料を差し引いた額)と、attest と同じ fee_note も含まれます
register_tokenname, symbol, decimals, authority ("none", "key", "bridge" または "program"), index, initial_amount, initial ({ amount, recipient, time, r } または null)
token_mintasset, amount, recipient, time, r, nonce
set_authorityasset, nonce, new_authority (base58。権限の放棄の場合は null)
token_burnasset, amount。バンドルの burn_asset / burn_a はこれらを繰り返します
pause_mintsnonce。バンドルも手数料もなく、genesis の pause key が署名します
unpause_mintsnonce, pq_signers。バンドルも手数料もありません
register_bridged_tokenname, symbol, salt, chain, token, decimals (最初のバッキングのソース側 decimals), nonce, asset_id, pq_signers
list_backingtoken_index, chain, token, decimals, nonce, pq_signers
rotate_pq_guardiansnew_pq_guardians, nonce (消費された rotation_nonce), pq_signers (ローテーション前の PQ セットへのインデックス)。バンドルも手数料もなく、ブリッジの rules_v2 チェーンのみです
rotate_pause_keynew_pause_key, nonce, pq_signers。同じ条件です
rotate_pq_guardians_v2, rotate_pause_key_v2v0.6.8: v1 のフィールドに加え、PQ 形式では possession_signatures(件数)があります。バンドルも手数料もありません。genesis の bridge.rotation が needs_possession を設定しているチェーン(chain 20 がそうです)では必須です。ローテーションは delay_secs 後に有効になります(chain 20 では 86,400 秒)
cancel_rotationv0.6.8: rotation_kind ("pq_guardians" または "pause_key"), nonce。現在の pause key が署名し、保留中のローテーションを取り消します
admit_validatorv0.6.8: candidate (アドレス), candidate_key (hex), voters (アドレス)。バンドルも手数料もありません。staking.admission_by_vote のあるチェーン(chain 20 がそうです)で、新しいキーの登録を認めるバリデータセットの投票です
slash_equivocationv0.6.8: offender, view, first と second ({ hash, height })。staking.slashing のあるチェーンのみで、chain 20 には該当しません
invokev0.6.8、RPL-2: call のフィールド(program、proof_len、input_envelope_len)と、その transition(後述)。program_state セクションのあるチェーンのみで、chain 20 がそうです
register_aggregator, unbond_aggregator, withdraw_aggregator, slash_aggregator, aggregateそれぞれの公開フィールド。アグリゲーションチェーンのみです
claim_vested, revoke_vesting, bond_vested, unbond_vestedentry (hex), amount (revoke では unvested), nonce。claim と revoke では time。bond では validator と registers。v0.6.8 以降、revoke では signers(その署名者の、エントリの revokers における位置)。バンドルはありません。genesis に vesting セクションのあるチェーンのみで、chain 20 には該当しません

トークンの登録とミントは、ブリッジのデポジットと同様に公開されています。ミントされたノートのすべてのワードがアクションに含まれます(その from はチェーン固定の MINT_FROM です)。そのため、受信者は何も復号せずに、これらのフィールドからノートを再構築できます。kind 文字列 bridge_attest、token_mint、register_token、invoke は、ウォレットのスキャンがキーとして用いるもので、テストで固定されています。

chain 20 の高さ 3,079 にある invoke です。1 つのセルを読み取り、それを削除し、ボールトから 2 つのノートを支払いました。

{ "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": [] } }

すべては設計上公開されています。reads はプログラムが読み取ったセルと、読み取った値です。証明はそれらに対して作られており、台帳は、それらが依然として成り立っていなければトランザクションを拒否します。writes はプログラムが書き込んだセルです。64 個のゼロの書き込み値はセルを削除します。セルのキーと値は Word8 です。入ってきたものはバンドルのものです。burn_r はプログラムのボールトにデポジットされた RAND で、burn_a 分の burn_asset は inflow が示すトークンです。deposit はボールトへ、burn は(プログラム自身のトークンの)バーンで、burn_a が 0 のときは none です。出ていくものは、支払いごとにチェーンが計算した 1 つのノートです。ボールトからの pays、次に、ミント権限がこのプログラムであるトークンの mints です。各ノートのすべてのワードは、token_mint のフィールド名でここに含まれます。time はバンドルのもの、cm はチェーンが追加したリーフで、ノートの from はチェーン固定の PROGRAM_FROM です。プログラムの 8 つの出力ワードは、call の場合と同様にレシートにあります。

どの転送の応答にも、送信者、受信者、nonce、金額、資産は含まれません。保存された転送には、そのようなフィールドが存在しません。

rand_getRawTransaction

パラメータは [hash] です。結果はコミットされたトランザクション全体を bincode の hex で返します。証明バイトも含みます。これはアグリゲーターが必要とするもので、rand_getTransaction は決して表示しません。

プログラムとレシート

rand_getProgram

パラメータは [program_id] です。結果は null、または { "id", "base_pc", "words_len", "code_hash", "deployed_at", "public_words_len", "public_digest" } です。deployer フィールドはありません。deploy はバンドルによって支払われるためです。public_words_len はプログラムの deploy 時の公開入力の長さ(なければ 0)で、public_digest はそのダイジェスト、つまりすべての call の証明が照合される値です。なければ null です。

rand_getProgramCode

パラメータは [program_id] です。結果は null、または { "base_pc": 0, "words": [ … ] } です。

rand_getProgramPublic

パラメータは [program_id] です。結果は、プログラムのデプロイ時の公開ワードを 1 つの 16 進文字列で返します。各ワードはリトルエンディアンの 4 バイト(1 ワードにつき 16 進 8 桁)で表します。[1, 2, 0xdeadbeef] は "0100000002000000efbeadde" になります。公開入力なしでデプロイされたプログラムには "" を、どのプログラムにも存在しない id には null を返します。呼び出しの証明を生成するウォレットは、これらのワードを prover に渡します。台帳は、証明のコミットメントをプログラムの public_digest と照合します。

rand_getProgramCell

v0.6.8、RPL-2。パラメータは [program_id, key] で、key は Word8 を 64 桁の 16 進数で表したものです(0x の有無は問いません)。結果は { "key": "<64 hex>", "value": "<64 hex>" } です。プログラムが一度も書き込んでいないセル、またはゼロを書き込んだセル(ゼロの書き込みはセルを削除します)は、64 桁のゼロとして読み出されます。これが「存在しない」ことを表す唯一のエンコーディングです。プログラムの存在は確認されないため、デプロイされていないプログラムのどのキーも同様にゼロを返します。program_state セクションのないチェーンでは { "enabled": false } を返します。セルは設計上公開されています。ウォレットは、これを読んで invoke の reads を組み立てます。

rand_getProgramCells

v0.6.8。パラメータは [program_id, { "after": "<64 hex>" | null, "limit": n }] で、オブジェクトは省略できます。結果は { "cells": [{ "key", "value" }, …], "next": "<64 hex>" | null } です。プログラムのセルをキー順(8 ワードの符号なし比較)に、after の次から最大 limit 件(1〜1,000 に丸められます)返します。続きがある場合、next には返した最後のキーが入り、これを after として渡します。最後のページでは null になります。セルを持たないプログラムは { "cells": [], "next": null } を返し、セクションのないチェーンでは { "enabled": false } を返します。

rand_getProgramVault

v0.6.8。パラメータは [program_id] です。結果は [{ "asset": 0, "amount": "123" }, …] で、asset のインデックスの昇順に並びます(0 は RAND、それ以外のインデックスはトークンレジストリのものです)。amount はそのアセット固有の単位による 10 進文字列です。ゼロの行は存在しないため、空のボールト、およびデプロイされていないプログラムは [] になります。セクションのないチェーンでは { "enabled": false } を返します。価値がボールトに入るのは invoke のバンドル経由(burn_r、および inflow が deposit のときの burn_asset に対する burn_a)で、出ていくときは遷移の pays が指定するノートになります。

rand_getLimits

パラメータは [] です。結果は、ウォレットがトランザクションを構築するためにチェーンの genesis から必要とする情報です。5 つの呼び出し上限、ノートのエンベロープサイズ、v0.6 スイッチ、auth guest、ガス条件、そして v0.6.8 以降は audit-v6 の genesis フィールドとプログラム状態の上限が含まれます。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 } }

5 つの上限フィールドを持たない genesis(chain 12)には、4096、2097152、4194304、18432、0 が適用されます。max_proof_bytes は chain 13〜15 では 8,388,608 でした。

fieldmeaning
envelope_bytesgenesis がノートを作成するすべてのエンベロープをちょうどその長さに固定している場合は 1860(メモを含む形式)。このフィールドのない genesis(chain 14〜17)では null で、ウォレットはメモなしの 1,348 バイトのエンベロープを封印します。これ以外の値はありません
hardening_v6genesis が v0.6 の検証ルールで動作している場合は true。このときウォレットは、公開入力だけでなく、プログラムの公開入力に続けてトランザクションの call binding に対して呼び出しを証明します。順序は、手数料バンドルのノートを先に選び、次に呼び出しを証明し、最後にバンドルを証明します。このフラグのあるチェーンは旧形式の証明を拒否し、ないチェーンは新形式の証明を拒否します
hc_authgenesis が固定する auth guest(16 進数)、または null。設定されている場合、hc_bundle は bundle guest v3 であり、すべてのバンドルに auth_commit と auth proof が含まれます。ウォレットは bundle guest に nk と新しい salt を渡し、spend key に対して auth guest を証明します
gas_meteringgenesis に gas セクションがあるチェーンでは "circuit"(回路内メーター)。ないチェーンでノードが独自のガスポリシー(--gas-price、--byte-price)で動作している場合は "header"。どちらでもない場合は null
gas_price, byte_priceガス 1 単位あたりの価格と、呼び出しの証明および入力エンベロープ 1 KiB あたりの価格で、10 進文字列です。gas セクションがある場合、これらはコンセンサス状態であり、すべてのノートで同じ値になります。chain 20 のように gas.dynamic がある場合は、チップの現在の価格で、ブロックごとの充填率に応じて動き、genesis の下限(100 と 800)を下回らず、上限を超えて上がることもありません。ない場合は、セクションの固定価格です。セクションがない場合はこのノート独自のポリシーであり、2 つのノードが異なる値を返すことがあります
bundle_gas_limitすべてのバンドル証明が宣言しなければならない固定のガス量で、genesis の gas セクションに由来します。セクションがなければ null
adjust_bps動的コントローラが 1 ブロックで動かせる価格変動の最大幅(ベーシスポイント)。gas.dynamic のないチェーンでは null
max_gas_price, max_byte_pricev0.6.8:コントローラが価格をそれ以上に引き上げない上限で、10 進文字列です。chain 20 では "10000" と "80000"、genesis が上限を設定していない場合(chain 18 と 19)は null
byte_loadv0.6.8:呼び出しの証明と入力エンベロープだけが byte_price を動かす場合は "paying"。chain 20 のように、送金だけのブロックでは動きません。すべてのトランザクションのバイトが計上される場合(chain 18 と 19)は null
admission_by_votev0.6.8:新しいバリデータ鍵を登録するボンドが、先にバリデータセットの投票を必要とするかどうか(rand_getAdmitted)。chain 20 では true
testnetv0.6.8:genesis の testnet マーカーで、ブリッジセクションと並べてフォーセットを置けるようにします。chain 20 では true、それ以前のすべてのチェーンでは false
slashingv0.6.8:{ "equivocation_bps", "jail_epochs" }、リーダーの二重署名に対する罰則、または null。chain 20 では null
binding_domainv0.6.8:トランザクションの binding と署名されたすべてのアクションメッセージが chain id だけに束縛される場合は 0(chain 14〜19)、genesis ハッシュも含む場合は 1(chain 20)。後者では、あるチェーン向けに作った証明や署名は他のどのチェーンでも検証されません。ウォレットはどちらの形式で証明するかを chain id で決め、この応答では決めません。v0.6.8 の rand ウォレットは、chain id 14〜19 には chain id 形式を、それ以外のすべての id には genesis に束縛された形式を使い、この値は早期に拒否するためだけに読みます。v0.6.8 より古いウォレットは chain 20 で送信できません
proof_window_blocksv0.6.8:バンドルのアンカーがどれだけ古くてよいか(ブロック数)、およびその time が高さからどれだけ遅れてよいか。両者に共通する 1 つのウィンドウです。chain 20 では 1024、chain 19 までは null(256)。証明生成が遅いウォレットや証明を委任するウォレットは、これを読んで証明にかけられる時間を知ります
program_statev0.6.8、RPL-2:genesis の program_state セクションとその invoke の上限、または null。null の場合、すべての invoke は拒否され、プログラムトークンは登録できません。cell_fee は、invoke の手数料下限がセルを 1 つ作成するごとに加算される RAND の単位数(10 進文字列)で、ゼロとして読み出されるセルへの非ゼロ値の書き込みがセルの作成にあたります。上書き、削除、ゼロの書き込みは無料です。max_reads、max_writes、max_payouts(pays と mints の合計)は厳格な上限です。実際には、セグメントのルールが先に効きます。遷移のコンテキストワード(11 + read または write ごとに 16 + payout ごとに 3)は、zkVM の公開テーブルを広げることなく、プログラムの公開入力と 8 つの binding ワードとともに収まらなければなりません。公開入力のないプログラムではそのテーブルは 128 行で、コンテキストワードに使えるのは 119 です

このフィールドより前のバージョンのノードは、そのフィールドなしで応答します。この応答のどの部分も認証されていないため、ウォレットは envelope_bytes をノードの申告だけで受け入れません。rand ウォレットは、ノードの応答にかかわらず chain id 14〜17 では旧形式のエンベロープを封印します。他のクライアントも同様にしてください。

rand_getReceipt

パラメータは [tx_hash] です。呼び出しがコミットされるまでは null、コミット後は { "tx", "program", "tier": 14, "outputs": [1, 0, 25, 0, 0, 0, 0, 0], "height": 17, "index": 0, "h_in": "9c0e…7f", "h_pub": null } を返します。effect フィールドはありません。h_pub は、呼び出しの証明が照合されたプログラムのデプロイ時の公開入力のダイジェストで、公開入力のないプログラムでは null です。invoke(v0.6.8)にも呼び出しと同じレシートがあり、rand_getReceipts と receipts トピックはそれをそのまま返します。

rand_getReceipts

パラメータは [program_id, from_height, to_height, limit?] です。結果は { "receipts": [ … ], "next_height": 2051 } で、from_height <= height <= to_height を満たす program_id のレシートを、高さ、次にインデックスの順に並べたものです。各要素は rand_getReceipt のオブジェクトと完全に同じです。limit の既定値と上限は 256 で、同じ高さを分割することはありません。ページが limit 件のレシートに達しても、その高さの残りは返します。next_height は返されなかった最初の高さで、to_height でページが終わった場合は null です。to_height が from_height より小さい場合は -32602 を返します。

rand_getCallEnvelope

パラメータは [tx_hash] です。結果は null、または 16 進数の { "tx", "h_in", "kem_ct", "to_sender", "to_auditor", "body" } で、呼び出しの封印された入力トランスクリプトをそのまま返します。ノートはこれを開く鍵を持ちません。呼び出しが何も公開しなかった場合(--no-envelope)、トランザクションが呼び出しでない場合、またはレシートがない場合は null です。

ステーキングと供給量

rand_getValidators

パラメータは [] です。結果は、レジスタのエントリごとに 1 行を、アドレス順に並べたもので、amount は 10 進文字列です。

[{ "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)は、スラッシュされた鍵が再びセットに入れる最初のエポックです(永久の場合は 18446744073709551615)。jail されていない場合は null です。chain 20 には staking.slashing がないため、そこでは常に null です。

rand_getAdmitted

v0.6.8。パラメータは []。結果は { "admission_by_vote": true, "max": 256, "admitted": ["<address>", …] } です。バリデータセットが AdmitValidator で投票により承認済みで、まだ登録されていない鍵を、アドレス順に返します。チェーン 20 のように、ジェネシスで staking.admission_by_vote を設定しているチェーンでは、新しい鍵を登録する Bond は、この一覧に含まれている必要があります。max は、台帳が同時に保持できる数です。このフラグのないチェーンでは admission_by_vote は false で、一覧は常に空になり、登録に投票は不要です。チェーン 20 は 2026-10-01 に "admitted": [] を返しました。

rand_getEpoch

パラメータは []。結果は { "epoch": 41, "epoch_blocks": 1000, "next_set": ["…", "…"] } です。next_set は予測値です。

rand_getSupply

パラメータは []。結果:

{ "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、slashed が動くのは、アグリゲーションチェーンのみです。faucet_epoch と faucet_minted_in_epoch は、staking.faucet_budget_per_epoch に対するファセットのエポックごとのカウンターです(チェーン 20 ではコンセンサス状態)。4 つの vesting_* フィールドはジェネシスのベスティングのカウンターで、vesting セクションのないチェーンではすべて "0" です。チェーン 20 がこれに当たります。program_rand_out と program_rand_held(v0.6.8、RPL-2。program_state セクションがなければ "0")は、invoke がプログラムのボールトからノートとして支払った RAND(プール側で、pool_value に含まれます)と、ボールトがなお保持している RAND(レジスタ側で、total_supply に含まれます)です。これは invoke の burn_r を通じて入ったため、プール側では burned に含まれます。registration_fees_burned は、ジェネシスの tokens.burn_registration_fee に基づいてバーンされたトークン登録手数料の合計(Σ)で、チェーン 20 はこれを設定しています。invariant_holds は、これを slashed とともに、チェーンが発行した量から差し引きます。この恒等式については供給量で説明しています。

rand_getEmission

パラメータは []。結果は { "inflation": "0", "subsidy": null, "faucet": true } です。inflation は固定の "0" です。subsidy はブロックアグリゲーションのスケジュール(current、base、halving_blocks、sealed_blocks、next_halving_at)で、aggregation セクションのないチェーンでは null です。チェーン 20 がこれに当たります。faucet は rand_status と同じ値です。

Bridge

4 つとも任意のチェーンで応答します。bridge セクションのないチェーンでは、状態は { "enabled": false }、レジストリは [] です。チェーン 20 のジェネシスにはこのセクションがあります。ガーディアンセット 1(guardian_set_index は 1)にはガーディアン 8 つと PQ ガーディアン 8 つ、一時停止鍵があり、ジェネシス時点の burn_sequence は 13、リプレイ下限(min_inbound_sequence)はソースチェーン 2、3、4 で 3、ソースチェーン 5 で 7 です。さらに、全バッキング合計で 24 時間ウィンドウあたり 4,000 zUSD というグローバルミント上限を持つブリッジの rules_v2 と、v0.6.8 で新設された 2 つのグループがあります。rotation(PQ ガーディアンまたは一時停止鍵のローテーションには、新しい鍵による所有証明が必要で、コミットから 86,400 秒後に有効になります)と fees(すべての入金の 10 bps とすべてのバーンの 10 bps を、財務アドレス宛の zUSD ノートとして Rand 上に保持します)です。チェーン 19 の burn_sequence は 8、下限は 1 と 4 で、どちらのグループもありませんでした。その tokens セクションには、1 RAND の registration_fee(バーンされます)、バッキングごとの mint_cap_per_day として 10000000000000(小数 8 桁で 100,000 zUSD)があり、zUSD 自体も掲載されています。zUSD はジェネシスでチェーン 14 から引き継がれたもので、アセット ID は同じ、インデックスは 1、バッキングは 7 つです。

rand_getBridgeState

パラメータは []。結果は { "enabled": false }、または次のとおりです。

{
  "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": [ … ]
}
fieldmeaning
emitterこのチェーンの送信側エミッターのアドレス。32 バイトの 16 進数
emittersソースチェーン ID → そこで信頼されるエミッターのアドレス
guardians現在のセットの 20 バイトアドレス(16 進数)
pq_guardiansPQ セット。Dilithium2 の公開鍵(1,312 バイト、16 進数)で、現在のガーディアンセットとインデックスが対応します(チェーン 20 ではセット 1)。すべての BridgeAttest は、このセットによるクォーラムの共同署名を持ちます。ガーディアンセットのローテーションでは変わらず、rules_v2 チェーンでの rotate_pq_guardians だけが変更します
mint_pausedtrue の間、すべての転送アテストは bridge minting is paused として拒否されます。バーンとローテーションは引き続き可能です
pause_nonce次の一時停止または再開が持つべき値。どちらも加算されます
list_nonce次の register_bridged_token または list_backing が持つべき値。どちらも加算されます
pause_keyミントを一時停止できる唯一の Dilithium2 鍵(16 進数)。できるのは一時停止だけで、再開には PQ ガーディアンのクォーラムが必要です
registration_feeRegisterBridgedToken がバンドル基本料金に上乗せして負担する額。RAND 単位、10 進数の文字列
burn_sequenceこれまでに送信されたアウトバウンドメッセージの数
rotation_nonce次の rotate_pq_guardians / rotate_pause_key が持つべき値
rules_v2グローバルミント上限とそのローリングウィンドウ。ブリッジルール v2 のないチェーンでは null。これが有効な場合、バッキングごとの上限もローリングウィンドウになり、ミントが一時停止されている間はリスティングが拒否されます。v0.6.8 以降は global_minted_in_window と global_mint_headroom(10 進数の文字列)も含みます
min_inbound_sequenceジェネシスのリプレイ下限。ソースチェーン ID → そのチェーンからの転送が持てる最小のシーケンス(通常の数値)。下限のないチェーン(チェーン 15 以前)では null。これを下回る bridge_attest は BelowReplayFloor として拒否され、これは恒久的な判定です。リレイヤーはこれを読み、このチェーンの分岐元のチェーンがすでにミントしたロックを破棄します
rotation_rulesv0.6.8:ジェネシスの bridge.rotation に由来する { "delay_secs", "needs_possession" }、または null。これが有効な場合、ローテーションは _v2 アクションとなり、新しい鍵の所有証明署名を伴い、有効になるまで delay_secs 待ちます
pending_rotationsv0.6.8:コミット済みでまだ有効になっていないローテーション。それぞれ { "kind": "pq_guardians", "new_pq_guardians", "effective_at_secs" } または { "kind": "pause_key", "new_pause_key", "effective_at_secs" }。rotation_rules がなければ null。現在の一時停止鍵で署名した cancel_rotation が、1 件を取り消します
feesv0.6.8:ジェネシスの bridge.fees に由来する { "mint_bps", "burn_bps", "recipient" }、または null(チェーン 14〜19)。チェーンは、すべての入金とすべてのバーンについて、そのバッキングのリリース単位の整数に切り捨てた割合を、recipient 宛の zUSD ノートとして保持します。入金はグロス額から手数料を引いた額が入金され、バーンの署名済み本文は、その額から手数料を引いた額をリリースします。ウォレットはこれを読んで自身の入金の価値を算出し、自身が recipient である場合は手数料ノートを再構築します
assetsrand_getAssets の各行

残高はありません。ブリッジされた価値はノートです。next_index はもうありません。ブリッジされたトークンは、登録時にすでに確定したインデックスでリスティングされてから入金できるため、予測すべきインデックスが残っていないからです。リスティングされたトークンのインデックスは、assets または rand_getTokens から読み取ってください。

rand_getAssets

パラメータは []。結果:ブリッジのアセットレジストリ。インデックスの昇順、または []:

[{ "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" }]

v0.6.8 以降、すべてのバッキング行(ここと、バッキングが返されるすべての場所、つまり rand_getBridgeState.assets、rand_getToken、rand_getTokens、rand_getTokenSupply の backings)には、minted_in_window(10 進数の文字列)と mint_window_secs(どちらも日次カウンターのチェーンでは null)、そして mint_headroom が含まれます。mint_headroom は、ヘッドのブロック時刻において各上限が許容する、そのバッキングへの最大入金額です。バッキングごとの上限から、すでにミントされた量を引いた値で、ルール v2 では、レジストリ全体のウィンドウの残りを超えません。mint_cap_per_day − minted_today ではなく mint_headroom を読んでください。後者はグローバル上限を無視しています。チェーン 20 のように、ルール v2 では minted_today はローリングウィンドウの集計値で、バッキングごとの上限が照合される数値です。以下の日次カウンターの説明は、チェーン 14 のものです。

バッキング(ソースコイン)ごとに 1 行あるため、7 つのバッキングを持つトークンは、1 つの index の下に 7 行になります。index は、そのアセットのノートが持つ asset ワードです。インデックス 0 は RAND で、レジストリには含まれません。decimals はバッキングのソース側の小数桁数です。locked、mint_cap_per_day、minted_today は、RAND ではなくトークン自身の小数 8 桁の単位による 10 進数の文字列です。mint_day は通常の整数で、UTC の日番号です。mint_cap_per_day はジェネシスの tokens.mint_cap_per_day で、ブロック時刻の UTC 1 日あたりに 1 つのバッキングがミントできる最大量です。minted_today は、ヘッドブロックの UTC 日(timestamp_ms / 86,400,000)である mint_day にそのバッキングがミントした量です。そのため、以前の日から残ったカウンターは、ヘッドが 0 時をまたぐと "0" と読めます。上限を超える入金は MintCapExceeded として拒否され、翌日に受け付けられるようになります。chain と token はガーディアンが署名対象とするワイヤ上の識別情報で、asset_id はその 2 つの blake3 で、rand_bridgeAssetId が計算するものです。

rand_bridgeAssetId

パラメータは [token_chain, token_address](整数、32 バイトの 16 進数)。結果:アセット ID、64 桁の 16 進文字。純粋な算術です。

rand_getBridgeBurn

パラメータは [sequence]。結果は null または { "sequence": 0, "body_hex": "…", "digest": "…", "tx": "…", "height": 2, "amount": "…", "release_amount": "…", "fee": "…" } です。

最後の 3 つは v0.6.8 で追加され、すべてのチェーンにあり、トークンの小数 8 桁の単位による 10 進数の文字列です。release_amount は署名済み本文が持つ額で、body_hex 自体から読み取ります。ソースコントラクトがリリースする額であり、そこから本文のリレイヤー手数料が支払われます。fee はチェーンが財務ノートとして保持したブリッジ手数料で、amount はバンドルがバーンした額、つまり release_amount + fee です。bridge.fees のない場合(チェーン 14〜19)、fee は "0" です。チェーン 20 のシーケンス 13、0.999 zUSD のバーン:"amount": "99900000"、"fee": "99900"、"release_amount": "99800100"。

Tokens (RPL)

RPL トークンレジストリ:ブリッジされたトークンとネイティブトークンのすべてです。標準についてはトークンで説明しています。

rand_getTokens

パラメータは [from_index, limit]、どちらも省略可能(0 と 1000。limit は 1,000 に制限されます)。結果:from_index から始まるインデックスの昇順のレジストリで、そのインデックスから範囲指定で読み取ります。

{ "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 }
  ] }

On a chain without a tokens section: { "enabled": false, "tokens": [] }. index は、そのトークンのノートが持つ asset ワードです(0 は RAND で、一覧には載りません)。id はトークンのアセット ID、id_text はチェックサム付きのテキスト形式です。32 バイトの ID に対する bech32m で、HRP は rpl、62 文字です。authority は次のいずれかです。

kindその他のフィールド
none— (供給量固定、または放棄済み)
keykey, address
bridgebackings: [{ "chain", "token", "decimals", "locked", "mint_cap_per_day", "minted_today", "mint_day" }]。rand_getAssets のフィールドで、裏付けごとに 1 行
programprogram

供給量、locked、mint_cap_per_day、minted_today、registration_fee は 10 進数の文字列です(registration_fee は RAND 単位、それ以外はトークン単位)。next_index、mint_day、max_tokens は数値です。max_tokens はレジストリのジェネシス時点の上限で(chain 20 では 4,096。上限がない場合は null)、これを超える登録は RegistryFull として拒否されます。burn_registration_fee は、登録手数料をプロポーザーに支払うのではなくバーンするかどうかを示します。bound_note_value は、2⁶³ 以上の mint または入金を有効性ルールとして扱うかどうかを示します(受け入れ時の拒否は、どのチェーンでもこの設定に関係なく行われます)。3 つとも chain 20 で設定されています。limit より短いページが最後のページです。

program authority({ "kind": "program", "program": "<id>" })を登録できるのは、chain 20(v0.6.8)のように program_state セクションを持つチェーンだけです。トークンの供給量は 0 から始まり、そのプログラムの invoke だけが mint または burn できます。

ウォレットはトークン ID を、rand_getToken ではなくこの一覧を通じて解決します。送金のアセットはチェーン上で秘匿されており、レジストリ全体を読むコストは、どのトークンが対象でも変わらないためです。

rand_getToken

パラメータは [token] です。レジストリのインデックス(数値または 10 進数の文字列)、64 桁の 16 進数 ID(0x の有無、大文字小文字は問いません)、または rpl1… のテキスト形式(すべて小文字またはすべて大文字)を指定します。結果はそのトークンの rand_getTokens の行、または null です。不正な ID(チェックサムの誤り、別の HRP、長さの誤り、大文字小文字の混在、16 進数でないもの)は -32602 となるため、入力ミスが別のトークンに解決されることはありません。トークン単位の照会は、呼び出し元がどのトークンに関心を持っているかをノードに知らせてしまいます。エクスプローラーや単発の読み取り向けです。

rand_getTokenSupply

パラメータは [token] で、形式は同じです。結果は null、または次のとおりです。

{ "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 は空です。ブリッジされたトークンでは、locked の合計が total_supply に一致します。プライバシーに関する注意は rand_getToken と同じです。

ブロックアグリゲーション(chain 20 では無効)

これらは、ジェネシスに aggregation セクションを持つチェーン向けにノードに実装されています。chain 20 ではレジスターは空で、アンシールされるものはありません。

メソッドパラメータ結果
rand_getAggregate[hash]シールするアグリゲートの covers、aggregator、subsidy、proving_share、n、height。それ以外のトランザクションでは null
rand_getAggregators[]アグリゲーターのレジスター。行ごとに address、bond、payout、nonce、unbonding
rand_getUnsealed[from, limit]{ "bundles": [{ "hash", "height", "excess" }], "next_from" }。アグリゲーターがまだカバーできるバンドル

Aggregate は、他のものと同様に rand_sendTransaction で送信します。

ジェネシス・ベスティング(chain 20 では無効)

これらは、ジェネシスに vesting セクションを持つチェーン向けにノードに実装されています。現時点でそのようなチェーンはなく、chain 20 ではどれも { "enabled": false } を返します。パブリックエンドポイントは 2026-10-01 からこれらを転送しています。

メソッドパラメータ結果
rand_getVesting[id] または [id, at_ms]。エントリーの 64 桁の 16 進数 IDエントリー。そのクラス、受益者、スケジュール(amount、start_ms、cliff_ms、linear_ms、step_ms)、請求済み・取り消し済み・ボンド済みの量、および as_of_ms(デフォルトではヘッドブロックの時刻)時点の vested_now、claimable_now、unvested_now。未知の ID では null。v0.6.8 以降、取り消し可能なエントリーは revokers、取り消しに必要なそれらの threshold、取り消しの支払先となる treasury を列挙し(単一の revoker に代わるものです)、エントリーには revoke_nonce と locked_now が含まれます
rand_getVestingSummary[]{ "enabled": true, "height", "as_of_ms", "entries", "issued", "released", "locked", "classes": [ … ] }。クラスごとの合計で、鍵や所有者は含まれません
rand_getVestingSchedule[from_ms, to_ms, step_ms]。最大 1,000 ポイント{ "enabled": true, "issued", "points": [{ "t_ms", "locked" }] }。レジスターのロック済み合計の時間推移

金額は 10 進数の文字列です。4 つのベスティングアクションは rand_sendTransaction で送信します。

サブスクリプション(WebSocket)

ws://127.0.0.1:8545/ または /ws。このソケットが扱うのは rand_subscribe と rand_unsubscribe だけで、それ以外には -32601 を返します。トピックは 3 つあり、互いに独立したストリームで、ストリーム間の順序は保証されません。

  • newHeads — rand_getHead と同じ形式で、コミットされたブロックごとに 1 回、順序どおりに送られます(同期中も同様です)。ここでの view はブロック自身のビューです。
  • receipts または receipts <program_id> — 一致する呼び出しレシートを 1 件以上含むコミット済みブロックごとに 1 件の通知: { "height", "hash", "receipts": [ … ] }。各レシートは rand_getReceipt と同じ形式です。
  • transaction <hash> — 通知は 1 件で、その後ノードがサブスクリプションを削除します。{ "status": "committed", "height", "index" }、またはトランザクション自身のバイト列に起因する拒否の場合は { "status": "rejected", "reason" } です(rand_getTransactionStatus にも同じ制限があります)。状態に依存する拒否は通知されないため、タイムアウトと組み合わせてください。
{ "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 } } }

上限: ノードあたり 64 接続(65 番目はアップグレード時に 503 で拒否されます)、接続あたり 8 サブスクリプション、クライアントフレームあたり 64 KiB、30 秒ごとの ping に 5 秒以内の応答が必要、ストリームあたり 256 エントリーのバックログ。購読中のストリームでそれ以上遅れたサブスクライバーはバッファされず、コード 1008 で切断されます。再接続して、rand_getCompactBlocks(ヘッド)、rand_getReceipts(レシート)、rand_getTransactionStatus(トランザクション)で欠落分を補ってください。アップグレードヘッダーのない通常の GET / には 400 を返します。

エラー

コード意味
-32601未知のメソッド(廃止されたアカウントメソッドを含む)
-32602パラメータが不正、または不足している
-32000拒否: メンプールが拒否したトランザクション、レート制限された faucet 呼び出し、10 秒を超えて待機したウィットネス構築、30 秒を超えた読み取り、パブリックリスナーが提供しないメソッド、または上限を超えたサブスクリプション
-32001参照されたオブジェクトが見つからない
-32010プルーニング済み: このノードの保持下限より下の高さ。data.floor にその下限が入ります(下記参照)
-32603内部エラー
-32600不正なリクエスト: 本文がサイズ上限を超えている、JSON ではない、バッチの形式が不正、または通知である
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32000, "message": "…" } }

rand_sendTransaction では、トランザクションに対する判定になるのは -32000 と -32602 だけです。それ以外のコードの後では、トランザクションの行方は不明です(rand_sendTransaction を参照)。

プルーニングされたノード: エラー -32010

--prune-history <window> で起動したノードは、台帳全体(ノート、ナリファイア、アンカー、レジスター)を保持しますが、ブロック、トランザクション、レシートは直近の <window> 分だけです。rand_status.prune_floor は、ノードがまだ保持している最も低い高さです。chain 20 では、26 台のバリデーターのうち 24 台が --prune-history 24h で動いています。2 台のアーカイブはこのフラグなしで動き、すべてのブロックを保持しており、パブリックエンドポイントはそのうちの 1 台に転送します。

  • 高さ指定で、下限より下の場合(ジェネシスを除く): rand_getBlockByHeight、高さ指定の rand_getFinality、および下限より下に及ぶ rand_getBlocks、rand_getCompactBlocks、rand_getReceipts の範囲指定は、-32010 pruned: height h is below this node's retention floor f と data: { "floor": f } を返します。アーカイブに問い合わせてください。[0, 0] はこれまでどおりジェネシスを返します。
  • ハッシュ指定の場合: rand_getBlockByHash、rand_getReceipt、rand_getRawTransaction、rand_getCallEnvelope、rand_getAggregate は、プルーニングされたハッシュに対して、存在しなかったハッシュと同様に null を返します。両者を区別できるのはアーカイブだけです。rand_getTransaction と rand_checkTransaction も null を返し、-32010 を返すのは、下限より下の高さを示すロケーション行が残っている場合に限ります。rand_getTransactionStatus は、プルーニングされたノードでは unknown のすべてのエントリーに floor を追加します。
  • ウォレットのスキャンには影響しません: rand_getCommitments、rand_getNullifiers、rand_getAnchor とウィットネス系メソッドは、プルーニングされないファミリーを読み取ります。

ワイヤー上のトランザクション

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

bincode のデフォルト設定です。固定幅の整数、8 バイトの長さプレフィックス、宣言順の u32 の enum タグを使います。5 つのアグリゲーションのバリアントは、enum 内で BridgeBurn の後、RegisterToken の前に置かれます(Transactions)。chain 20 はこれらも、4 つのベスティングのバリアントも、SlashEquivocation も受け入れませんが、タグ番号をハードコードするエンコーダーでも、これらを数えに入れる必要があります。

バンドルの最後の 2 つのフィールドは、v0.6.3 と chain 17 で加わりました。bincode は位置ベースのため、chain 16 以前向けに書かれたエンコーダーでは、このチェーンがデコードできるトランザクションを生成できません。これに伴いすべてのトランザクション ID も変わりました。ID のドメインは現在 rand-txid-3 で、auth_commit と認証証明のダイジェストを束縛します。ID をローカルで再計算するクライアントは、これに合わせて更新する必要があります。chain 20 では、自己証明か委任かを問わず、すべてのバンドルが認証証明を持ちます。v0.6.8 は Transaction と Bundle のレイアウトを変更せず、アクション 28 から 33 を追加します。

すべてのトランザクションが運ぶバンドルは最大で 1 つです。Bond は、burn_r が amount に等しく、burn_a と burn_asset が 0 のバンドルを運びます。BridgeBurn と TokenBurn はバンドルを通じてバーンします。burn_asset はアクションの asset でなければならず(0 は不可)、burn_a はアクションの amount、burn_r は 0 とし、fee はスロット 2〜3 から RAND で支払われます。それ以外のアクションはトークンをバーンしません。RAND がバーンされるのは常に burn_r を通じてのみであり、burn_asset が 0 で burn_a が 0 以外のバンドルは、どこでも拒否されます。BridgeAttest の r は選択するものではなく導出されます。承認(admission)には、ガーディアンが署名したダイジェストに対する blake3("rand-deposit-r-1" ‖ mu) が必要で、それ以外の値は拒否されます(WrongDepositBlinding、恒久的な拒否)。ブリッジされたトークンは、ジェネシス時、または RegisterBridgedToken / ListBacking によって、そのアテステーションが受理される前に登録されている必要があります。未登録のコインのアテステーションは UnlistedToken として拒否されます。

すべてのバンドル証明は、それが載るトランザクションに対して作成され、そのトランザクションに対して検証されます。対象は、証明を空にしたトランザクション全体で、チェーン ID に、またチェーン 20(binding_domain: 1)ではジェネシスハッシュにも、新しいタグの下で束縛されます。チェーン 14〜19 では束縛はチェーン ID のみだったため、チェーン 19 向けに作成された証明はチェーン 20 では検証に通らず、v0.6.8 より古いウォレットはチェーン 20 へ送金できません。チェーン 18〜20 では、2 つの証明を除いたバンドルは 7,936 バイト、同じく証明を除いた転送トランザクションは 7,949 バイトにエンコードされます(チェーン 14〜16 では 5,848 バイトと 5,861 バイトで、エンベロープは 1,348 バイト、認可フィールドはありません)。ワイヤ上の転送は本番プロファイルで約 2.85 MB で、そのほぼすべてが証明です。バンドル証明が約 1.49 MB、認可証明が約 1.36 MB です。分割認可の導入前は約 1.43 MB でした。

fullnode のコミット c0878c3f(チェーン 21)に対して 2026-10-12 に最終確認しました。 コードとこのページが食い違う場合は、コードが正です。お知らせください。