Безопасность на рынке или как избежать 90% скама в крипте

Приветствуем! Сегодня поговорим об одной из самых важных тем в сфере цифровых финансовых активов. Основатель DeFi Club — Святослав Коненков — и многие другие эксперты сферы криптовалют глубоко убеждены, что изучать безопасность в блокчейне нужно на начальном этапе углубления в сфере. В этой статье DeFi Club расскажет, как избежать скам в крипте.
Начнем немного издалека и опишем две ситуации. Если у вас подобного не было, то о похожих историях вы, скорее всего, уже слышали и не раз.
Первая ситуация. По какой-то причине человек посещает скамерский сайт. Возможно, фишинговый, копирующий популярный протокол. Далее он подключает кошелек и, что самое главное, в спешке подписывает какую-то транзакцию, после чего у него с кошелька списывают часть или все средства сразу.
Ситуация крайне неприятная. Периодически такое случается как у новичков, так и у опытных пользователей.
Вторая ситуация. Вы узнаете, что был взломан протокол, с которым вы недавно работали. И когда решаете проверить баланс своего кошелька, обнаруживаете, что денег нет, а разобравшись выясняете: средства без вашего ведома ушли сначала на баланс смарт-контракта того самого взломанного протокола, а затем на неизвестный адрес.
Давайте разбираться, что же произошло в обоих случаях и как можно было этого избежать.
Расскажем о DeFi Club. Во-первых, это аналитический сервис, куда публикуются самые качественные стратегии и материалы по тематике криптовалют. Мы специализируемся на инвестициях, активностях и DeFi. Во-вторых, это комьюнити более чем 400 пользователей, где все развиваются вместе, помогая друг другу. В-третьих, это лаунчпад, который позволяет частным инвесторам вкладываться в крипто-стартапы на раннем этапе развития.

Теоретический блок

Для этого придется немного погрузиться в теорию. Представим весь DeFi как многослойную систему.

Первый слой — сам блокчейн

Впервые прототипы современных DeFi-протоколов возникли на блокчейне Ethereum. В дальнейшем один за другим стали появляться условные форки Ethereum, Ethereum-совместимые блокчейны.
Они во многом копируют Ethereum, поэтому вся эта группа блокчейнов идентичнна по своему устройству. Это BSC, Polygon, Fantom, Avalanche C, Layer 2 в лице Arbitrum, Optimism. Новые проекты подобного типа выходят на рынок регулярно. Гигантская экосистема Ethereum способна легко перенаправить часть пользователей в новые проекты.
Все, о чем мы сегодня будем говорить, относится ко всем этим блокчейнам.
Подобные блокчейны относятся к блокчейнам состояния. Вся информация хранится в виде больших таблиц — баз данных, которые и описывают это самое состояние блокчейна.
Что же хранится в этих таблицах? — Прежде всего балансы токенов на разных адресах.
Причем каждый токен хранит эти балансы в своей собственной табличке. Именно там, а не в криптокошельке или где-то еще хранится баланс наших токенов. А перевод токенов с одного кошелька на другой — изменение записей о балансах в блокчейне, то есть изменение его состояния.

Второй слой — смарт-контракты и кошельки

Смарт-контракты — куски неизменяемого кода, который хранится в блокчейне. Они могут объединяться в группы, которые называются стандартами.
Стандарты обеспечивают одинаковую логику взаимодействия со всеми смарт-контрактами группы. Иными словами, у смарт-контрактов одного стандарта всегда есть необходимый минимальный набор одних и тех же программных методов, которые можно вызвать извне.
Так, смарт-контракты стандарта ERC20 — это всегда токены, которые всегда будут иметь в своем коде такие методы, как approve, transfer, transferFrom.
Вызывать эти методы могут обычные юзеры, которым в блокчейне соответствует адрес их кошелька. Когда мы вызываем метод смарт-контракта, мы совершаем транзакцию, которую подписываем в кошельке нашим приватным ключом, которому соответствует адрес кошелька.
Единственное предназначение любого криптокошелька — хранение приватного ключа и упрощение взаимодействия с блокчейном и смарт-контрактами через удобный интерфейс, оболочку.
Итак, с точки зрения блокчейна тот же перевод условного USDT будет выглядеть как вызов нашим кошельком метода transfer в коде смарт-контракта USDt, которому мы передадим всего два параметра — адрес, куда мы хотим перевести токены и их количество.
Этот метод вычтет в таблице балансов сумму перевода из нашего кошелька и прибавит ее к балансу получателя.

Третий слой — веб-интерфейс

Веб интерфейс, подобно криптокошельку, это такой же удобный интерфейс для взаимодействия со смарт-контрактами протокола.
Нажатие на кнопку в любом DeFi-протоколе всего лишь инициирует за нас вызов метода нужного смарт-контракта, и ничего больше. Без веб-сайта смарт-контракты спокойно продолжат работу, и с протоколом можно будет продолжать взаимодействовать напрямую.
С точки зрения блокчейна, например, покупка WBTC за USDC на Uniswap будет выглядеть как вызов метода swapExactTokensForTokens смарт-контракта роутера Uniswap. Uniswap должен будет сначала перевести на свой адрес указанное нами кол-во USDC, а уже затем перечислить нам соответствующее количество WBTC исходя из курса.
Но чтобы это сделать, Uniswap должен списать с нашего баланса USDC. Сделать это просто так он, конечно, не может. Для этого предварительно мы должны дать ему approve на списание — то, что мы часто не задумываясь делаем почти перед каждым свапом на DEX.
Чтобы дать approve (апрув), мы вызываем метод approve в смарт-контракте USDC и указываем кому и сколько мы разрешаем списать. Больше указанной суммы смарт-контракт списать не сможет.
После этого Uniswap уже может вызвать функцию transferFrom все в смарт-контракте USDC. В отличие от функции transfer, transferFrom позволяет при наличии апрува на достаточную сумму тому, кому был дан прув, сделать перевод токенов на свой адрес без нашего участия.
И уже после выполнения функции transferFrom Uniswap вызовет метод transfer уже в смарт-контракте WBTC, совершив перевод нужного количества токенов со своего адреса нам в обмен на USDC.

Что дает подключение кошелька

Чтобы сайт протокола мог выполнять возложенные на него функции, а именно помогать нам вызывать методы смарт-контрактов, нужно подключить к нему кошелек. Многие ошибочно видят в этом угрозу сохранности своих средств, но на самом деле само по себе подключение к сайту полностью безопасно.
Подключение кошелька дает доступ к
  • Просмотру баланса в нативной монете сети. Например, у Ethereum это ETH
  • Просмотру адреса
  • Запросу на смену сети
  • Запросу на sign message. Это не транзакция, а авторизация при помощи кошелька на сайте. Полностью безопасно. В редчайших случаях кошелек, например MetaMask, способен предупредить о возможной опасности
  • Запросу транзакции на подпись
Проблемы начинаются на последнем пункте. Пользователи зачастую не обращают внимание на то, какие транзакции они подписывают. Если это скамерский сайт, происходит история как в примере из начала: подписал транзакцию — деньги пропали.
Что же происходит в этот момент? В большинстве случаев после подключения к сайту пользователю прилетает транзакция на подпись в виде функции approve на безлимитное списание его токенов.
Пользователь подписывает транзакцию апрува, и после ее исполнения скамерский смарт-контракт вызывает метод transferFrom, спокойно перечисляя на свой адрес пользовательские средства.
И от этого не поможет даже холодный кошелек, как некоторые могут ошибочно думать. Холодный кошелек всего лишь хранит сид-фразу, не позволяя ей оказаться во внешней среде. Если с холодного кошелька добровольно дать апрув, средства также смогут благополучно улететь и с холодного кошелька.
Иногда могут встретиться и более искусные способы скама. Например, запрос на подпись не просто апрува, а транзакции, которая содержит в себе исполнение сразу нескольких последовательных методов, но исход будет один.

Сервисы для отслеживания скама

Важно следить за смарт-контрактами, которым мы даем апрувы и какие транзакции мы вообще подписываем. Также, если требуется, нужно уметь отозвать approve. В этом нам помогают несколько сервисов.

Fire

Главная страница Fire.
Fire пригодится всем, кто пользуется кошельком MetaMask. Оно помогает следить за тем, кому вы даете апрувы. Fire защищает от первого вида скама в DeFi.
Расширение симулирует завершение транзакции до того, как мы дадим подпись, и сообщает о возможных рисках после подтверждения транзакции. Если вы в шаге от того, чтобы дать безлимитный апурв левому смарт-контракту на каком-то фишинговом сайте, Fire предупредит об опасности.
И уже после его предупреждения вы семь раз подумаете прежде чем нажать на кнопку «Подтвердить».

Revoke.cash и de.fi

Главная страница Revoke.
Главная страница de.fi.
А как насчет второго вида скама? Когда происходит взлом вполне нормального протокола, злоумышленник может получить доступ к смарт-контракту. Этому смарт-контракту мы ранее могли дать апрув, если производили какие-то действия, например предоставление ликвидности.
Если апрув остался, ничто не мешает злоумышленнику вызвать тот же метод transferFrom и списать все средства с кошелька.
Если вы активный пользователь DeFi, очень важно регулярно, например раз в месяц, делать отмену апрувов (ревоуки или revokes).
Для этого есть два замечательных сервиса: revoke.cash и de.fi.
Оба позволяют делать ревоуки в разных сетях, но второй интересен своей функцией Shield. Это своеобразный сканер кошелька, который заранее предупреждает о потенциально подозрительных смарт-контрактах, которым был дан апурв, и позволяет прямо там сделать ревоук.
Делать ревоуки сразу всем смарт-контрактам необязательно. Топовые протоколы, такие как Uniswap, Curve, Aave вполне заслуживают доверия. Мы можем заранее давать им апрувы на довольно большие суммы. Так можно сэкономить на газе, потому что не придется каждый раз заново давать апрув.
А вот в отношении протоколов с меньшим доверием лучше ограничиться апрувами, не превышающими сумму свапа или любого другого действия, для которого нужен апрув. Не забывайте контролировать это при подписании апрува. Следите за тем, какое число указано в строке апрува, и при необходимости исправьте его на более приемлемое.
Чего точно не стоит делать ни в каком протоколе — давать безлимитный апрув на списание.
Если вы видите в строке апрува длинную последовательность из цифр, скорее всего вам пытаются предложить тот самый безлимитный апрув. Эта последовательность цифр — результат вычисления 2 в 256 степени. Число настолько большое, что его принимают за безлимитный апрув.
Кстати, протоколы часто могут предлагать такой апрув по умолчанию. Это удобно, но точно в ущерб безопасности, так что мы рекомендуем вручную исправлять такое значение на более низкое.

Заключение

В этой статье DeFi Club рассказал, как избежать скам в крипте. Мы обсудили вопросы безопасности в DeFi, которые помогут избежать 90% случаев потери средств. Не забывайте пользоваться сервисами, о которых мы рассказали. DeFi Club верит, что эта статья поможет вам избежать непредвиденную потерю средств в будущем.