EVMスマートコントラクトGas費最適化ガイド 10大実用テクニック

EVMスマートコントラクトGas費用最適化ガイド

イーサリアムネットワークでは、Gas料金がユーザーにとって頭痛の種であり続けています。特にネットワークが混雑している時期には、取引のピーク時にユーザーは取引を完了するために高額な料金を支払う必要があることがよくあります。そのため、スマートコントラクトの開発段階でGas料金の最適化を行うことが特に重要です。Gas消費を最適化することで、取引コストを効果的に削減できるだけでなく、取引効率を向上させ、ユーザーにとってより経済的で効率的なブロックチェーンの使用体験を提供できます。

本文では、イーサリアム仮想マシン(EVM)のGas費メカニズム、Gas費最適化の核心概念、およびスマートコントラクト開発におけるGas費最適化のベストプラクティスを概説します。これらの内容が開発者にとって有益な参考となることを期待するとともに、一般ユーザーがEVMのGas費用の運用方法をよりよく理解し、ブロックチェーンエコシステムの課題に共同で取り組む手助けとなることを願っています。

イーサリアムスマートコントラクトのGas最適化のトップ10ベストプラクティス

EVMのGas料金メカニズムの紹介

EVM互換のネットワークでは、Gasは特定の操作を実行するために必要な計算能力の単位として使用されます。

EVMの構造レイアウトでは、Gas消費は主に3つの部分に分かれています: 操作の実行、外部メッセージの呼び出し、およびメモリとストレージの読み書き。

各取引の実行には計算リソースが消費されるため、無限ループやサービス拒否(DoS)攻撃を防ぐために一定の料金が徴収されます。取引を完了するために必要な料金は、いわゆるGas費です。

EIP-1559の実装以来、ガス料金は次の式で計算されています。

ガス料金=使用ガス単位数(基本料金+優先料金)

その中で基本料金は消却され、優先料金はインセンティブとして、バリデーターにトランザクションをブロックチェーンに追加するよう促します。より高い優先料金を設定することで、トランザクションが次のブロックにパッケージ化される確率を高めることができます。

EVMにおけるGasの最適化を理解する

Solidityでスマートコントラクトをコンパイルすると、コントラクトは一連の(オペコード)に変換されます。

各操作コード(、契約の作成、メッセージ呼び出し、アカウントストレージへのアクセスなど)には、固定のGas消費コストがあります。これらのコストはイーサリアムのホワイトペーパーに記録されていますが、複数回のEIPの修正により、一部の操作コードのGasコストは調整されています。

ガス最適化の基本概念

Gas最適化の核心理念は、EVMブロックチェーン上でコスト効率の高い操作を優先的に選択し、Gasコストが高い操作を避けることです。

EVMでは、以下の操作のコストが低いです:

  • メモリ変数の読み書き
  • 定数と不変変数の読み取り
  • ローカル変数の読み書き
  • calldata 変数を読み取ります
  • 内部関数呼び出し

コストの高い操作には、

  • コントラクトストレージに保存されているステート変数の読み書き
  • 外部関数呼び出し
  • ループ操作

イーサリアムスマートコントラクトのGas最適化のトップ10ベストプラクティス

EVMガス費用最適化ベストプラクティス

1. ストレージの使用をできるだけ減らす

Solidityでは、Storage(ストレージ)は有限のリソースであり、そのGas消費はMemory(メモリ)よりもはるかに高いです。スマートコントラクトがストレージからデータを読み取ったり書き込んだりするたびに、高額なGasコストが発生します。

イーサリアムのホワイトペーパーによれば、ストレージ操作のコストはメモリ操作の100倍以上高いです。例えば、mloadとmstore命令はそれぞれ3ガス単位しか消費しませんが、sloadとsstoreは最も理想的な状況でもコストが少なくとも100単位必要です。

ストレージ使用の制限方法には次のものが含まれます:

  • 非永続的なデータをメモリに保存する
  • ストレージの変更回数を減らす: 中間結果をメモリに保存し、すべての計算が完了した後に結果をストレージ変数に割り当てる。

! [イーサリアムスマートコントラクトのガス最適化のためのトップ10のベストプラクティス](https://img-cdn.gateio.im/webp-social/moments-b237228ebe933741fb60f2e8bcb38405.webp0192837465674839201

) 2. 変数パッキング

スマートコントラクト中Storage slot###存储槽(の数量およびデータ表示方式はGas費消耗に大きく影響します。

Solidityコンパイラは、コンパイルプロセス中に連続したストレージ変数をパッケージ化し、32バイトのストレージスロットを変数ストレージの基本単位として使用します。変数のパッケージ化とは、複数の変数を1つのストレージスロットに適合させるために、変数を適切に配置することを指します。

この調整により、開発者は大量のGas単位を節約できます。各ストレージスロットはGasを消費するため、変数のパッケージ化は必要なストレージスロットの数を減らすことでGasの使用を最適化します。

! [イーサリアムスマートコントラクトのガス最適化のためのトップ10のベストプラクティス])https://img-cdn.gateio.im/webp-social/moments-30f0bc370a7b9ca65f3d623c31262b76.webp(

) 3. データ型の最適化

適切なデータ型を選択することで、Gasの使用を最適化するのに役立ちます。

例えば、Solidityでは、整数は異なるサイズに細分化できます: uint8、uint16、uint32など。EVMが256ビット単位で操作を実行するため、uint8を使用するとEVMはまずそれをuint256に変換する必要があり、この変換は追加のGasを消費します。

しかし、4つのuint8変数を1つのストレージスロットにパッケージ化できれば、それらを反復処理する総コストは4つのuint256変数よりも低くなります。このようにして、スマートコントラクトは1回のストレージスロットの読み書きで、1回の操作で4つのuint8変数をメモリ/ストレージに配置できます。

![イーサリアムスマートコントラクトのGas最適化トップ10ベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 4. 動的変数の代わりに固定サイズの変数を使用する

データが32バイト以内に制御できる場合は、bytesまたはstringsの代わりにbytes32データタイプを使用することをお勧めします。一般的に、固定サイズの変数は可変サイズの変数よりもガスを少なく消費します。バイトの長さを制限できる場合は、できるだけbytes1からbytes32の最小長を選択してください。

! [イーサリアムスマートコントラクトのガス最適化のためのトップ10のベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

) 5. マッピングと配列

Solidityのデータリストは、2つのデータ型で表すことができます: 配列###Arrays(とマッピング)Mappings(。

マッピングはほとんどの場合、効率が高くコストが低いですが、配列はイテラブルであり、データタイプのパッキングをサポートしています。したがって、データリストを管理する際には、イテレーションが必要な場合やデータタイプのパッキングによってGas消費を最適化できる場合を除き、マッピングを優先して使用することをお勧めします。

![イーサリアムスマートコントラクトのGas最適化に関する10のベストプラクティス])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. メモリの代わりに calldata を使用する

関数の引数で宣言された変数は、calldataまたはmemoryに格納できます。二つの主な違いは、memoryは関数によって変更可能ですが、calldataは不変であることです。

関数の引数が読み取り専用である場合、memoryではなくcalldataを優先的に使用するべきです。これにより、関数のcalldataからmemoryへの不必要なコピー操作を避けることができます。

![イーサリアムのスマートコントラクトのGas最適化に関する10のベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 7. できるだけConstant/Immutableキーワードを使用してください

Constant/Immutable変数は契約のストレージに保存されません。これらの変数はコンパイル時に計算され、契約のバイトコードに保存されます。したがって、ストレージと比較してアクセスコストははるかに低くなります。可能な限りConstantまたはImmutableキーワードを使用することをお勧めします。

![イーサリアムスマートコントラクトのGas最適化のための10のベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 8. オーバーフロー/アンダーフローが発生しないことを確認してからUncheckedを使用する

開発者が算術演算がオーバーフローまたはアンダーフローを引き起こさないことを確認できる場合、Solidity v0.8.0で導入されたuncheckedキーワードを使用して、余分なオーバーフローまたはアンダーフローのチェックを回避し、Gasコストを節約できます。

さらに、0.8.0以上のバージョンのコンパイラでは、SafeMathライブラリを使用する必要がなくなりました。なぜなら、コンパイラ自体にオーバーフローおよびアンダーフロー保護機能が組み込まれているからです。

![イーサリアムスマートコントラクトのGas最適化のトップ10ベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

) 9. オプティマイザー

修正器のコードは修正された関数に埋め込まれ、修正器を使用するたびにそのコードがコピーされます。これによりバイトコードのサイズが増加し、Gas消費が増加します。

内部関数にロジックを再構築することで、修飾子内でその内部関数を再利用でき、バイトコードのサイズを削減し、ガスコストを低減できます。

![イーサリアムスマートコントラクトのガス最適化のトップ10ベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 10. ショートカット最適化

||および&&演算子に対して、論理演算はショートサーキット評価が行われます。つまり、最初の条件が論理式の結果を決定できる場合、2番目の条件は評価されません。

Gas消費を最適化するために、計算コストが低い条件を前に置くべきです。これにより、高コストの計算をスキップできる可能性があります。

! [イーサリアムスマートコントラクトのガス最適化のためのトップ10のベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp(

その他の一般的な推奨事項

) 1. 不要なコードを削除する

契約に未使用の関数や変数が存在する場合は、それを削除することをお勧めします。これは契約のデプロイコストを削減し、契約のサイズを小さく保つ最も直接的な方法です。

いくつかの実用的なアドバイス:

  • 最も効率的なアルゴリズムを使用して計算します。
  • 使用していない計算プロセスを削除します。
  • 不要再必要な変数を削除するためにdeleteキーワードを使用するか、デフォルト値に設定します。
  • ループの最適化: 高コストのループ操作を避け、可能な限りループを統合し、繰り返し計算をループ本体の外に移動します。

2. プレコンパイルされたスマートコントラクトを使用する

プリコンパイルされたコントラクトは、暗号化やハッシュ操作などの複雑なライブラリ関数を提供します。コードはEVM上で実行されるのではなく、クライアントノードのローカルで実行されるため、必要なガスが少なくなります。プリコンパイルされたコントラクトを使用することで、スマートコントラクトの実行に必要な計算作業量を減らすことでガスを節約できます。

プリコンパイルされたコントラクトの例には、楕円曲線デジタル署名アルゴリズム###ECDSA(およびSHA2-256ハッシュアルゴリズムが含まれます。

) 3. インラインアセンブリコードを使用する

インラインアセンブリは、開発者がEVMによって直接実行可能な低レベルでありながら効率的なコードを書くことを許可します。高価なSolidityオペコードを使用する必要はありません。インラインアセンブリは、メモリとストレージの使用をより正確に制御することも可能にし、Gasコストをさらに削減します。さらに、インラインアセンブリは、Solidityのみでは実現が難しい複雑な操作を実行でき、Gas消費の最適化に対してより多くの柔軟性を提供します。

しかし、インラインアセンブリを使用することはリスクを伴い、間違いやすくもあります。したがって、慎重に使用し、経験豊富な開発者の操作に限るべきです。

4. Layer 2ソリューションを使用する

Layer 2ソリューションを使用することで、Ethereumメインネット上に保存および計算する必要があるデータ量を減らすことができます。

rollupsやサイドチェーン、ステートチャンネルなどのLayer 2ソリューションは、取引処理をメインのイーサリアムチェーンからオフロードすることができ、より速く、より安価な取引を実現します。

大量の取引を束ねることで、これらのソリューションはオンチェーン取引の数を減らし、Gas料金を削減します。Layer 2ソリューションを使用することで、Ethereumのスケーラビリティも向上し、より多くのユーザーやアプリケーションがネットワークに参加でき、ネットワークの過負荷による混雑を引き起こすことはありません。

5. 最適化ツールとライブラリの使用

複数の最適化ツールが利用可能で、例えばsolcオプティマイザー、Truffleのビルドオプティマイザー、RemixのSolidityコンパイラーがあります。

これらのツールは、バイトコードのサイズを最小化し、不要なコードを削除し、スマートコントラクトの実行に必要な操作回数を減らすのに役立ちます。"solmate"などの他のGas最適化ライブラリと組み合わせることで、開発者はGasコストを効果的に削減し、スマートコントラクトの効率を向上させることができます。

![イーサリアムスマートコントラクトのGas最適化のトップ10ベストプラクティス]###https://img-cdn.gateio.im/webp-social/moments-248337b15929868ed1250ffb9fcfa289.webp(

まとめ

Gas消費の最適化は開発者にとって重要なステップです。

GAS-1.53%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 9
  • 共有
コメント
0/400
NotGonnaMakeItvip
· 07-13 18:50
白開水ブロックチェーンコミュニティは皆理解している 核心はガスを売ることだけ
原文表示返信0
DeFiGraylingvip
· 07-13 18:26
ガス高いなぁ、破産しそうだった。
原文表示返信0
BearMarketSurvivorvip
· 07-13 13:49
ガス費がまた貧しい庶民を苦しめている、うう
原文表示返信0
WalletManagervip
· 07-12 02:38
ガスは高すぎるので、L2で取引する方がいい。
原文表示返信0
RugDocDetectivevip
· 07-12 02:36
別に華やかにしないで、ガス代が本当の問題だ。
原文表示返信0
BearMarketGardenervip
· 07-12 02:21
プロがまた活動を始めた 何を買って損切り操作をするべきかが来た
原文表示返信0
DataChiefvip
· 07-12 02:18
天どこで水のガス料金がまたかかるのか、新しいことを言えませんか
原文表示返信0
RektCoastervip
· 07-12 02:16
誰か私のウォレットを救う方法を教えてくれませんか?ガス代が本当に高いです。
原文表示返信0
MaticHoleFillervip
· 07-12 02:10
ガス費は本当に素晴らしい、ビタリックブテリンを大儲けさせた。
原文表示返信0
もっと見る
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)