Три ошибки в блокчейне, которые делают людей миллионерами — опыт инженера смарт-контрактов в Ambisafe

Анастасія Пономарьова

О языке разработки Solidity и особенностях работы смарт-контрактов, из-за которых у криптокомпаний происходят «утечки» космических денег, продолжает рассказывать Алексей Матиясевич — Lead Smart Contracts Engineer в компаниях Ambisafe и ChainSafe.

Напомним, в первой части интервью он поделился тем, как пришел в сферу блокчейна, и почему стать тестировщиком в этой нише — хорошая идея.

Есть позиции, где принимают программистов джуниор-уровня

Lead Smart Contracts Engineer в компаниях Ambisafe и ChainSafe Алексей Матиясевич

Есть позиции, на которые принимают программистов даже джуниор-уровня. Для QA при найме будет плюсом опыт в тестировании блокчейн-проектов, но это не обязательное условие. Для программистов бывают разные позиции — например, Ambisafe нанимают специалистов без опыта в блокчейне, но должен быть хороший опыт работы с Node.js или JavaScript, по написанию фронтенда или бэкенда (зависит от позиции). Уже на месте новичку рассказывают и объясняют все, что связано с блокчейном.

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

У Solidity много общего с C++

Говорят, что язык Solidity похож на JavaScript, и этому есть объяснение. Когда разрабатывали Solidity, была идея сделать его похожим на нечто привычное разработчикам, чтобы максимально снизить порог вхождения и им было легче начинать работать. Но это только внешне.

Если подробнее разобраться в том, как язык работает и какие возможности имеет, к чему приводит выполнение программы, как она компилируется, то там гораздо больше общего с C++.

Здесь есть детальное взаимодействие с памятью, нужно понимать, как работает стек, придумывать собственные структуры данных. В JS у тебя есть куча библиотек, нескончаемые ресурсы. А вот когда разрабатываешь смарт-контракты на Solidity, то ресурсы у тебя ограничены, количество кода очень сильно ограничено, плюс есть собственная специфика, которой нет в других языках программирования. Смарт-контракты работают на блокчейне — это специфика, имеющая смысл только в среде Ethereum.

Когда ты пишешь какую-нибудь программу на JS, то обычно она существует сама по себе, или ты используешь API других сервисов, которые где-то запущены. А в случае со смарт-контрактами их можно представить как кучу программ, они все запущены на одном сервере, все видят друг друга, могут друг с другом обращаться. И их миллионы.

Иллюстрация, источник – YouTeam

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

И еще момент, о котором разработчики обычных систем часто вообще не думают: в блокчейне фиксированное количество ресурсов, и их использование очень дорогостоящее. Приходится думать о том, что если ты добавляешь дополнительную логику или используешь память, за это все придется платить пользователю или тому, кто запускает проект. Здесь не удастся, как на обычных проектах, распределить нагрузку на несколько серверов. Поэтому мы должны разрабатывать таким образом, чтобы все работало, при этом не было необходимости в будущем увеличивать количество ресурсов. Увеличишь — все всем станет дороже. А если сервис дорогой, то зачем людям им пользоваться, когда всегда можно найти что-нибудь дешевле?

Из-за ошибки миллионы долларов выводились в неизвестном направлении

Первая распространенная ошибка смарт-контракта, обнаруженная еще в 2016 году (но она актуальна и сейчас) — это так называемая проблема reentrancy. Простейший пример: есть функция, которая кладет деньги в смарт-контракт и записывает, что у такого-то пользователя $100 положено на баланс, и есть функция, которая забирает деньги из смарт-контракта — смотрит, кто вызывает ее и есть ли у пользователя деньги на балансе. Если есть, она отправляет их по запросу.

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

Lead Smart Contracts Engineer в компаниях Ambisafe и ChainSafe Алексей Матиясевич, фото с FB

Есть и другие распространенные проблемы. Когда выполняется какая-то функция смарт-контракта, у тебя всегда есть доступ к вызывающему функцию. Даже логиниться не надо: отправляешь транзакцию и подписываешь ее, и смарт-контракт тебя уже идентифицирует.

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

Мошенники обманывают смарт-контракты

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

Например, возьмем выдачу займа под залог. Ты приносишь $100 в смарт-контракт как залог и просишь, чтобы он выдал тебе заем €50. Смарт-контракт проверяет с помощью оракула, действительно ли размер займа меньше, чем стоимость залога — да, €50 меньше $100, и давать займ безопасно. Но если у тебя есть возможность манипулировать ценой евро по отношению к доллару, то сумма займа может быть космическая. Если удается как-то изменить в оракуле курс перед тем, как запросить займ, смарт-контракт может подумать, что $1 стоит €10 тысяч, допустим. Ты кладешь $100 и просишь дать тебе €1 млн — ОК, смарт-контракт выдает тебе указанную сумму. Твоя манипуляция в оракуле действовать перестает, цена становится нормальной, но деньги назад смарт-контракт забрать уже не может, потому что рассчитывает, что оракул — надежный источник цены, где информацией не получится манипулировать.

Обычно мошенники обманывают смарт-контракты с помощью денег — ставят нереальную цену и таким образом «зарабатывают» в разы больше. Это очень дорого, но если человек готов рискнуть $1 млн, чтобы выманить у блокчейн-проекта $100 млн, то уже оказывается, что цена не так высока.

Такое происходило не раз. Это вредит, в первую очередь, пользователям. Потому криптовалютный проект — как рынок кредитования пользователей между собой: одни люди дают займы другим, затем получают или платят проценты. У компании, конечно, будет какой-то процент от заработка на проекте, но основную выгоду получают пользователи. Если кто-то нечестно смог забрать деньги со смарт-контракта, то получится так, что другие пользователи, которые положили свои средства на депозит, забрать их оттуда уже не смогут. Компания несет репутационные потери. Если руководство ответственное и «хорошее», компания попытается возместить потери пользователям проекта.

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

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024