Більшість витрат на газ Ethereum зосереджена навколо сховища. Кожна операція, яка змінює стан (зберігання) мережі Ethereum, як правило, дорога. У результаті зосередження на тому, як дані зберігаються та доступні, може призвести до значного скорочення витрат. У цій сесії ми розглянемо кілька способів оптимізації пам’яті за допомогою Remix.
Блокчейн Ethereum забезпечує постійне зберігання. Усе, що зберігається в блокчейні, буде доступним до тих пір, поки блокчейн живе, але ця постійність має свою ціну. Оптимізація сховища не тільки знижує витрати, але й забезпечує ефективне використання глобального стану Ethereum.
Solidity зберігає змінні в слотах. Кожен слот має 32 байти. Коли змінні можуть поміститися в один слот, їх можна прочитати або оновити за допомогою однієї операції SLOAD або SSTORE відповідно.
Розглянемо два договори:
Solidity 
 // Без оптимізації 
 pragma solidity ^0.8.9; 
 контракт UnoptimizedStorage {
    uint256 public value1;
    uint256 public value2;
}
Solidity 
 // З прагмою Optimization 
 solidity ^0.8.9; 
 контракт OptimizedStorage {
    uint128 public value1;
    uint128 public value2;
}
Розгорніть обидва контракти в Remix і зверніть увагу на відмінності газу під час взаємодії з їхніми змінними.
В оптимізованій версії value1 і value2 мають один 32-байтовий слот.
Коли ви закінчите використовувати слот для зберігання, особливо для тимчасового зберігання даних, ви можете видалити або обнулити слот, щоб отримати відшкодування за газ.
Solidity 
 pragma solidity ^0.8.9; 
 contract RefundExample { 
 uint256 public temporaryData; 
 функція storeTemporaryData(дані uint256) public {
        temporaryData = data;
    }
    функція clearTemporaryData() public {
        delete temporaryData;
    }
}
Розгорніть цей контракт у Remix.
Збережіть деякі тимчасові дані, а потім очистіть їх.
Перевірте вартість газу. Зверніть увагу на відшкодування газу, яке ви отримуєте за операцію delete .
Якщо доступ до даних у ланцюжку не потрібен, подумайте про те, щоб реєструвати їх як подію, а не зберігати. Події набагато дешевші, ніж операції зберігання.
Solidity 
 pragma solidity ^0.8.9; 
 контракт EventExample { 
 подія DataStored(uint256 data); 
 функція storeData(uint256 дані) public {
        emit DataStored(data);
    }
}
Розгортайте контракт і взаємодійте з ним у Remix.
Зверніть увагу на нижчу вартість газу порівняно зі сховищем.
Тепер, коли ви опанували деякі фундаментальні підходи до оптимізації сховища, важливо потренуватися. Скористайтеся запропонованими прикладами та експериментуйте, створюючи власні. У наступній сесії ми глибше розглянемо оптимізацію видимості функцій і повторне використання коду з бібліотеками. Пам’ятайте, що оптимізація – це мистецтво і наука. Продовжуйте експериментувати!