イーサリアムスマートコントラクトGas最適化実践ガイド:ドロップコスト効率向上

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

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

本文はイーサリアム仮想マシン(EVM)のGas費メカニズム、Gas費最適化に関する核心概念、そしてスマートコントラクト開発におけるGas費最適化のベストプラクティスを概説します。これらの内容を通じて、開発者にインスピレーションと実用的な支援を提供し、同時に一般ユーザーがEVMのGas費用の運用方法をより良く理解し、ブロックチェーンエコシステムの課題に共に対処できるようになることを願っています。

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

EVMのGas費メカニズムの紹介

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

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

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

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

ガス料金 = 使用されたガスの単位 * (基本料金 + プライオリティ料金)

基礎手数料は破棄され、優先手数料はインセンティブとして機能し、バリデーターが取引をブロックチェーンに追加することを促します。取引を送信する際により高い優先手数料を設定することで、取引が次のブロックに含まれる可能性が高まります。これは、ユーザーがバリデーターに支払う「チップ」に似ています。

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

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

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

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

何度もEIPの修正が行われ、その中のいくつかの操作コードのGasコストが調整され、黄皮書とは異なる可能性があります。

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

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

EVMにおいて、以下の操作はコストが低い:

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

コストが高い操作には次のものが含まれます:

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

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

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バイトのストレージスロットを変数ストレージの基本単位として使用します。変数のパッケージ化とは、複数の変数が1つのストレージスロットに収まるように、変数を合理的に配置することを指します。

この詳細な調整により、開発者は20,000ガス単位)の未使用のストレージスロットを保存するのに必要な20,000ガス(を節約できるが、今はわずか2つのストレージスロットが必要です。

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

! [イーサリアムスマートコントラクトのガス最適化のためのトップ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キーワードを使用することをお勧めします。

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

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

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

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

) 9. オプティマイザー

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

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

![イーサリアムスマートコントラクトの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. 不要なコードを削除する

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

以下は幾つかの実用的なアドバイスです:

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

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

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

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

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

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

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

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

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

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

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

Layer 2ソリューションを使用することで、イーサリアムメインネット上でのストレージと計算の必要を削減できます。

ETH-4.72%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 7
  • 共有
コメント
0/400
PrivacyMaximalistvip
· 19時間前
ガスはとても高いので、L2に行きましょう
原文表示返信0
0xSherlockvip
· 07-30 09:26
いつガス代はL2のように安くなるのですか
原文表示返信0
SnapshotBotvip
· 07-30 04:26
L2を遊ぶ方がいいですよ
原文表示返信0
MetaverseLandlordvip
· 07-30 04:18
高いガスを売って少し儲けようと思っているんだね。
原文表示返信0
BearMarketBuyervip
· 07-30 04:17
ガスが高すぎる、人を食べるぞ
原文表示返信0
LiquidityHuntervip
· 07-30 04:08
ガス最適化 0.7倍のアービトラージスペース ちょうど3つのスリッページ取引をキャッチしました
原文表示返信0
ContractFreelancervip
· 07-30 04:07
最適化は良いです。動作するなら最高です。
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)