ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
Шекелей пачку Jolah Molivski
Привет всем, надеюсь, у вас все хорошо. Сегодня мы рассмотрим безопасность смарт-контрактов, о чем должен знать каждый разработчик перед созданием смарт-контракта. Смарт-контракты — это фрагменты кода, которые работают на блокчейне и обрабатывают миллионы долларов. Простая ошибка может привести к потере миллиона долларов. Чтобы избежать этого, сегодня мы узнаем о лучших практиках безопасности.
Изменение состояния должно быть выполнено перед внешними вызовами:
Согласно Consensys, «если вы вызываете ненадежный внешний контракт, избегайте изменения состояния после вызова ». Чтобы лучше понять это, давайте взглянем на уязвимый код.
Вышеупомянутый контракт имеет две функции, а именно депозит и снятие средств. Представьте, что это банк. Пользователи могут вносить свои деньги, а также могут снимать их.
Проблема здесь в том, что не реализована проверка того, достаточно ли у пользователя денег для вывода или нет.
Второй может быть использование .call() функции. Это может открыть возможность повторной атаки. Обратите внимание, что .call() ничего не делает для смягчения повторных атак, поэтому необходимо принять другие меры предосторожности.
Третьим недостатком может быть обновление баланса после перевода суммы вызывающему.
Итак, как это исправить?
Чтобы исправить это, нам нужно использовать шаблон проверки взаимодействия.
Что такое паттерн проверки- взаимодействия?
Паттерн проверки взаимодействия относится к различным проверкам, которые необходимо выполнить перед переводом средств на внешний контракт. Таким образом, мы можем предотвратить потерю средств.
Давайте посмотрим на код.
В приведенном выше контракте функция вывода имеет определенные проверки, в том числе 1) достаточно ли у пользователя баланса или нет
2) Изменение состояния выполняется до перевода средств
3) Использование функции .transfer() вместо .call(). Обратите внимание, что transfer() имеет лимит газа 2300. Таким образом, она предотвратит повторную атаку.
За первые шесть месяцев 2022 года было потеряно в два раза больше денег, чем за весь 2021 год. Чтобы избежать таких взломов, разработчики должны включить в свои смарт-контракты лучшие практики безопасности.
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
Шекелей пачку Jolah Molivski
Привет всем, надеюсь, у вас все хорошо. Сегодня мы рассмотрим безопасность смарт-контрактов, о чем должен знать каждый разработчик перед созданием смарт-контракта. Смарт-контракты — это фрагменты кода, которые работают на блокчейне и обрабатывают миллионы долларов. Простая ошибка может привести к потере миллиона долларов. Чтобы избежать этого, сегодня мы узнаем о лучших практиках безопасности.
Изменение состояния должно быть выполнено перед внешними вызовами:
Согласно Consensys, «если вы вызываете ненадежный внешний контракт, избегайте изменения состояния после вызова ». Чтобы лучше понять это, давайте взглянем на уязвимый код.
Вышеупомянутый контракт имеет две функции, а именно депозит и снятие средств. Представьте, что это банк. Пользователи могут вносить свои деньги, а также могут снимать их.
Проблема здесь в том, что не реализована проверка того, достаточно ли у пользователя денег для вывода или нет.
Второй может быть использование .call() функции. Это может открыть возможность повторной атаки. Обратите внимание, что .call() ничего не делает для смягчения повторных атак, поэтому необходимо принять другие меры предосторожности.
Третьим недостатком может быть обновление баланса после перевода суммы вызывающему.
Итак, как это исправить?
Чтобы исправить это, нам нужно использовать шаблон проверки взаимодействия.
Что такое паттерн проверки- взаимодействия?
Паттерн проверки взаимодействия относится к различным проверкам, которые необходимо выполнить перед переводом средств на внешний контракт. Таким образом, мы можем предотвратить потерю средств.
Давайте посмотрим на код.
В приведенном выше контракте функция вывода имеет определенные проверки, в том числе 1) достаточно ли у пользователя баланса или нет
2) Изменение состояния выполняется до перевода средств
3) Использование функции .transfer() вместо .call(). Обратите внимание, что transfer() имеет лимит газа 2300. Таким образом, она предотвратит повторную атаку.
За первые шесть месяцев 2022 года было потеряно в два раза больше денег, чем за весь 2021 год. Чтобы избежать таких взломов, разработчики должны включить в свои смарт-контракты лучшие практики безопасности.