Більшість витрат на газ 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.
Зверніть увагу на нижчу вартість газу порівняно зі сховищем.
Тепер, коли ви опанували деякі фундаментальні підходи до оптимізації сховища, важливо потренуватися. Скористайтеся запропонованими прикладами та експериментуйте, створюючи власні. У наступній сесії ми глибше розглянемо оптимізацію видимості функцій і повторне використання коду з бібліотеками. Пам’ятайте, що оптимізація – це мистецтво і наука. Продовжуйте експериментувати!
Більшість витрат на газ 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.
Зверніть увагу на нижчу вартість газу порівняно зі сховищем.
Тепер, коли ви опанували деякі фундаментальні підходи до оптимізації сховища, важливо потренуватися. Скористайтеся запропонованими прикладами та експериментуйте, створюючи власні. У наступній сесії ми глибше розглянемо оптимізацію видимості функцій і повторне використання коду з бібліотеками. Пам’ятайте, що оптимізація – це мистецтво і наука. Продовжуйте експериментувати!