10大実践がスマートコントラクトのGas費用最適化を助け、イーサリアムの取引コストをドロップ

スマートコントラクトGas最適化ガイド:10の実践が取引コストをドロップするのを助ける

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

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

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

EVMのガス料金メカニズムの紹介

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

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

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

EIP-1559の施行以来、Gas費は以下の公式で計算されています:

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

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

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

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

Solidityでスマートコントラクトをコンパイルすると、コントラクトは一連の"操作コード"、すなわちopcodesに変換されます。

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

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

ガス最適化の基本概念

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倍以上高いです。例えば、OPcodeのmloadとmstore命令は3 Gas単位しか消費しませんが、ストレージ操作であるsloadとsstoreは、最も理想的な状況でもコストが少なくとも100単位必要です。

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

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

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

) 2. 変数パッケージ

スマートコントラクト中使用のStorage slot###ストレージスロット(の数量および開発者がデータを表現する方法は、Gas費の消費に大きく影響します。

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

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

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

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

) 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の最小の長さを選択してください。

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

) 5. マッピングと配列

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

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

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

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

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

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

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

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

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

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

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

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

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

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

) 9. オプティマイザ

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

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

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

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

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

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

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

一般的な追加のアドバイス

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

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

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

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

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

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

2. プリコンパイルコントラクトを使用する

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

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

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

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

GAS-1.84%
ETH-0.05%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 4
  • 共有
コメント
0/400
SilentObservervip
· 23時間前
ガスこんなに高い、貧乏で泣いてる555
原文表示返信0
ConfusedWhalevip
· 23時間前
昼間こんなにお金がかかるなら、夜はどう遊ぶの?
原文表示返信0
NightAirdroppervip
· 23時間前
ethは人をカモにするからガスが上昇する。
原文表示返信0
SybilSlayervip
· 23時間前
ガス焼き金 誰が耐えられるか
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)