Ограничения по газу и DoS (отказ в обслуживании) of Атаки на обслуживание (отказ в обслуживании) являются распространенной угрозой безопасности в средах блокчейнов и смарт-контрактов, особенно для таких платформ, как Ethereum, где газ — это единица измерения стоимости выполнения смарт-контракта. Первоначальное намерение Газового механизма – предотвратить бесконечное злоупотребление циклами и ресурсами, но также предоставляет злоумышленникам пространство для использования.
В Ethereum каждая транзакция несет определенное количество газа. Это делается для того, чтобы любые выполняемые операции не потребляли слишком много вычислительных ресурсов, что позволяет избежать перегрузки сети или истощения ресурсов. Когда транзакция начинает выполняться, она вычитает комиссию из общей суммы газа, предоставленного трейдером, до тех пор, пока исполнение контракта не будет завершено или газ не будет исчерпан. Если во время выполнения Gas будет исчерпан, транзакция будет отменена, и израсходованный Gas не будет возвращен пользователю.
Злоумышленник может намеренно потреблять большое количество газа, создавая очень сложные транзакции или смарт-контракты, чтобы обычные транзакции не могли быть включены в блок. Например, злоумышленник может создать контракт, который выполняет большое количество вычислений или операций хранения при получении сообщения, потребляя количество газа, близкое к максимальному пределу газа. Когда в сеть одновременно отправляется множество таких транзакций, они занимают большую часть или даже всю емкость газа, в результате чего обычные транзакции других пользователей не подтверждаются, тем самым достигая эффекта отказа в обслуживании.
Другой способ DoS-атаки — превратить смарт-контракт в бесконечный. цикла, это приведет к немедленному исчерпанию газа, транзакция завершится неудачно и будет откачена. Эта атака обычно происходит при наличии ошибок в логике контракта, таких как неправильная обработка условий выхода из цикла или отсутствие условий завершения в рекурсивных вызовах. Когда вступает в бесконечный договор циклчас,Он попытается израсходовать весь доступный газ.,В конце концов транзакция не удалась,и может сделать контракт недоступным.
Чтобы защититься от такого типа DoS-атак, разработчикам необходимо принять некоторые меры предосторожности при написании смарт-контрактов:
Благодаря вышеуказанным мерам риск смарт-контрактов, страдающих от DoS-атак, может быть значительно снижен, обеспечивая стабильность сети и безопасность активов пользователей. Однако из-за сложности среды блокчейна необходимы постоянная осведомленность о безопасности и современные методы обеспечения безопасности.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract InfiniteLoopVulnerable {
function loopUntilZero(uint256 startValue) public payable {
uint256 currentValue = startValue;
while (currentValue > 0) {
currentValue--;
}
// Нормальная работа...
}
}
в этом контракте,Функция LoopUntilZero перейдет в бесконечный цикл.,Если startValue установлено достаточно большим,Тогда этот контур будет потреблять весь доступный газ.,Вызывает сбой транзакции и ее откат.
Злоумышленник может вызвать функцию LoopUntilZero, передав очень большое значение, например 2^256-1, что сделает завершение цикла практически невозможным и израсходует весь газ.
InfiniteLoopVulnerable contract = new InfiniteLoopVulnerable();
contract.loopUntilZero(2**256-1);
Чтобы предотвратить этот бесконечный DoS-атаки цикла, нам необходимо добавить некоторые ограничения и оптимизации в дизайн контракта:
Вот пример фиксированного договора:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SafeInfiniteLoop {
function safeLoopUntilZero(uint256 startValue) public payable {
require(startValue <= 10000, "Value too large"); // Установите максимальное количество петель
uint256 currentValue = startValue;
while (currentValue > 0) {
currentValue--;
}
// Нормальная работа...
}
}