イーサリアムスマートコントラクトGas費用最適化 15のヒント

イーサリアムスマートコントラクトGas費用最適化ガイド

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

本稿では、イーサリアム仮想マシン(EVM)のGas費用メカニズム、Gas費用最適化に関する主要な概念、及びスマートコントラクトを開発する際のGas費用最適化のベストプラクティスについて概説します。これらの内容が開発者にインスピレーションと実用的な助けを提供し、一般ユーザーがEVMのGas費用の運用方法をよりよく理解し、ブロックチェーンエコシステムの課題に共に取り組む手助けになることを願っています。

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

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

EVMに対応したネットワークでは、「Gas」は特定の操作を実行するために必要な計算能力を測定する単位です。

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

取引の実行には計算リソースが必要なため、無限ループやサービス拒否(攻撃を防ぐために、一定の手数料が徴収されます。取引を完了するために必要な手数料は「ガス代」と呼ばれます。

EIP-1559)のロンドンハードフォーク(が有効になって以来、Gas費は以下の公式で計算されます:

ガス料金 = 使用したガスの単位 * )ベース料金 + プライオリティ料金(

基本手数料は消失し、優先手数料はインセンティブとして、バリデーターがトランザクションをブロックチェーンに追加することを奨励します。トランザクションを送信する際により高い優先手数料を設定すると、トランザクションが次のブロックに含まれる可能性が高まります。これは、ユーザーがバリデーターに支払う「チップ」のようなものです。

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

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

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

任意の操作コード###、例えばコントラクトの作成、メッセージの呼び出し、アカウントストレージへのアクセス、および仮想マシンでの操作の実行(には、認識されたGas消費コストがあり、これらのコストはイーサリアムのホワイトペーパーに記録されています。

複数回のEIPの修正を経て、一部のオペコードのGasコストが調整されており、黄皮書において若干の相違がある可能性があります。

) 2.ガスの最適化の基本概念

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

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

  • メモリ変数の読み書き
  • 定数と不変変数の読み取り
  • ローカル変数の読み書き
  • calldata 配列や構造体などの calldata 変数を読み取る
  • 内部関数呼び出し

コストが高い操作には以下が含まれます:

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

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

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

上記の基本概念に基づき、私たちは開発者コミュニティのためにGas費用最適化のベストプラクティスリストを整理しました。これらのプラクティスに従うことで、開発者はスマートコントラクトのGas費用消費を削減し、取引コストを低下させ、より効率的でユーザーフレンドリーなアプリケーションを構築できます。

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

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

イーサリアムの黄皮書の定義によれば、ストレージ操作のコストはメモリ操作の100倍以上高い。例えば、OPcodesmloadおよびmstore命令はわずか3ガス単位を消費するが、ストレージ操作であるsloadおよびsstoreは、最も理想的な状況でさえ、コストが少なくとも100単位必要である。

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

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

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

) 2. 変数パッケージ

スマートコントラクト中に使用されるStorage slot(ストレージスロット)の数および開発者がデータを表示する方法は、Gas費の消耗に大きな影響を与えます。

Solidityコンパイラはコンパイルプロセス中に連続したストレージ変数をパッキングし、32バイトのストレージスロットを変数ストレージの基本単位として使用します。変数のパッキングとは、変数を合理的に配置することで、複数の変数が単一のストレージスロットに収まることを指します。

この細かい調整により、開発者は20,000ガス単位###を節約できます。未使用のストレージスロットを保存するには20,000ガス(が必要ですが、現在はわずか2つのストレージスロットだけで済みます。

各ストレージスロットはGasを消費するため、変数をパッキングすることで必要なストレージスロットの数を減らし、Gasの使用を最適化します。

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

( 3. データ型の最適化

変数はさまざまなデータ型で表すことができますが、異なるデータ型に対応する操作コストは異なります。適切なデータ型を選択することで、Gasの使用を最適化するのに役立ちます。

例えば、Solidityでは、整数は異なるサイズに分割できます:uint8、uint16、uint32など。EVMは256ビット単位で操作を実行するため、uint8を使用することはEVMが最初にそれをuint256に変換しなければならないことを意味し、その変換は追加のGasを消費します。

単独で見ると、uint256を使用する方がuint8よりも安価です。しかし、前に提案した変数パッキングの最適化を使用すると、状況は異なります。開発者が4つのuint8変数を1つのストレージスロットにパッキングできれば、それらを反復処理する総コストは4つのuint256変数よりも低くなります。これにより、スマートコントラクトは1回のストレージスロットの読み書きを行い、1つの操作で4つのuint8変数をメモリ/ストレージに配置できます。

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

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

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

5. マッピングと配列

Solidityのデータリストは2種類のデータ型で表現できます: 配列(Arrays)とマッピング###Mappings###ですが、それらの構文と構造は全く異なります。

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

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

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

関数パラメータに宣言された変数は、calldataまたはmemoryに格納できます。両者の主な違いは、memoryは関数によって変更できるのに対し、calldataは不変であることです。

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

) 7. 可能な限り Constant/Immutable キーワードを使用してください

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

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

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

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

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

9. 最適化モディファイア

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

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

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

( 10. ショートサーキット最適化

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

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

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

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

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

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

以下は実用的な提案です:

  • 最も効率的なアルゴリズムを使用して計算します。契約内で直接特定の計算結果を使用する場合は、これらの冗長な計算プロセスを排除する必要があります。本質的に、未使用の計算は削除されるべきです。

  • イーサリアムでは、開発者はストレージスペースを解放することでガス報酬を得ることができます。不要になった変数は、deleteキーワードを使用して削除するか、デフォルト値に設定する必要があります。

  • ループ最適化: 高コストのループ操作を避け、可能な限りループを統合し、繰り返し計算をループ本体の外に移動させる。

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

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

プレコンパイルされたコントラクトの例には、楕円曲線デジタル署名アルゴリズム(ECDSA)とSHA2-256ハッシュアルゴリズムが含まれます。スマートコントラクト内でこれらのプレコンパイルされたコントラクトを使用することで、開発者はガスコストを削減し、アプリケーションの実行効率を向上させることができます。

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

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

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

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

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

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

ETH-2.03%
GAS-1.43%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 3
  • 共有
コメント
0/400
SocialFiQueenvip
· 07-10 22:01
総有人が歯を食いしばってガス代を耐えているね...
原文表示返信0
LostBetweenChainsvip
· 07-08 12:24
太烦了 ガス費は初心者収割機と同じです
原文表示返信0
ResearchChadButBrokevip
· 07-08 05:57
いつになったら私たちは高ガスにカモにされずに済むのか
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)