このページは、トランザクションの手数料を設定するとき、デプロイやコールの費用を見積もるとき、バリデータへの支払いを理解するときに使います。手数料は RAND 建ての下限です。コール以外のすべてのアクションは定額を支払います。chain 20 のコールは、証明が宣言するガスリミットとそのバイト数に対して支払います。価格はブロックの埋まり具合に応じて動き、上限で止まります。
下限
手数料の単位は 10⁻⁹ RAND です。定数は randprotocol_core::gas にあります。
| トランザクション | 下限 | 現在の値 |
|---|---|---|
あらゆるバンドル: RAND または任意の RPL トークンの送金、ボンド、ブリッジデポジット(BridgeAttest、リレイヤーが支払う)、TokenMint、SetAuthority、TokenBurn、ListBacking | BUNDLE_BASE = 1,000,000 units | 0.001 RAND |
| Deploy | BUNDLE_BASE + DEPLOY_PER_WORD(100,000)×(プログラムのワード数 + パブリックワード数) | 256 ワードのプログラム: 0.0266 RAND。4,096 ワードのプログラム: 0.4106 RAND。パブリック入力 27,151 ワードを伴う 65,096 ワードの SPL Token イメージ: 9.2257 RAND(chain 13 でデプロイ、2026-09-19)。chain 16(hardening_v6、chain 20 を含む)以降は、どのコールも保持できないデプロイは ProgramUncallable として拒否されます。パブリック入力のないプログラムでは 8,180 ワードを超えるもの、パブリック入力を伴うプログラムではそれより少ないワード数でも拒否されます。このイメージは chain 20 では拒否されます |
| Call | genesis に gas セクションを持つチェーン(chain 18 および 19 と同じく chain 20): BUNDLE_BASE + gas_price × コールの証明が宣言するガスリミット + byte_price × コールの証明と入力エンベロープの各 KiB(端数の KiB も 1 KiB として数える)、0 バイト目から。Gas on chain 18 を参照。このセクションを持たないチェーン: BUNDLE_BASE + call_fee(tier)。ここで call_fee = CALL_BASE(1,000,000)+ tier 10 を超える 2 tier ごとに 100,000 に加え、コールの証明と入力エンベロープが無料枠の 2,097,152 + 18,432 バイトを超える分について 1 KiB(端数の KiB も 1 KiB として数える)あたり 1,000 units | chain 20、開始時の価格 100 と 800 units の場合: tier の上限である 20,479 ガスを宣言し、証明とエンベロープが 1,350,000 バイトの tier 14 のコールの下限は 0.0041 RAND です。ウォレットの既定値はこれより多く支払います(後述)。gas セクションのない chain 15 の場合: tier 10: 0.002、tier 14: 0.0022 RAND(無料枠内)。v0.5.6 以降、tier 14 を超えるコールは支払額にかかわらず拒否されます(MAX_CALL_TIER)。chain 13 で 2026-09-19 に行われた ERC-20 の approve コール(tier 16、証明 3,412,405 バイト)は 0.00357 RAND を支払いましたが、v0.5.6 以降のどのチェーンでも拒否されます |
| Invoke(RPL-2、chain 20) | コールの下限に加え、遷移が作成するセル(ゼロ以外の値が書き込まれ、それまで何も保存されていなかったセル)ごとに genesis の program_state.cell_fee を加算。セルの書き換えや削除では何も加算されません | chain 20 の cell_fee は 0.01 RAND です。上記の tier 14 のコールが 2 つのセルを作成する場合、下限は 0.0241 RAND です |
| BridgeBurn | BRIDGE_BURN_FEE = 10 × BUNDLE_BASE: 基本料金にブリッジ自身の課金を加えたもので、どちらもバーンが持つ 1 つのバンドルから支払われます | 0.01 RAND。chain 20 ではブリッジがバーンされた zUSD の 10 bps も受け取ります(後述) |
| RegisterToken, RegisterBridgedToken | BUNDLE_BASE + トークンレジストリの registration_fee(genesis パラメータ) | chain 20: 0.001 + 1 RAND = 1.001 RAND。うち 1 RAND はバーンされます |
| Mint(faucet)、Unbond | 0。バンドルなし、バリデータが署名 | — |
| PauseMints、UnpauseMints | 0。バンドルなし。pause key または PQ ガーディアンのクォーラムが承認するため、RAND を持たないウォレットからでも一時停止できます | — |
| Withdraw | ワイヤ上は 0。基本料金 0.001 RAND は引き出し額から差し引かれます | 1,000 RAND の引き出しは、999.999 のノートを作成します |
手数料はバンドルのパブリックワードであり、常に RAND です。hidden-asset バンドルのゲストは、これを RAND グループの残高関係 in₂ + in₃ = out₂ + out₃ + fee + burn_r(スロット 2〜3)に結び付けます。そのため手数料は、どのノートかを明かすことなく秘匿ノートから支払われます。トークンは同じバンドルのスロット 0〜1 を、独自の関係 in₀ + in₁ = out₀ + out₁ + burn_a のもとで移動します。したがって 1 つの証明でトークンを移動し、その RAND 手数料も支払えます。トークンを持っていても使用可能な RAND を持たないウォレットは、証明の生成前に拒否されます。
ブリッジの課金がバーンにかかるのは、バーンが、送信者が確実に RAND を持っている唯一のブリッジトランザクションだからです。デポジットは基本料金のみを支払います。デポジットする側はまだ RAND を持っていないためです。登録手数料は fee_floor の一部ではなく台帳上の事実なので、アクション自身の規則(RegistrationFeeTooLow)で検査されます。これは、コールの証明がデコードされた後に、コールのガスまたは tier の部分が課金される仕組みと同じです。コールの下限は 2 回検査されます。コールが宣言する内容は、証明が検証されて初めて信頼できるためです。chain 20 では、検証前に行う 1 回目の検査で、コールのバイト数と宣言リミット 1 を価格付けします(Invoke はここでセル手数料も負担します)。2 回目の検査では、検証済みの証明が宣言するリミットを価格付けします。gas セクションのないチェーンでは、この 2 つは BUNDLE_BASE + CALL_BASE と tier に正確に対応する下限です。
推測せず、ノードに問い合わせてください。
rand fee bundle # 0.001 RAND
rand fee deploy 256 # 0.0266 RAND
rand fee call 14 --gas 20479 --bytes 1350000 # 0.0041 RAND at chain 20's starting prices
→ {"method":"rand_estimateFee","params":[{"kind":"call","tier":14,"gas":20479,"bytes":1350000}]}
← "4103100"
この答えは、開始時の価格では 1,000,000 + 100 × 20,479 + 800 × 1,319 です。ノードは、問い合わせ時点のチップの価格で価格付けします。chain 20 では、コール仕様の gas フィールドは JSON-RPC で必須です(指定しない場合は -32602)。--gas を付けない rand fee call <tier> はその tier の上限を送り、--bytes を付けない場合はバイトを価格付けしません。invoke も同様に価格付けされ、"kind":"invoke" と "created_cells": c を指定すると c 個のセル手数料が加算されます(上の例で 2 つのセルを作成する場合は 24103100。2026-10-01 に chain 20 へ問い合わせた値)。gas セクションのなかった chain 15 では、rand fee call 14 は 0.0022 RAND と答えました。
ウォレットの既定値は下限そのものです。ただし chain 20 のコールの既定値は余裕を上乗せします(後述)。rand send --fee <RAND> と、bond、call、bridge-mint、bridge-burn(既定値 0.01)および token サブコマンドの --fee フラグで、下限を引き上げられます。下限を超える分はチップです。
Gas on chain 18
chain 18 は 2026-09-29 から 2026-10-01 まで稼働した、最初のガス計量チェーンでした。chain 19 は同じビルドでの re-genesis で、同じ gas セクションを持っていました。chain 20(v0.6.8)はこのセクションのすべての規則を引き継ぎ、2 つの価格上限と、支払い対象のバイトだけを数えるバイト負荷を追加します(後述)。gas セクションのないチェーンは、上の表の tier スケジュールを使い続けます。
何を数えるか。 1 ガスは zkVM の cpu テーブルの 1 行です。そのため通常の命令は 1 です。それ以外のコストはシステムコールだけです。
| 操作 | ガス |
|---|---|
任意の命令、HALT、WRITE_OUTPUT、READ_INPUT、READ_PUBLIC | 1 |
n ワードに対する POSEIDON2 | 3 + 3 × ⌈n/4⌉(各 absorb 行のコストは 3) |
SHA256、1 回の compression | 64 |
KECCAK、1 回の permutation | 192 |
宣言されるリミット。 コールの証明は、従来より 1 つ多いパブリック値 GAS_LIMIT を持ちます。回路(制約セット 8)は、実行のガスがそれ以下であることを証明します。正確なガスは非公開のままです。証明自身のヘッダーが示す上限を超えるリミットは、検証鍵が構築される前に拒否されます。
gas_max = (2ᵗ − 1) + 2^(t−2) + 191 × (keccak rows / 32) + 63 × (sha256 rows / 64)
これは、どちらのハッシュテーブルも使わないコールでは、tier 10 で 1,279、tier 12 で 5,119、tier 14 で 20,479 になります。
下限。 台帳は、ブロックの開始時に有効な価格で、宣言されたリミットとバイト数に課金します。
fee ≥ BUNDLE_BASE + gas_price × gas_limit + byte_price × ⌈bytes / 1024⌉
bytes はコールの証明に入力エンベロープを加えたものです。このようなチェーンでは、tier スケジュールとその無料枠は適用されません。プールはブロックと同じものを要求し、それより安いコールは FeeTooLow として拒否します。
バンドルと認可証明は、固定されたリミットを宣言します。 すべてのバンドル証明は、genesis の bundle_gas_limit である 20,479(tier 14 の上限)をそのまま宣言しなければならず、そうでなければトランザクションは BundleGasLimit として拒否されます。chain 20 は chain 17 以降のすべてのチェーンと同様に split authorisation で動作するため、すべてのバンドルは tier 10 の認可証明を持ち、それは 1,279 を宣言しなければなりません(AuthGasLimit)。どちらも課金ではありません。送金、ボンド、デプロイは、上の表のとおり定額の下限を支払います。ウォレットは両方の値を自分で宣言します。
価格は動きます。 chain 20 の gas セクションには dynamic コントローラーがあり、gas_price と byte_price は台帳の状態であり、state root にコミットされます。ブロックごとに 1 回、そのトランザクションの後で、ブロックが目標に対してどれだけ埋まっていたかに応じて、それぞれが動きます。
price' = min(max_price, max(min_price, price + ⌊price × adjust_bps × (used − target) / (10,000 × target)⌋))
used は目標の 2 倍で頭打ちになるため、adjust_bps は 1 ブロックがどちらの方向にも動かせる最大幅です。max_price は genesis の上限で、chain 18 と 19 にはありませんでした。byte_price はブロックの支払い対象バイトに従い(後述)、gas_price は、コールと invoke の宣言リミットの合計に、バンドル 1 つにつき 20,479 を加えたものに従います。
chain 20 の gas セクション | 値 |
|---|---|
ジェネシス時の gas_price、byte_price | 1 gas あたり 100 ユニット、1 KiB あたり 800 ユニット |
min_gas_price、min_byte_price | 100、800。つまり開始価格がそのまま下限になります |
max_gas_price、max_byte_price | 10,000、80,000。上限で、下限の 100 倍です(chain 20 で新規) |
byte_load | paying(chain 20 で新規) |
target_block_bytes | 10,485,760。20 MiB のブロック上限の半分です |
target_block_gas | 262,144 |
adjust_bps | 1,250。1 ブロックあたり最大 12.5% です |
bundle_gas_limit | 20,479 |
metering | circuit |
目標を下回るブロックは価格を下げるため、閑散としたチェーンでは価格は下限に張り付きます。rand_getLimits は、チップの現在の gas_price と byte_price を、gas_metering: "circuit"、bundle_gas_limit、adjust_bps とともに返し、v0.6.8 以降は max_gas_price、max_byte_price、byte_load も返します(これらを持たないチェーンでは null)。rand_status は同じ 2 つの価格を gas_prices として報告します。
上限と paying バイト負荷
どちらも gas.dynamic のジェネシスフィールドで、v0.6.8 で新たに加わりました(audit v6、POOL-2)。chain 20 が、これらを設定する最初のチェーンです。これらは chain 18 と chain 19 にあった不具合を正すものです。両チェーンでは、byte_price がすべてのトランザクションのエンコード長に応じて動く一方で、これを支払うのは call だけでした。7 件の転送(それぞれ約 2.85 MB、固定手数料)でブロックはバイト目標の約 1.9 倍まで埋まり、価格は 1 ブロックあたり約 11% 上がります。上限がないため、そのようなブロックが約 65 個続くと価格は開始時の 1,000 倍に達し、call のコストは約 0.004 RAND から約 1 RAND になります。
- 上限。
max_gas_priceとmax_byte_priceは、コントローラがそれ以上には引き上げない価格です。ステップ幅は同じで、その後にクランプされます(gas::next_price_capped)。そのため、上限にある価格は満杯のブロックが何個続いても上限にとどまり、目標を下回る最初のブロックで下がります。ジェネシスは、それぞれを開始価格以上に設定しなければなりません。chain 20 の上限では、上記の tier-14 の call(20,479 gas、1,319 KiB)の下限は 0.3113 RAND で、これが下限の取りうる最高値です。 - paying バイト負荷。
byte_load: "paying"の下では、ブロックのbytes_usedは、バイト価格が課されるバイトだけを数えます。すなわち各CallとInvokeの証明に入力エンベロープを加えたもの(gas::call_bytes)で、転送、ボンド、バーンのバイトは含まれません。転送だけのブロックはバイト価格を動かしません。Ledger::block_usageがこの値をプロポーザーとレプリカの両方について計算するため、両者は一致します。
paying 負荷の下では、転送で埋まったブロックは call に価格シグナルを与えません。そのため、誠実なプロポーザーは call のための余地も確保します。これはノードのポリシーであり、有効性の規則ではありません。call または invoke がプールにあり、現在の下限を支払っている間は、固定手数料のトランザクションは最初のパスでブロックのバイトの最大 4 分の 3 までしか取れません。call が使い残した最後の 4 分の 1 は、後回しにしていた転送で埋められます(メムプール)。
call でウォレットが支払う額
rand call はまずエミュレータでプログラムを実行し、gas: <exact> (declaring <limit>, tier <t>) を出力します。デフォルトでは、正確な gas を 2^(tier − 2) の倍数に切り上げた値を宣言します。--gas-limit N は正確な値を宣言し、--gas-limit max はヘッダの上限を宣言します。
デフォルトの手数料が下限より高くなる理由は 2 つあります。
- 証明は上限サイズで価格が付けられます。 chain 16 以降(
hardening_v6。chain 20 を含みます)、call の証明は自身のトランザクションに結び付けられるため、手数料は証明が存在する前に確定します。ウォレットは実際の証明サイズの代わりに、チェーンの証明サイズ上限である 4 MiB で価格を付けます(wallet::hardened_call_quote_bytes)。この方法では支払いが過剰になることはあっても、不足することはありません。 - 2 ステップ分の余裕。
rand_getLimitsはコミット済みヘッドの価格を返し、call が取り込まれるのは 2〜3 ブロック後です。そのためデフォルトでは下限に(1 + adjust_bps / 10,000)²を掛けます。chain 20 では 1.125² です。
2026-09-30 に chain 18 で計測したところ、これらのデフォルトでは 4 件の call のコストはそれぞれ 0.0057〜0.0075 RAND でした(サンプルプログラム)。--fee はデフォルトを上書きします。ウォレットは送信前に実際の証明で価格を再計算し、下限を下回る手数料は拒否します。
手数料の行き先
手数料はすべて(下限もチップも)、バリデータレジストリにあるブロックプロポーザーの rewards に計上されます。これは、このチェーンで金額を平文のまま保存する唯一の場所です。例外が 1 つあります。tokens.burn_registration_fee を持つジェネシス(chain 20。chain 15 以降のすべてのチェーンと同じです)では、RegisterToken または RegisterBridgedToken の registration_fee はバーンされ、プロポーザーは fee − registration_fee を受け取ります。rand_getSupply はこれを registration_fees_burned に数えます。このフラグを持たなかった chain 14 では、プロポーザーが手数料の全額を受け取っていました。それ以外にバーンされるものはなく、分配もありません。バリデータは rand-node withdraw で、蓄積された報酬をノートに変えます(ステーキング)。invoke のセル手数料はバンドル手数料の一部であり、残りとともにプロポーザーに渡ります。chain 20 にはブロック報酬もインフレもありません。バリデータの収入は手数料がすべてです。
chain 20 には、RAND ではなく、どのバリデータにも渡らない手数料が 1 つあります。ジェネシスの bridge.fees(v0.6.8 で新規)の下で、ブリッジはすべての zUSD のデポジットとすべての zUSD のバーンから 10 bps を、裏付け資産の償還単位の整数に切り捨てて受け取ります。これは、ジェネシスが指定するトレジャリーアドレス宛の zUSD ノートとして保持されます。デポジットでは、預け入れた人に手数料を差し引いた額が付与されます。バーンでは、ソースチェーン上で amount − fee が償還されます。手数料ノートは発行済みのまま、裏付けも維持されます。ブリッジと RPL トークンを参照してください。
メムプールは、候補を 1 KiB あたりで下限を上回って支払う額の順に、次いで手数料の順に並べます(メムプール)。そのため、手数料を高くする意味があるのは混雑時だけです。転送は約 2.85 MB です(chain 18 で計測)。内訳は 1.49 MB のバンドル証明と 1.36 MB の認可証明で、chain 20 の 20 MiB のブロックには約 7 件が収まります。フルノード側の見解は、メインネット前に下限が目指すべきものは、オペコードではなくバイトに対する手数料市場だというものでした。chain 20 のバイト価格は call にとってのその市場であり、call が支払うバイトによってのみ動きます。転送の下限は依然として固定です。
ここでガスが上限ではなく価格である理由
Ethereum はすべてのオペコードを計量します。すべてのノードがすべてのトランザクションを実行し、その実行に終わりがないからです。Rand ではどのノードも何も実行しません。送信者がプログラムをオフチェーンで 1 回実行し、チェーンに証明を渡します。トランザクションごとのノードの作業は固定された手順で、公開フィールドをデコードし、無料のチェックを実行し、STARK を 1 つ検証します。この検証は、ウォームな検証鍵があればプログラムの内容にかかわらず約 16 ms です。そのため、ガスの 3 つの役割は切り離されます。
- 停止性は tier によって担保されます。
2ᵗ − 1サイクル以内に停止しない実行は、そもそも証明できず、その失敗は証明者が引き受けます。 - 作業の価格付けは、chain 18 以降、ガス下限の役割です。ネットワークの命令あたりのコストはほぼゼロですが、送信者の証明作業は現実のコストであり、固定の下限では 100 万サイクルの call も 1,000 サイクルの call と同じ価格になっていました。chain 18 までは、下限は tier ごとに固定でした。
- ブロックのサイズ設定は、バイト予算(デフォルトでは
MAX_BLOCK_BYTES= 4 MiB、それ以外ではジェネシスのmax_block_bytes)とトランザクション数(2,000)で行われます。
フルノードが明言している注意点が 2 つあります。バイトは実際に変動すること(証明は 1 メガバイトを超えるため、希少な資源は計算ではなくブロック空間です)、そして状態の増大(ツリー、ヌリファイアセット、デプロイされたプログラムのバイト)は、ワードあたりのデプロイ手数料と固定のベース手数料でしか価格付けされていないことです。これはテストネットには十分ですが、状態サイズが問題になる時点で見直す価値があります。
送信者が代わりに支払うもの:証明
変動する唯一のコストは STARK 証明の生成であり、それを負担するのは送信者のマシンだけです。影響の大きい順に挙げます。
- tier
t ∈ {10, 12, 14, 16, 18, 20}(v0.5.6 以降、チェーンは 14 を超える call を拒否します。バンドルは 14 に固定され、chain 17 以降はその隣に tier-10 の認可証明が付くため、約 7 秒増えます)。cpu テーブルは2ᵗ行にパディングされ、tier が 1 段上がるごとにパディング後のトレースはおよそ 4 倍になります。開発用ラップトップでの計測では、tier 10 のprivate_paymentは約 7 秒、tier 14 の隠しアセットのバンドル guest は、どのアセットを動かす場合でも約 100 秒です。 - 実行されたサイクル数。これが tier を決めます。数えるのは書かれた命令ではなく、実行された命令です。
- プログラムサイズ。影響は小さく、トレースの先頭で 4 ワードにつきダイジェスト 1 行です。
- プライベート入力のサイズ。同様に影響は小さいです。
- どのテーブルが存在するか。keccak または sha256 のテーブルは、guest がそれを使ったときにだけ、その列の分のコストがかかります。
- FRI プロファイル。クエリ数を 27 でなく 80 にすると、証明サイズは 3 倍になりますが、証明時間はほとんど変わりません。
証明は、金額にも、送信者が所有するノートの数にも、チェーンの大きさにも依存しません。メンバーシップは固定深度のツリーに対して証明されるため、転送のコストはブロック 10 でもブロック 1,000 万でも同じです。
リファレンス
| 定数 | 値 |
|---|---|
BUNDLE_BASE | 1,000,000 単位 |
BRIDGE_BURN_FEE | 10,000,000 単位(10 × BUNDLE_BASE) |
registration_fee(ジェネシスの tokens セクション) | chain 20 では 1,000,000,000 単位。バーンされます(burn_registration_fee) |
DEPLOY_PER_WORD | 100,000 単位 |
CALL_BASE、CALL_PER_TIER_STEP | 1,000,000、100,000 単位。gas セクションを持たないチェーンのティアスケジュール |
GAS_PRICE_DEFAULT、BYTE_PRICE_DEFAULT | 1 ガスあたり 100 単位、1 KiB あたり 800 単位。chain 20 の初期価格と価格下限 |
KECCAK_GAS、SHA256_GAS、POSEIDON2_ABSORB_GAS | 192、64、1 行あたり 3 ガス |
max_gas_price、max_byte_price(ジェネシスの gas.dynamic) | chain 20 では 1 ガスあたり 10,000 単位、1 KiB あたり 80,000 単位。指定がなければ上限なし(chain 18 と 19) |
byte_load(ジェネシスの gas.dynamic) | chain 20 では paying。call と invoke の証明およびエンベロープのバイトだけが byte_price を動かします。指定がなければ、すべてのトランザクションのバイトが対象です |
cell_fee(ジェネシスの program_state) | chain 20 では作成されるセル 1 つにつき 10,000,000 単位(0.01 RAND)。上限は 1,000 RAND |
bundle_gas_limit(ジェネシスの gas セクション) | chain 20 では 20,479、すなわち gas_max(14, 0, 0)。認可証明が宣言する値は 1,279、すなわち gas_max(10, 0, 0) |
adjust_bps(ジェネシスの gas.dynamic) | chain 20 では 1,250。ジェネシスで 1 から 5,000 まで設定できます |
MAX_PROGRAM_WORDS | 4,096。ただしジェネシスが max_program_words を設定する場合を除きます(上限は 65,535。chain 20 は 65,535 を設定しており、hardening_v6 は、どの call も保持できない 8,180 ワードを超えるプログラムを拒否します) |
MAX_PROOF_BYTES | 2 MiB。ただしジェネシスが max_proof_bytes を設定する場合を除きます(chain 20 では 4 MiB、chain 13 から 15 では 8 MiB) |
MAX_BLOCK_BYTES、MAX_BLOCK_TXS | 4 MiB(ジェネシスが max_block_bytes を設定する場合を除く。chain 20 では 20 MiB)、2,000 |
| ティア | 10、12、14、16、18、20。サイクル数 ≤ 2ᵗ − 1 |
MAX_CALL_TIER | 14。これを超える call 証明は、受け付け時およびブロック内で拒否されます(v0.5.6 以降) |