Ограничения на газ и уязвимости DoS-атак в смарт-контрактах
Ограничения на газ и уязвимости DoS-атак в смарт-контрактах

Ограничения на газ и DoS-атаки

Ограничения по газу и DoS (отказ в обслуживании) of Атаки на обслуживание (отказ в обслуживании) являются распространенной угрозой безопасности в средах блокчейнов и смарт-контрактов, особенно для таких платформ, как Ethereum, где газ — это единица измерения стоимости выполнения смарт-контракта. Первоначальное намерение Газового механизма – предотвратить бесконечное злоупотребление циклами и ресурсами, но также предоставляет злоумышленникам пространство для использования.

Механизм ограничения газа

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

Метод DoS-атаки
Выхлопные газы

Злоумышленник может намеренно потреблять большое количество газа, создавая очень сложные транзакции или смарт-контракты, чтобы обычные транзакции не могли быть включены в блок. Например, злоумышленник может создать контракт, который выполняет большое количество вычислений или операций хранения при получении сообщения, потребляя количество газа, близкое к максимальному пределу газа. Когда в сеть одновременно отправляется множество таких транзакций, они занимают большую часть или даже всю емкость газа, в результате чего обычные транзакции других пользователей не подтверждаются, тем самым достигая эффекта отказа в обслуживании.

бесконечный цикл

Другой способ DoS-атаки — превратить смарт-контракт в бесконечный. цикла, это приведет к немедленному исчерпанию газа, транзакция завершится неудачно и будет откачена. Эта атака обычно происходит при наличии ошибок в логике контракта, таких как неправильная обработка условий выхода из цикла или отсутствие условий завершения в рекурсивных вызовах. Когда вступает в бесконечный договор циклчас,Он попытается израсходовать весь доступный газ.,В конце концов транзакция не удалась,и может сделать контракт недоступным.

защитные меры

Чтобы защититься от такого типа DoS-атак, разработчикам необходимо принять некоторые меры предосторожности при написании смарт-контрактов:

  1. Ограничьте количество циклов:Убедитесь, что любой цикл имеет четкое условие завершения.,избегатьбесконечный возможность цикла.
  2. Оптимизация эффективности кода:Минимизируйте ненужные вычислительные операции и операции хранения.,Избегайте алгоритмов высокой сложности.
  3. Используйте платформы безопасности и библиотеки:Используйте, например.OpenZeppelinждатьсмарт-контракт Безопасность Библиотека,Обычно они содержат тщательно проверенные шаблоны и функции безопасности.,Может помочь избежать распространенных ошибок безопасности.
  4. Обзор и тестирование кода:Регулярно проводите проверки кода и Безопасностьаудит,Проверяйте потенциальные лазейки с помощью формальных инструментов проверки.
  5. Установить лимит газа:существоватьсмарт-контракт Установите разумное значение при вызовеGasверхний предел,Не позволяйте злонамеренным вызовам потреблять слишком много ресурсов.
  6. Динамическое ценообразование на газ:Рассмотрите возможность реализации динамическогоGasмеханизм ценообразования,Автоматически корректировать цены на газ в зависимости от нагрузки,поощрять определение приоритетности важных транзакций.

Благодаря вышеуказанным мерам риск смарт-контрактов, страдающих от DoS-атак, может быть значительно снижен, обеспечивая стабильность сети и безопасность активов пользователей. Однако из-за сложности среды блокчейна необходимы постоянная осведомленность о безопасности и современные методы обеспечения безопасности.

Пример уязвимого контракта
Язык кода:javascript
копировать
// 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, что сделает завершение цикла практически невозможным и израсходует весь газ.

Язык кода:javascript
копировать
InfiniteLoopVulnerable contract = new InfiniteLoopVulnerable();
contract.loopUntilZero(2**256-1);
защитные меры

Чтобы предотвратить этот бесконечный DoS-атаки цикла, нам необходимо добавить некоторые ограничения и оптимизации в дизайн контракта:

  • 1、Ограничьте количество циклов: Вы можете установить верхний предел максимального количества циклов, чтобы избежать бесконечного Возникновение цикл.
  • 2. Проверьте и исправьте логику: убедитесь, что в цикле присутствуют правильные условия выхода.
  • 3. Оптимизация эффективности использования газа: максимально сократите операции в каждом цикле, чтобы снизить потребление газа.

Вот пример фиксированного договора:

Язык кода:javascript
копировать
// 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--;
        }
        // Нормальная работа...
    }
}
boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.