Смарт-контракты: как достать монетку из пустого кармана

Что такое целочисленное переполнение и почему об этом нужно знать, если вы используете смарт-контракты?

Если вы интересуетесь блокчейном и криптовалютами и даже разобрались в том, как работают смарт-контракты, то вам наверняка не помешает знать, что такое «целочисленное переполнение». И вот почему.

Говоря простыми словами, если целое число без знака хранится в ячейке памяти длиной 1 байт, то оно может принимать только значения от 0 до 255. Это значит, что если не заданы дополнительные условия, то 255 + 1 = 0, но, что гораздо неприятнее, 0 – 1 = 255. Именно так процессоры обычно обрабатывают данные.

В современных языках программирования (не во всех, конечно) программа сама контролирует, а не произошло ли переполнения во время арифметических действий. Если да, то, вероятнее всего, это совсем не то, что хотел программист, и чтобы проблемы не возникли намного позже, выполнение программы стоит прервать сразу же.

При чем тут смарт-контракты?

А при том, что в смарт-контрактах для Ethereum такого контроля не предусмотрено. То есть, если у вас ноль токенов, а вы переводите один другу, то у вас становится квинтиллион токенов. Куда логичнее было бы, чтобы программа прервала работу, а ошибочная транзакция отменилась.

Почему разработчики Ethereum реализовали арифметику так, а не иначе — загадка. Однако для того, чтобы в смарт-контрактах работала привычная нам арифметика, каждый программист смарт-контрактов вынужден добавлять в свой код более 100 строчек с функциями сложения, умножения и так далее.

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

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

Переполнение и биткойны

Справедливости ради, переполнение — проблема, свойственная не только Ethereum. Задолго до этого с такой же проблемой столкнулся и Bitcoin.

В августе 2010-го на двух биткойн-кошельках как раз из-за переполнения образовалось 184 миллиарда биткойнов. Нет смысла говорить, что такое развитие событий не устраивало создателей. Они (в лице Сатоши Накамото) быстро поправили баг, откатили финансовую историю и сделали вид, что ничего не произошло.

Но чем чревата отмотка истории? Это значит, что если я в тот день у кого-то купил биткойнов на 10 000$, то после отката мои биткойны улетят обратно продавцу, а вот доллары уже не вернутся. Произойди такое сейчас, а не в 2010 году, последствия были бы колоссальными, ведь суточный объем торгов биткойнами составляет $5 миллиардов.

Этот случай, как и другие, показывает, что блокчейн непоколебим, но только в определенных рамках, когда все идет по плану. Иначе поменяют и план — и сам блокчейн заодно.

И вновь про смарт-контракты

Решение разработчиков Ethereum выглядит более чем странно: они расставили капканы для программистов смарт-контрактов, и надо быть очень опытным и внимательным, чтобы вы или ваши инвесторы не потеряли в одночасье все деньги. И это еще одна причина, по которой имеет смысл тщательно проверять код смарт-контрактов. В рамках предложения Kaspersky Token Offering Security наши эксперты проводят анализ исходного кода таких программ в поисках уязвимостей и незадокументированных особенностей. Подробнее — на странице проекта Kaspersky Token Offering Security.

Советы