Один из самых простых способов экономии газа - это упрощение Вашего кода. Чем меньше кода нужно выполнить, тем меньше расходуется газа.
Рассмотрим следующую функцию:
Solidity
pragma solidity ^0.8.9;
contract OptimizationExample {
address[] public admins;
function isUserAdmin(address user) public view returns (bool) {
for (uint i = 0; i < admins.length; i++) {
if (admins[i] == user) return true;
}
return false;
}
}
В приведенной выше функции используется цикл, который становится все более затратным по мере добавления большего количества администраторов. В более газоэффективной структуре будет использоваться картирование:
Solidity
contract OptimizationExampleOptimized {
mapping(address => bool) public admins;
function isUserAdmin(address user) public view returns (bool) {
return admins[user];
}
}
Работая с Ethereum, помните, что Вы платите за каждый бит хранения. Если Вы обнаружите, что храните одни и те же данные в нескольких местах, подумайте, как Вы можете хранить их один раз и ссылаться на них в других местах.
Библиотеки в Solidity - это многократно используемые фрагменты кода. Они могут помочь Вам написать модульный код, а поскольку они развертываются только один раз и связаны с другими контрактами, то в долгосрочной перспективе они могут сэкономить газ.
Solidity
библиотека SafeMath {
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
//... другие математические функции
}
contract UsingSafeMath {
using SafeMath for uint;
uint public value;
function increment(uint _value) public {
value = value.add(_value);
}
}
Ключевое слово delete
в Solidity позволяет Вам обнулять переменные, что возвращает часть газа. Если Вы закончили работу с определенной частью хранилища, удалите ее, чтобы потребовать возврата денег.
В то время как хранение данных в блокчейне может быть дорогостоящим, протоколирование событий обходится сравнительно дешевле. Если у Вас есть данные, которые не нужно считывать из контракта, но которые должны быть проверяемы, рассмотрите возможность использования журналов событий.
Некоторые операции являются более газоемкими, чем другие. Например:
Оптимизация смарт-контрактов для газа - это и искусство, и наука. Подходы, обсуждаемые в этом курсе, в сочетании друг с другом способны значительно снизить газовые расходы по Вашим контрактам. Имейте в виду, что экосистема Ethereum и ее инструменты, включая Remix, постоянно меняются. Постоянно обновляйте, тестируйте и улучшайте свои контракты для оптимизации. Сообщество Ethereum очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!
Один из самых простых способов экономии газа - это упрощение Вашего кода. Чем меньше кода нужно выполнить, тем меньше расходуется газа.
Рассмотрим следующую функцию:
Solidity
pragma solidity ^0.8.9;
contract OptimizationExample {
address[] public admins;
function isUserAdmin(address user) public view returns (bool) {
for (uint i = 0; i < admins.length; i++) {
if (admins[i] == user) return true;
}
return false;
}
}
В приведенной выше функции используется цикл, который становится все более затратным по мере добавления большего количества администраторов. В более газоэффективной структуре будет использоваться картирование:
Solidity
contract OptimizationExampleOptimized {
mapping(address => bool) public admins;
function isUserAdmin(address user) public view returns (bool) {
return admins[user];
}
}
Работая с Ethereum, помните, что Вы платите за каждый бит хранения. Если Вы обнаружите, что храните одни и те же данные в нескольких местах, подумайте, как Вы можете хранить их один раз и ссылаться на них в других местах.
Библиотеки в Solidity - это многократно используемые фрагменты кода. Они могут помочь Вам написать модульный код, а поскольку они развертываются только один раз и связаны с другими контрактами, то в долгосрочной перспективе они могут сэкономить газ.
Solidity
библиотека SafeMath {
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
//... другие математические функции
}
contract UsingSafeMath {
using SafeMath for uint;
uint public value;
function increment(uint _value) public {
value = value.add(_value);
}
}
Ключевое слово delete
в Solidity позволяет Вам обнулять переменные, что возвращает часть газа. Если Вы закончили работу с определенной частью хранилища, удалите ее, чтобы потребовать возврата денег.
В то время как хранение данных в блокчейне может быть дорогостоящим, протоколирование событий обходится сравнительно дешевле. Если у Вас есть данные, которые не нужно считывать из контракта, но которые должны быть проверяемы, рассмотрите возможность использования журналов событий.
Некоторые операции являются более газоемкими, чем другие. Например:
Оптимизация смарт-контрактов для газа - это и искусство, и наука. Подходы, обсуждаемые в этом курсе, в сочетании друг с другом способны значительно снизить газовые расходы по Вашим контрактам. Имейте в виду, что экосистема Ethereum и ее инструменты, включая Remix, постоянно меняются. Постоянно обновляйте, тестируйте и улучшайте свои контракты для оптимизации. Сообщество Ethereum очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!