gas について
Monad上でアプリを開発する人向けに、ガス価格、上限、オペコードのコスト差をまとめたリファレンススキルです。実使用量ではなく gas limit に基づく課金と、上限設定や手数料表示の指針を扱います。
主な機能
- 01gas limit による課金の説明
- 02EIP-1559 の価格規則
- 03ブロックとトランザクションの上限
- 04ベース手数料制御の説明
- 05オペコードとプリコンパイルのコスト
- 06gas limit と手数料計算の指針
活用シーン
- 01Monad の取引に gas limit を設定
- 02UI でガス手数料を計算・表示
- 03コールドストレージアクセス費用の推定
- 04署名や ZK プリコンパイル費用の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ therealharpaljadeja/ monskills --skill gasインストール後、Claude Code で/gasを入力して読み込まれたか確認します。
同梱ファイルSKILL.zh.md
詳細
Monad のガス価格設定は EIP-1559 に準拠していますが、Ethereum とは重要な点で異なります。トランザクションを送信するアプリの構築、ガスの見積もり、ガスコストの表示を行う場合は、これらの違いを理解する必要があります。
主な違い:Monad では使用ガス量ではなくガス上限に対して課金されます
Ethereum では、ユーザーはトランザクションで実際に消費されたガスに対して料金を支払います。Monad では、ユーザーは設定したガス上限に基づいて料金を支払います。
gas_paid = gas_limit * price_per_gas
これは、Monad が非同期実行を採用しているためです。ブロックリーダーは実行前にブロックを構築するため、トランザクションが取り込まれる時点では実際のガス消費量がわかりません。これにより、安いガスを申告しながら高コストの計算を行うトランザクションによる DOS 攻撃を防止できます。
開発者にとっての意味:
- 必要以上に高いガス上限を設定すると、その分ユーザーの MON コストが直接増加します。
- 特に既知の固定コストがあるトランザクションでは、常に正確で余裕の少ないガス上限を設定してください。
- ネイティブ MON の送金では、ガスコストは常に 21,000 です。
eth_estimateGasに頼らず、この値をハードコードしてください。
EIP-1559 のトランザクション価格設定
Monad はタイプ 2(EIP-1559)トランザクションを使用します。
price_per_gas = min(base_price_per_gas + priority_price_per_gas, max_price_per_gas)
署名時に、ユーザーは次の 2 つの値を指定します。
priority_price_per_gas— ブロック内でのトランザクションの優先順位付けに使われるチップmax_price_per_gas— ガス価格全体に対する上限
ネットワークが制御する base_price_per_gas は、ブロック内のすべてのトランザクションで同じです。
ブロックとトランザクションの上限
| パラメーター | 値 |
|---|---|
| ブロックのガス上限 | 200M gas |
| トランザクションのガス上限 | 30M gas |
| 最低基本手数料 | 100 MON-gwei(100 x 10^-9 MON) |
これらの値は Ethereum のブロックガス上限である 30M より大幅に高く、Monad のブロックにはより多くのトランザクションを含められます。
基本手数料コントローラー
Monad の基本手数料コントローラーは Ethereum のものとは異なります。ブロックスペースが過大な価格設定によって十分に利用されなくなるのを防ぐため、上昇はより緩やかで、下降はより速くなります。
コントローラーのパラメーター:
- max_step_size = 1/28
- target = 160M gas(ブロック容量の 80%)
- beta = 0.96
- epsilon = 160M
基本手数料は、ブロックがターゲットに対してどれだけ埋まっていたかに基づく指数調整を使って、各ブロックで更新されます。この計算式では指数平滑化(beta = 0.96)を使ってブロック充足率の過去の変動を追跡するため、Ethereum のより単純な仕組みよりも手数料の変動が滑らかになります。
実際には、Monad のガス価格はより安定し、急騰後もより速く回復します。
トランザクションの順序付け
デフォルトの Monad クライアントは優先ガスオークションを使ってトランザクションを順序付けます。トランザクションはガス価格の合計(基本手数料 + 優先手数料)の降順で並べ替えられます。
開発者向けガイドライン
コストがわかっている場合は必ず明示的なガス上限を設定する
固定ガスコストの操作では、ウォレットに送信する前にガス上限を明示的に設定してください。
// Good: explicit gas limit for a native transfer
const tx = {
to: recipient,
value: parseEther("1.0"),
gasLimit: 21000n,
};
これは、一部のウォレット(MetaMask など)がガス上限の決定に eth_estimateGas を使うため重要です。この呼び出しがリバートした場合(たとえば、コントラクト呼び出しが失敗する場合)、ウォレットが非常に高いガス上限にフォールバックすることがあります。Monad では実際の使用量ではなく上限に対して課金されるため、その場合ユーザーは引き上げられた上限全体に対して料金を支払うことになります。
フロントエンドコードでのガス見積もり
viem または wagmi を使ってガスを見積もる場合、その見積もりは下限ではなく、ユーザーが実際に支払う額であることに注意してください。必要な場合にのみ、小さなバッファを追加してください。
// If you must estimate, keep the buffer small
const estimate = await publicClient.estimateGas({ ... });
const gasLimit = estimate + (estimate / 10n); // 10% buffer at most
ユーザーへのガスコストの表示
UI にガスコストを表示する場合、他のチェーンのレシートに記録された「使用ガス量」ではなく、ガス上限から計算してください。
const gasCost = gasLimit * gasPrice;
スマートコントラクトに関する考慮事項
- Monad の 30M のトランザクションガス上限は、Ethereum のブロックガス上限と同じであるため、個々のトランザクションを非常に大きくできます。
- Monad でコントラクトを最適化してガス使用量を削減してください。ユーザーは上限に対して料金を支払うため、ガスを減らせばユーザーのコストが直接下がり、より正確な見積もりによって上限も抑えられます。
- コントラクトにガスコストを予測できる関数がある場合は、その情報をドキュメントに記載し、フロントエンドで明示的な上限を設定できるようにしてください。
オペコードの価格差
Monad では、すべてを割り引くのではなく、一部のオペコードの価格を引き上げています。これにより、変更による影響を最小限に抑えながら、同じ相対的な効果を実現しています。これらの変更は、Monad の高性能アーキテクチャにおけるリソースの希少性の違い、特にディスクベースの状態操作を反映しています。
コールド状態アクセスのコストは大幅に増加
| 操作 | Ethereum | Monad | 増加量 |
|---|---|---|---|
| アカウントアクセス(コールド) | 2,600 gas | 10,100 gas | +7,500 |
| ストレージアクセス(コールド) | 2,100 gas | 8,100 gas | +6,000 |
| アカウントアクセス(ウォーム) | 100 gas | 100 gas | 変更なし |
| ストレージアクセス(ウォーム) | 100 gas | 100 gas | 変更なし |
影響を受けるオペコード:
- アカウントアクセス:
BALANCE、EXTCODESIZE、EXTCODECOPY、EXTCODEHASH、CALL、CALLCODE、DELEGATECALL、STATICCALL、SELFDESTRUCT - ストレージアクセス:
SLOAD、SSTORE
開発者への影響:
- 多数のコールドストレージスロットにアクセスするコントラクトや、多数の外部コントラクトを呼び出すコントラクトは、Monad でのコストが大幅に高くなります。
- ウォームアクセスのコストは Ethereum と同じなので、1 回のトランザクション内で同じスロットやアカウントに繰り返しアクセスしても、追加コストは発生しません。
- ストレージスロットに 1 回(コールド)アクセスしてから再利用(ウォーム)するバッチ処理は問題ありません。一方、異なる多数のスロットをそれぞれ 1 回ずつコールド読み取りするパターンは、コストが高くなります。
- 1 回の呼び出しで多数の異なるストレージスロットを読み取るコントラクトでは、Monad 上でのガス見積もりが高くなります。ガス上限を設定する際は、この点を考慮してください。
プリコンパイルの価格改定
暗号処理のプリコンパイルは、Monad では 2~5 倍のコストがかかります。
| プリコンパイル | アドレス | Ethereum | Monad | 倍率 |
|---|---|---|---|---|
| ecRecover | 0x01 | 3,000 | 6,000 | 2x |
| ecAdd | 0x06 | 150 | 300 | 2x |
| ecMul | 0x07 | 6,000 | 30,000 | 5x |
| ecPairing | 0x08 | 45,000 | 225,000 | 5x |
| blake2f | 0x09 | rounds x 1 | rounds x 2 | 2x |
| 点評価 | 0x0a | 50,000 | 200,000 | 4x |
開発者への影響:
- 署名検証(
ecRecover)に大きく依存するコントラクトでは、該当する操作のガス使用量が 2 倍になります。 - ZK 関連の操作(
ecMul、ecPairing、点評価)は 4~5 倍高くなります。コントラクトがオンチェーンで ZK 証明を検証する場合、Ethereum のガス見積もりとは大きく異なります。 - コントラクトでこれらを使用する場合は、より高いプリコンパイルコストをガス上限の計算に織り込んでください。