問題一覧に戻る
上級ガス最適化
問題83: ストレージ最適化

Solidityのストレージパッキングを学習 - 変数配置でガスコストを最適化。Ethereumストレージは32バイトスロットを使用し、スロット書き込みに約2万ガス。32バイト未満の変数は連続して宣言するとスロットを共有可能。適切なパッキングはストレージ操作とガスコストを大幅に削減。ストレージレイアウトの理解は、ガス効率の良いコントラクト構築と低い取引コストでのUX最適化に重要です。

pragma solidity ^0.8.0;

contract StorageOptimized {
// 非効率:4スロット使用
struct BadUser {
bool isActive; // 1 byte
uint256 balance; // 32 bytes
uint8 level; // 1 byte
address wallet; // 20 bytes
}

// 効率的:2スロット使用
struct GoodUser {
bool isActive; // 1 byte
uint8 level; // 1 byte
address wallet; // 20 bytes
uint256 balance; // 32 bytes
}

// 1スロットパッキング
uint128 public value1; // First half of slot
uint128 public value2; // half of slot

// 別々のスロット
uint256 public bigValue1; // Full slot
uint256 public bigValue2; // slot

function updateValues(uint128 _v1, uint128 _v2) public {
// 1スロット書き込み
value1 = ;
value2 = ; // Same slot write
}

function updateBigValues(uint256 _b1, uint256 _b2) public {
// 複数スロット書き込み
bigValue1 = ; // Slot 1 write
bigValue2 = ; // Slot 2 write
}
}