イーサリアムのガス支出の大部分はストレージに集中しています。 イーサリアムネットワークの状態(ストレージ)を変更する各操作は、通常、コストがかかります。 その結果、データの保持方法とアクセス方法に集中することで、大幅なコスト削減につながる可能性があります。 このセッションでは、Remixでストレージを最適化する方法をいくつか見ていきます。
イーサリアムブロックチェーンは、恒久的なストレージを提供します。 ブロックチェーンに保存されたすべてのものは、ブロックチェーンが存続する限り利用できますが、この永続性にはコストがかかります。 ストレージを最適化することで、コストが削減されるだけでなく、イーサリアムのグローバル状態が効率的に使用されるようになります。
Solidityは変数をスロットに格納します。 各スロットは 32 バイトです。 変数が 1 つのスロットに収まる場合は、それぞれ 1 回の SLOAD または SSTORE 操作で読み取りまたは更新できます。
次の 2 つの契約について考えてみます。
硬度
最適化なし
プラグマの堅実さ^0.8.9;
コントラクト UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
硬度
最適化あり
プラグマの堅実さ^0.8.9;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
両方のコントラクトを Remix にデプロイし、変数を操作するときにガスの違いを確認します。
最適化されたバージョンでは、両方value1
value2
と が 1 つの 32 バイト スロットを共有します。
ストレージスロット、特に一時的なデータストレージを使い終わったら、スロットを削除またはゼロにして、ガスの払い戻しを受けることができます。
硬度
プラグマの堅実さ^0.8.9;
contract 返金例 {
uint256 public temporaryDataです。
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
関数 clearTemporaryData() public {
delete temporaryData;
}
}
このコントラクトを Remix にデプロイします。
一時データを格納し、クリアします。
ガス代を確認してください。 手術で delete
得られるガスの払い戻しに注目してください。
オンチェーンでデータにアクセスする必要がない場合は、保存するのではなく、イベントとして記録することを検討してください。 イベントは、ストレージ操作よりもはるかに安価です。
硬度
プラグマの堅実さ^0.8.9;
contract EventExample {
イベントDataStored(uint256データ);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
Remix でコントラクトを展開して操作します。
貯蔵と比較すると、ガス代が安いことに注意してください。
基本的なストレージ最適化のアプローチをマスターした今、練習することが重要です。 提供されている例に取り組み、独自の例を作成してみてください。 次のセッションでは、関数の可視性の最適化とライブラリでのコードの再利用について詳しく説明します。 最適化は芸術であり、科学でもあることを心に留めておいてください。 実験を続けてください!
イーサリアムのガス支出の大部分はストレージに集中しています。 イーサリアムネットワークの状態(ストレージ)を変更する各操作は、通常、コストがかかります。 その結果、データの保持方法とアクセス方法に集中することで、大幅なコスト削減につながる可能性があります。 このセッションでは、Remixでストレージを最適化する方法をいくつか見ていきます。
イーサリアムブロックチェーンは、恒久的なストレージを提供します。 ブロックチェーンに保存されたすべてのものは、ブロックチェーンが存続する限り利用できますが、この永続性にはコストがかかります。 ストレージを最適化することで、コストが削減されるだけでなく、イーサリアムのグローバル状態が効率的に使用されるようになります。
Solidityは変数をスロットに格納します。 各スロットは 32 バイトです。 変数が 1 つのスロットに収まる場合は、それぞれ 1 回の SLOAD または SSTORE 操作で読み取りまたは更新できます。
次の 2 つの契約について考えてみます。
硬度
最適化なし
プラグマの堅実さ^0.8.9;
コントラクト UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
硬度
最適化あり
プラグマの堅実さ^0.8.9;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
両方のコントラクトを Remix にデプロイし、変数を操作するときにガスの違いを確認します。
最適化されたバージョンでは、両方value1
value2
と が 1 つの 32 バイト スロットを共有します。
ストレージスロット、特に一時的なデータストレージを使い終わったら、スロットを削除またはゼロにして、ガスの払い戻しを受けることができます。
硬度
プラグマの堅実さ^0.8.9;
contract 返金例 {
uint256 public temporaryDataです。
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
関数 clearTemporaryData() public {
delete temporaryData;
}
}
このコントラクトを Remix にデプロイします。
一時データを格納し、クリアします。
ガス代を確認してください。 手術で delete
得られるガスの払い戻しに注目してください。
オンチェーンでデータにアクセスする必要がない場合は、保存するのではなく、イベントとして記録することを検討してください。 イベントは、ストレージ操作よりもはるかに安価です。
硬度
プラグマの堅実さ^0.8.9;
contract EventExample {
イベントDataStored(uint256データ);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
Remix でコントラクトを展開して操作します。
貯蔵と比較すると、ガス代が安いことに注意してください。
基本的なストレージ最適化のアプローチをマスターした今、練習することが重要です。 提供されている例に取り組み、独自の例を作成してみてください。 次のセッションでは、関数の可視性の最適化とライブラリでのコードの再利用について詳しく説明します。 最適化は芸術であり、科学でもあることを心に留めておいてください。 実験を続けてください!