Уязвимости смарт контрактов – полный список типичных ошибок

Смарт контракт – это компьютерный алгоритм, предназначенный для заключения и поддержания коммерческих проектов созданных на базе технологии блокчейн.Они сейчас очень популяризованы, но имеют ряд уязвимостей.

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

Исследование умных слабых мест контракта: король эфира

Так, “Король Трона Эфира” (KotET) является игрой, где участники конкурируют друг с другом для титула “Короля Эфира”. Так, как это работает?

Простым предложением цены. Вот то, как торги работают согласно их веб-сайту:

Предположим, что текущая цена заявления за трон – 10 эфиров.
Вы хотите быть Королем/Королевой, таким образом, Вы посылаете 10 эфиров в контракт.
Контракт посылает Ваши 10 эфиров (меньше 1%-я комиссия) предыдущему Королю/Королеве как “выплата компенсации”.
Контракт делает Вас новым Королем/Королевой Трона Эфира.
Новая цена заявления за трон повышается на 50% к 15 эфирам в этом случае.
Если узурпатор приезжает, кто готов заплатить 15 эфиров, они свергают Вас и становятся Королем/Королевой, и Вы получаете их оплату 15 эфиров как Ваша “выплата компенсации”.

Проще говоря, это – Схема Понци.

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

Кто такой Этэреум Гас? (Умные Слабые места Контракта)

“Газ” – жизненная основа экосистемы Этэреума, нет никакого другого способа поместить это. Газ – единица, которая измеряет количество вычислительных усилий, которые это приложит, чтобы выполнить определенные операции.

Каждая операция, которая принимает участие в Этэреуме, быть им простая сделка, или умный контракт, или даже ICO, берет некоторое количество газа. Газ – то, что используется, чтобы вычислить количество платы, которая должна быть внесена к сети, чтобы выполнить операцию.

Все умные контракты, которые бегут в EVM, закодированы, используя основательность (Этэреум планирует идти дальше к Vyper от Основательности в будущем.) Каждая линия кодекса в основательности требует, чтобы определенное количество газа было вычислено.

Чтобы лучше понять как газовый завод в Этэреуме, давайте использовать аналогию. Предположим, что Вы идете на поездку. Прежде чем Вы сделаете так, Вы проходите эти шаги:

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

Автомобиль – операция, которую Вы хотите выполнить, как газ или умный контракт.
Газ хорошо … .gas.
Автозаправочная станция – Ваш шахтер.
Деньги, которые Вы заплатили им, являются сборами шахтера.
Все операции, которые пользователи хотят выполнить там, должны обеспечить газ для следующего:

Покрывать его данные иначе внутренний газ.
Покрывать его все вычисление.
Что такое Газовый Предел?
Чтобы сделать операцию в Этэреуме, операционный генератор (т.е. человек, начинающий сделку или умного создателя контракта), должен определить газовый предел, прежде чем они представят его шахтерам. Когда газовый предел будет определен, только тогда будет шахтеры начинать выполнять операцию.

Представляя газовый предел, следующие моменты нужно рассмотреть:

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

Давайте посмотрим это в операции в гипотетическом сценарии:

Предположим, мы добавляем два числа и для этого, контракт должен сделать следующие действия:

Хранение 10 в переменной. Скажем, эта операция стоит 45 wei газов.
Добавляя две переменные, скажем, это стоит 10 wei газов.
Хранение результата, который снова стоит 45 wei газов.

Предположим, что газовый предел – 120 wei.

Весь газ, используемый шахтером, (45+10+45) 100 wei.

Сборы, который должен им принимающий 1 затраты wei 0.02 микро ETH, (100*0.02 микро ETH) = 0.000002 ETH.

Теперь, сколько газа перенесено?

120 – 100 = 20 wei.

20 wei возмещены назад операционному генератору.

Таким образом, что пошло не так, как надо с KotET?
Контракты KotET вели себя довольно обычно кроме во время одного сценария. Когда контракт KotET послал оплату “счету контракта”, он так или иначе только ассигновал небольшое количество газа … 2300, чтобы быть точным. Это – достаточно ясно газ, чтобы покрыть расходы.

Как KotET выражается,

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

Давайте попытаемся расстройство все, что пошло не так, как надо здесь:

Газовый предел 2300.
Контракт кошелька тумана, который был недостаточен для оплаты, которая будет принята контрактом кошелька.
KotET заключают контракт, разработчик не знал о 2300 газовых пределах, которые были включены, посылая оплату.
KotET заключают контракт, разработчик не знал о той любой части сделки, мог потерпеть неудачу и вернуться без целого провала цепи и возвращения.

Минимальная бета-тестирование в реальном KotET сокращает разработчиков.

Функция отступления в контрактах кошелька, используемых Кошельком Тумана Ethereum, требует большего количества газа, чем 2300 доступных во время <адрес> .send (<сумма>) требование.

Рассмотрение кодекса (умные слабые места контракта)
Этот контракт – упрощенное представление игры:

Согласно контракту, когда участник посылает эфир в контракт (msg.value), они также вызывают отступление KotET по умолчанию. Отступление KotET сначала проверяет, достаточно ли посланного эфира, чтобы получить название.

В противном случае это возвращается передача эфира. Если да, участник выбран в качестве нового короля. Когда это происходит, аккомпанементensations посылают предыдущему королю, и участник коронован. Различие между деньгами, посланными новым королем и компенсацией старому королю, сохранено контрактом. Владелец KotET может забрать все эти эфиры, накопленные в контракте через sweepCommission.

Уязвимость находится я послать функция, Если функция будет оборудована недостаточным газом, king.send (компенсация) потерпит неудачу, если адрес короля будет адресом контракта с дорогим отступлением. В этом случае компенсация просто сохранена контрактом вместо предыдущего короля.

Умное заключение слабых мест контракта

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

Читайте также: