第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 очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第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 очень многочисленно и полезно, поэтому никогда не бойтесь обращаться за советом или передовым опытом. Получайте удовольствие от кодирования!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。