このページは、rand_getSupply を正しく読み解き、発行について考えるためのものです。RAND がどこから来てどこへ行くのか、そしてシールドチェーンではノートを合算できないにもかかわらず供給量が正確になる恒等式を扱います。
RAND の出入り
シールドチェーンは、自身の資金を合算できません。ノートの価値はコミットメントの内部にあるためです。公開されているのは、プールの境界を越えるすべての出入りです。出入りには 5 種類あり、プログラムボールト(RPL-2、チェーン 20)を持つチェーンでは 7 種類になります。
| 方向 | 境界の通過 | 時期 |
|---|---|---|
| 入 | ジェネシスの預入ノート(ジェネシスファイルの alloc。チェーン 14 以降は開示) | ブロック 0 |
| 入 | faucet の mint(Mint。最大 100 RAND、バリデータの署名付き。チェーン 14 以降はノートのオープニングを伴う) | "faucet": true の testnet チェーン。チェーン 20 では許可リストに載った 16 のウォレットにのみ、ジェネシスに登録された 18 の minter のいずれかの署名で、1,000 ブロックのエポックごとに最大 10,000 RAND |
| 入 | バリデータの Withdraw。解放されたステークと報酬をノートに支払う | 随時 |
| 出 | バンドルの fee。ブロックプロポーザの rewards へ | すべてのバンドル |
| 出 | バンドルの burn_r:ステークをバリデータの公開 stake へバーンする Bond | すべての bond |
| 出 | Invoke の burn_r:プログラムの公開ボールトに預け入れられる RAND | チェーン 20、v0.6.8 以降 |
| 入 | ボールトからの支払い:Invoke がプログラムのボールトからノートとして支払う RAND。金額と受取人は公開 | チェーン 20、v0.6.8 以降 |
ジェネシスで tokens.burn_registration_fee が設定されているチェーン(チェーン 20 もそうです)では、トークン登録の 1 RAND の registration_fee も burned を通ってプールから出ますが、どのレジスタのエントリにも入りません。これは破棄され、プロポーザが受け取るのはバンドルの基本料金だけです。
プールの隣にはバリデータレジスタがあり、金額を平文で保持します。コンセンサスの重みは公開でなければならないためです。レジスタ内のステークは実在の RAND であり、unbond してノートへ withdraw し戻すことができます。チェーン 20 ではプログラムボールトが、その隣にある 2 つ目の公開残高です。invoke が預け入れた RAND は、支払いによってノートとしてプールに戻されるまで、そこで計数可能なまま残ります。
チェーン 20 にはブロック報酬もインフレーションもありません。このチェーンで最初に予定されている発行は、ブロック集約の補助金です。これは封印されたブロックごとに新しい RAND を逓減する量で発行し、そのブロックを証明対象に含めたアグリゲータに支払われるもので、チェーン 20 では有効になっていません(Proofs)。チェーン 20 は新しいチェーンで、2026-10-01 の 06:17 UTC に稼働を開始し、チェーン 19(fullnode v0.6.8、ハードフォーク)から切り出されました。そのジェネシスでは 31,184.243719258 RAND が発行されました。内訳は、26 のジェネシスバリデータにステークされた 26,000 と、7 つの預入ノートにある 5,184.243719258 で、後者はチェーン 19 から引き継いだ 7 つのオペレータウォレットの残高です。チェーン 19 で他のウォレットが保有していた約 519.9 RAND(許可リストの受取人への faucet mint、ユーザーへの支払い)は引き継がれませんでした。ノートは所有者のアドレスなしには再作成できないためです。引き出されていないバリデータ報酬 0.499 RAND も引き継がれていません。ジェネシスのノートはさらに 2 つあり、合計で 9 つです。これらはブリッジの 99 zUSD(10 と 89)を保持しており、RAND ではないため、この監査の対象外です。チェーン 20 の rand_getSupply は、genesis_deposited が 5,184,243,719,258 ユニット、invariant_holds: true を返します(高さ 3,037、2026-10-01)。同日にチェーン 18 の高さ 141,935 のスナップショットから切り出されたチェーン 19 では、31,294.644359629 RAND が発行されました。同じ 26,000 のステークと、7 つのノートにある 5,294.644359629、そして 10 zUSD のノート 1 つです。以後の faucet mint はすべて発行額に加算され、バーンされた登録手数料はすべて発行額から差し引かれます。2026-09-26 に切り出されたチェーン 15 は、ジェネシスで 23,000 RAND を発行しました。18 のバリデータにステークされた 18,000 と、5 つのノートにある 5,000 です。その後の 8 つのバリデータは既存のノートから bond したため、新たな発行はありません。
トークンはこの監査の対象外
上記の出入りは RAND のものです。RPL トークンは、ブリッジされたものもネイティブのものも、RAND の境界を越えることはありません。アセットインデックス 0 は RAND に予約されており、トークンレジストリがこれを割り当てることはないため、BridgeAttest、TokenMint、登録時の初期 mint は常に別のアセットのノートを預け入れ、BridgeBurn や TokenBurn の burn_a は常にそのようなノートを破棄します(burn_a による RAND のバーンは拒否されます)。fees_paid と burned はバンドルの fee と burn_r のみから計上され、プール内のトークン転送はカウンタを一切動かしません。そのアセットは公開されてさえいないためです。チェーン 20 では、Invoke が burn_a を通じてトークンを取り込むこともできます。プログラムのボールトへ入れる場合(deposit)は供給量が変わらず、破棄する場合(burn)はプログラム自身のトークンに限られます。ブリッジの手数料ノート(チェーン 20、zUSD の預入とバーンごとに 10 bps、トレジャリーアドレス宛て)は zUSD であり、RAND ではありません。発行され、裏付けられているため、預入の裏付けと供給量はグロス額で増え、バーンではそれらは amount − fee だけ減ります。トークン自身の供給量はレジストリの公開カウントです。rand_getTokenSupply は total_supply を返し、ブリッジされたトークンについては各バッキングの locked 額も返します。これらの合計が供給量になります(RPL tokens)。
監査の恒等式
ユニット単位(1 RAND = 10⁹)の 6 つの単調増加カウンタ、破棄された量を記録する 2 つ、そしてチェーン 20 ではプログラムボールト用の 2 つがあります。
| カウンタ | 合計対象 |
|---|---|
genesis_deposited | ジェネシスファイルの alloc 預入ノート |
genesis_staked | ジェネシスがレジスタに最初に入れたステーク |
faucet_minted | 受理されたすべての Mint |
withdraw_deposited | 受理された Withdraw が作成したノート(それぞれ amount − 0.001 RAND) |
fees_paid | すべてのバンドル手数料 |
burned | すべてのバンドルの burn_r(Bond のステーク、チェーン 20 では invoke のボールトへの預入)と、バーンされたすべての登録手数料 |
slashed | スラッシュされたアグリゲータのボンド(ブロック集約。無効の間は 0) |
registration_fees_burned | tokens.burn_registration_fee のもとでバーンされた登録手数料。burned にも含まれる |
program_rand_out | プログラムボールトが支払った RAND ノート(RPL-2。program_state セクションがなければ 0) |
program_rand_held | ボールトがなお保持している RAND。すべての invoke の burn_r から program_rand_out を引いたもの。これは burned を通って入ったので、そのカウンタのボールト側にあたる |
pool_value = genesis_deposited + faucet_minted + withdraw_deposited + program_rand_out − fees_paid − burned
register_total = Σ over the register of (stake + pending + rewards)
total_supply = pool_value + register_total + program_rand_held
issued = genesis_deposited + genesis_staked + faucet_minted
invariant: total_supply == issued − slashed − registration_fees_burned
pool_value は入った量から出た量を引いたものです。これはノートの合計と同じ数値ですが、誰も計算することはできません。withdraw の基本料金 0.001 RAND は境界の通過ではありません。これはあるレジスタ行からプロポーザの行へ移るだけで、境界を越えたのはノートだけです。invariant_holds が false になるのは、コンセンサスのバグかデータベースの破損であり、正当な状態では決してありません。プログラムに関する 2 つの項は、プログラムボールトのないチェーンではゼロなので、そこでは恒等式はチェーン 19 のものと同じです。ジェネシスの vesting セクションは、どのチェーンにもまだありませんが、同じ方法で 3 つ目の公開レジスタを加えることになります(JSON-RPC)。
2,000 を預け入れ、4,000 をステークしたチェーンで、1,000 RAND の bond と withdraw を 1 回ずつ行った場合を順に追います。
| 時点 | burned | withdraw_deposited | fees_paid | pool_value | register_total | total_supply |
|---|---|---|---|---|---|---|
| ジェネシス | 0 | 0 | 0 | 2,000 | 4,000 | 6,000 |
| 1,000 の bond(手数料 0.001) | 1,000 | 0 | 0.001 | 999.999 | 5,000.001 | 6,000 |
| その unbond | 1,000 | 0 | 0.001 | 999.999 | 5,000.001 | 6,000 |
| その 1,000 の withdraw | 1,000 | 999.999 | 0.001 | 1,999.998 | 4,000.002 | 6,000 |
読み方
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_getSupply","params":[]}'
{ "height": 1998,
"genesis_deposited": "2000000000000", "genesis_staked": "4000000000000",
"faucet_minted": "0", "withdraw_deposited": "999999000000",
"fees_paid": "1000000", "burned": "1000000000000",
"slashed": "0", "registration_fees_burned": "0",
"pool_value": "1999998000000", "register_total": "4000002000000",
"total_supply": "6000000000000", "invariant_holds": true }
すべての金額はユニットの 10 進文字列です。JSON の数値は 2⁵³ を超えると正確な整数ではなくなるためです。完全なオブジェクトには、ここに示したもの以外にも多くのフィールドがあります。たとえば、faucet のエポックごとの組 faucet_epoch と faucet_minted_in_epoch(チェーン 20 はこれを予算と照合します)、program_rand_out と program_rand_held(v0.6.8 以降)、そして vesting セクションを持たないチェーン 20 では "0" を返す 4 つの vesting_* カウンタがあります(JSON-RPC)。エクスプローラは同じオブジェクトを GET /supply で、主要な数値を GET /stats で提供しています。
どこまで正確か
チェーン自身が行ったすべてについて、カウンタは正確です。各カウンタは、そのアクションを適用するコードパスの中で、アクション自身の公開フィールドから加算されます。
2 つの項目はこれまで主張に依拠していましたが、チェーン 14 はその両方を検査に変えます(audit v3、POOL-1):
- faucet の
Mintはノートのオープニングを持ちます。cmとamountに加えて、このアクションはpk、time、rを公開します。アドミッションでは(pk, no sender, amount, asset 0, time, r)のコミットメントを再計算し、一致しない場合はthe mint's commitment does not open to its published note and amountとして拒否します。またtimeをバンドルのウィンドウ内に収めます。ミンターは 7 つのフィールドすべてにドメインrand-mint-2で署名します。従来は、バリデータがある金額を公開しながら、別の金額のノートを封印できました。その代償として、withdraw のペイアウトと同様に、faucet ノートの所有者pkは公開されます。rand_mintのパラメータは変わりません。 - genesis の
allocノートもオープニングを持ちます。tokensセクションを持つチェーンでは、すべての行が{ cm, envelope, amount, opening: { pk, time, r } }の形になります。ノードはコミットメントを再計算し、オープニングが一覧にあるトークンのassetを指定していない限り asset 0 として扱い、cmが一致しない genesis ファイルを拒否します。genesis_depositedに数えられるのは asset 0 の行だけです。不透明なcmは、genesis の作成者が、どのアセットのものであれ裏付けのないノートを、誰にも検証されることなくプールに入れられる唯一の方法でした。したがって、ファイルが公開された時点で、genesis ノートの所有者と金額は設計上公開されます。非公開のままなのは、そのノートがいつ、何に対して使われるかだけです。rand-node genesisは常にオープニングを書き出します。
tokens セクションなしで作成されたチェーンでは、従来のルールが引き続き適用されます。genesis_deposited は、宣言された amount フィールドの合計であり、genesis ファイルを信頼して採用します。いずれの場合も、2 つの genesis の金額は genesis ハッシュに含まれるため、すべてのノードが同じ値で合意します。
カウンタは意図的にコンセンサス状態に含めていません。ステートルートはカウンタをハッシュしません。rand-node verify --mode quick は、チェーンをリプレイしてすべてのカウンタを再計算し、保存済みスナップショットと食い違う場合は不一致を報告します。