Lição 5

Финал оптимизации смарт-контрактов - продвинутые советы и рекомендации

В наших предыдущих уроках мы рассмотрели основные понятия и инструменты, необходимые Вам для оптимизации газа в смарт-контрактах Ethereum, особенно с использованием Remix IDE. Завершая этот курс, давайте рассмотрим некоторые продвинутые техники и лучшие практики. В этом заключительном уроке мы объединим накопленные нами знания, гарантируя, что Вы уйдете с полным пониманием оптимизации газа в смарт-контрактах 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 очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.
Catálogo
Lição 5

Финал оптимизации смарт-контрактов - продвинутые советы и рекомендации

В наших предыдущих уроках мы рассмотрели основные понятия и инструменты, необходимые Вам для оптимизации газа в смарт-контрактах Ethereum, особенно с использованием Remix IDE. Завершая этот курс, давайте рассмотрим некоторые продвинутые техники и лучшие практики. В этом заключительном уроке мы объединим накопленные нами знания, гарантируя, что Вы уйдете с полным пониманием оптимизации газа в смарт-контрактах 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 очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.