第3课

Методы оптимизации газа с помощью Remix

Теперь, когда Вы освоили некоторые фундаментальные подходы к оптимизации хранения данных, очень важно практиковаться. Ознакомьтесь с предложенными примерами и поэкспериментируйте с созданием своих собственных. В следующей сессии мы более подробно рассмотрим оптимизацию видимости функций и повторное использование кода с помощью библиотек. Имейте в виду, что оптимизация - это и искусство, и наука. Продолжайте экспериментировать!

Оптимизация хранения

Большая часть газовых расходов Ethereum сосредоточена вокруг хранения. Каждая операция, изменяющая состояние (хранилище) сети Ethereum, как правило, требует больших затрат. В результате, концентрация внимания на том, как хранятся и доступны данные, может привести к значительному снижению затрат. В этой сессии мы рассмотрим несколько способов оптимизации хранения данных с помощью Remix.

Почему хранение данных стоит дорого?

Блокчейн Ethereum обеспечивает постоянное хранение данных. Все, что сохраняется в блокчейне, будет доступно до тех пор, пока существует блокчейн, но за это постоянство приходится платить. Оптимизация хранения не только снижает затраты, но и обеспечивает эффективное использование глобального состояния Ethereum.

Упаковочные переменные для хранения

Введение

Solidity хранит переменные в слотах. Каждый слот имеет размер 32 байта. Если переменные умещаются в одном слоте, их можно прочитать или обновить с помощью одной операции SLOAD или SSTORE, соответственно.

Пример

Рассмотрим два контракта:

Solidity
// Без оптимизации
pragma solidity ^0.8.9;

contract UnoptimizedStorage {
    uint256 public value1;
    uint256 public value2;
}
Solidity
// С оптимизацией
pragma solidity ^0.8.9;

contract OptimizedStorage {
    uint128 public value1;
    uint128 public value2;
}
  1. Разверните оба контракта в Remix и обратите внимание на газовые различия при взаимодействии с их переменными.

  2. В оптимизированном варианте и value1, и value2 делят один 32-байтовый слот.

Повторное использование слотов для хранения

Введение

Когда Вы закончили использовать слот для хранения данных, особенно временного хранения, Вы можете удалить или обнулить слот, чтобы получить возврат газа.

Пример

Solidity
pragma solidity ^0.8.9;

contract RefundExample {
 uint256 public temporaryData;

 function storeTemporaryData(uint256 data) public {
        temporaryData = data;
    }

    function clearTemporaryData() public {
        delete temporaryData;
    }
}
  1. Разверните этот контракт в Remix.

  2. Сохраните некоторые временные данные, а затем очистите их.

  3. Проверьте стоимость газа. Обратите внимание на возврат газа, который Вы получаете за операцию удаления.

Использование событий вместо хранилища для исторических данных

Введение

Если к данным не нужно обращаться на цепи, подумайте о том, чтобы не хранить их, а регистрировать как событие. События гораздо дешевле, чем операции хранения.

Пример

Solidity
pragma solidity ^0.8.9;

contract EventExample {
 event DataStored(uint256 data);

 function storeData(uint256 data) public {
        emit DataStored(data);
    }
}.
  1. Разверните контракт и взаимодействуйте с ним в Remix.

  2. Обратите внимание на более низкую стоимость газа по сравнению с хранением.

Заглядывая в будущее

Теперь, когда Вы освоили некоторые фундаментальные подходы к оптимизации хранения, очень важно практиковаться. Ознакомьтесь с предложенными примерами и поэкспериментируйте с созданием своих собственных. В следующей сессии мы более подробно рассмотрим оптимизацию видимости функций и повторное использование кода с помощью библиотек. Имейте в виду, что оптимизация - это и искусство, и наука. Продолжайте экспериментировать!

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

Методы оптимизации газа с помощью Remix

Теперь, когда Вы освоили некоторые фундаментальные подходы к оптимизации хранения данных, очень важно практиковаться. Ознакомьтесь с предложенными примерами и поэкспериментируйте с созданием своих собственных. В следующей сессии мы более подробно рассмотрим оптимизацию видимости функций и повторное использование кода с помощью библиотек. Имейте в виду, что оптимизация - это и искусство, и наука. Продолжайте экспериментировать!

Оптимизация хранения

Большая часть газовых расходов Ethereum сосредоточена вокруг хранения. Каждая операция, изменяющая состояние (хранилище) сети Ethereum, как правило, требует больших затрат. В результате, концентрация внимания на том, как хранятся и доступны данные, может привести к значительному снижению затрат. В этой сессии мы рассмотрим несколько способов оптимизации хранения данных с помощью Remix.

Почему хранение данных стоит дорого?

Блокчейн Ethereum обеспечивает постоянное хранение данных. Все, что сохраняется в блокчейне, будет доступно до тех пор, пока существует блокчейн, но за это постоянство приходится платить. Оптимизация хранения не только снижает затраты, но и обеспечивает эффективное использование глобального состояния Ethereum.

Упаковочные переменные для хранения

Введение

Solidity хранит переменные в слотах. Каждый слот имеет размер 32 байта. Если переменные умещаются в одном слоте, их можно прочитать или обновить с помощью одной операции SLOAD или SSTORE, соответственно.

Пример

Рассмотрим два контракта:

Solidity
// Без оптимизации
pragma solidity ^0.8.9;

contract UnoptimizedStorage {
    uint256 public value1;
    uint256 public value2;
}
Solidity
// С оптимизацией
pragma solidity ^0.8.9;

contract OptimizedStorage {
    uint128 public value1;
    uint128 public value2;
}
  1. Разверните оба контракта в Remix и обратите внимание на газовые различия при взаимодействии с их переменными.

  2. В оптимизированном варианте и value1, и value2 делят один 32-байтовый слот.

Повторное использование слотов для хранения

Введение

Когда Вы закончили использовать слот для хранения данных, особенно временного хранения, Вы можете удалить или обнулить слот, чтобы получить возврат газа.

Пример

Solidity
pragma solidity ^0.8.9;

contract RefundExample {
 uint256 public temporaryData;

 function storeTemporaryData(uint256 data) public {
        temporaryData = data;
    }

    function clearTemporaryData() public {
        delete temporaryData;
    }
}
  1. Разверните этот контракт в Remix.

  2. Сохраните некоторые временные данные, а затем очистите их.

  3. Проверьте стоимость газа. Обратите внимание на возврат газа, который Вы получаете за операцию удаления.

Использование событий вместо хранилища для исторических данных

Введение

Если к данным не нужно обращаться на цепи, подумайте о том, чтобы не хранить их, а регистрировать как событие. События гораздо дешевле, чем операции хранения.

Пример

Solidity
pragma solidity ^0.8.9;

contract EventExample {
 event DataStored(uint256 data);

 function storeData(uint256 data) public {
        emit DataStored(data);
    }
}.
  1. Разверните контракт и взаимодействуйте с ним в Remix.

  2. Обратите внимание на более низкую стоимость газа по сравнению с хранением.

Заглядывая в будущее

Теперь, когда Вы освоили некоторые фундаментальные подходы к оптимизации хранения, очень важно практиковаться. Ознакомьтесь с предложенными примерами и поэкспериментируйте с созданием своих собственных. В следующей сессии мы более подробно рассмотрим оптимизацию видимости функций и повторное использование кода с помощью библиотек. Имейте в виду, что оптимизация - это и искусство, и наука. Продолжайте экспериментировать!

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