mcpField
G
gas

gas

github.com/therealharpaljadeja開発14230 回インストール2 週間前に更新
リポジトリ

gas について

Monad上でアプリを開発する人向けに、ガス価格、上限、オペコードのコスト差をまとめたリファレンススキルです。実使用量ではなく gas limit に基づく課金と、上限設定や手数料表示の指針を扱います。

主な機能

  1. 01gas limit による課金の説明
  2. 02EIP-1559 の価格規則
  3. 03ブロックとトランザクションの上限
  4. 04ベース手数料制御の説明
  5. 05オペコードとプリコンパイルのコスト
  6. 06gas limit と手数料計算の指針

活用シーン

  1. 01Monad の取引に gas limit を設定
  2. 02UI でガス手数料を計算・表示
  3. 03コールドストレージアクセス費用の推定
  4. 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 の高性能アーキテクチャにおけるリソースの希少性の違い、特にディスクベースの状態操作を反映しています。

コールド状態アクセスのコストは大幅に増加
操作EthereumMonad増加量
アカウントアクセス(コールド)2,600 gas10,100 gas+7,500
ストレージアクセス(コールド)2,100 gas8,100 gas+6,000
アカウントアクセス(ウォーム)100 gas100 gas変更なし
ストレージアクセス(ウォーム)100 gas100 gas変更なし

影響を受けるオペコード:

  • アカウントアクセス:BALANCE、EXTCODESIZE、EXTCODECOPY、EXTCODEHASH、CALL、CALLCODE、DELEGATECALL、STATICCALL、SELFDESTRUCT
  • ストレージアクセス:SLOAD、SSTORE

開発者への影響:

  • 多数のコールドストレージスロットにアクセスするコントラクトや、多数の外部コントラクトを呼び出すコントラクトは、Monad でのコストが大幅に高くなります。
  • ウォームアクセスのコストは Ethereum と同じなので、1 回のトランザクション内で同じスロットやアカウントに繰り返しアクセスしても、追加コストは発生しません。
  • ストレージスロットに 1 回(コールド)アクセスしてから再利用(ウォーム)するバッチ処理は問題ありません。一方、異なる多数のスロットをそれぞれ 1 回ずつコールド読み取りするパターンは、コストが高くなります。
  • 1 回の呼び出しで多数の異なるストレージスロットを読み取るコントラクトでは、Monad 上でのガス見積もりが高くなります。ガス上限を設定する際は、この点を考慮してください。
プリコンパイルの価格改定

暗号処理のプリコンパイルは、Monad では 2~5 倍のコストがかかります。

プリコンパイルアドレスEthereumMonad倍率
ecRecover0x013,0006,0002x
ecAdd0x061503002x
ecMul0x076,00030,0005x
ecPairing0x0845,000225,0005x
blake2f0x09rounds x 1rounds x 22x
点評価0x0a50,000200,0004x

開発者への影響:

  • 署名検証(ecRecover)に大きく依存するコントラクトでは、該当する操作のガス使用量が 2 倍になります。
  • ZK 関連の操作(ecMul、ecPairing、点評価)は 4~5 倍高くなります。コントラクトがオンチェーンで ZK 証明を検証する場合、Ethereum のガス見積もりとは大きく異なります。
  • コントラクトでこれらを使用する場合は、より高いプリコンパイルコストをガス上限の計算に織り込んでください。

コメント