Что такое рекурсивный адрес и почему его лучше не трогать
В криптовалютном мире можно столкнуться с множеством загадочных терминов: мультисиг, мемтокен, zk-rollup и… рекурсивный адрес. На первый взгляд, звучит как что-то техническое и скучное. Но за этим термином может скрываться не просто абстрактная ошибка, а реальная угроза для твоих активов. В этой статье объясняем, что такое рекурсивные адреса, откуда они берутся и почему с ними лучше быть очень осторожным.
Что такое рекурсивный адрес?
Если говорить простым языком, рекурсивный адрес — это адрес, который ссылается на самого себя, напрямую или через сложную цепочку действий.
В классическом программировании рекурсия — это когда функция вызывает саму себя. В криптоконтексте идея похожая: контракт или операция, в которой адрес получателя совпадает с адресом отправителя, либо одна транзакция вызывает другую, которая в итоге снова ссылается на первую.
На практике рекурсивный адрес — это ошибочная, вредоносная или просто бессмысленная структура, которая может:
- вызвать зависание транзакции;
- привести к потере средств;
- заблокировать выполнение кода в смарт-контракте;
- спровоцировать уязвимость или зацикливание.
Как это может выглядеть?
Вот один из примеров: допустим, кто-то отправляет NFT не другому пользователю, а... самому себе. В большинстве случаев ничего страшного. Но если речь идет о контракте с логикой, где получатель вызывает события или запускает функции при получении токена, — это может запустить рекурсивный вызов, который приведет к краху.
Еще один пример — смарт-контракт, который отправляет токены, вызывая другую функцию, а та снова обращается к первому контракту. Такая конструкция может «зациклиться» и съесть все доступное газовое ограничение, вызвав откат транзакции.
Чем это опасно?
- Проблемы с газом и неудачные транзакции
Если ты случайно отправил токены на адрес контракта, который не рассчитан на их получение — особенно если это "рекурсивная" операция — результат может быть нулевым. Токены ушли, но их никто не получил. - Уязвимости в контрактах
Если разработчик не предусмотрел возможность рекурсивных вызовов, злоумышленник может воспользоваться этим — и запустить повторяющийся вызов, пока контракт не «сломается» или не выполнит нежелательные действия. Самый известный пример — взлом DAO в Ethereum в 2016 году, когда именно рекурсивный вызов позволил украсть миллионы. - "Вечные" NFT или токены
Некоторые пользователи рассказывали о ситуации, когда они отправили NFT на адрес, принадлежащий самому токену (в случае, если он ERC-721 контракт). Такой токен становится непередаваемым — он «заперт» на адресе самого себя. Это не баг, а последствие архитектуры. - Трудности при восстановлении или анализе
Рекурсивные адреса часто становятся ловушками для неопытных пользователей, особенно если те используют автоматические инструменты. Даже профессиональные аналитики могут не сразу заметить ошибку в цепочке вызовов.
Почему кто-то может отправить токен на рекурсивный адрес?
Причин несколько:
- ошибка пользователя. Он копировал адрес и случайно вставил адрес самого токена
- баг в интерфейсе кошелька или dApp. Некоторые приложения могут предлагать отправить средства «обратно» в исходный контракт
- злонамеренный контракт. Иногда разработчики закладывают в токен-контракт рекурсивные или самореференцирующиеся функции, чтобы обмануть пользователей (например, сделать токен "непереводимым")
Как не попасться?
- Всегда проверяй, куда отправляешь средства
Никогда не копируй адрес из неизвестного источника. Убедись, что адрес получателя — это не адрес самого токена или смарт-контракта, который не поддерживает получение. - Проверяй логику контракта
Если ты разработчик или пользуешься новым токеном/платформой, загляни в код (или найми специалиста, который сможет это сделать). Обрати внимание на наличие функций вроде fallback, receive, onERC721Received — именно через них часто запускается рекурсия. - Не отправляй токены «на удачу»
Не стоит тестировать, «а вдруг прокатит». Рекурсивные адреса — это не место для экспериментов. Если ты не уверен, проверь адрес через блокчейн-обозреватель - Используй проверенные кошельки и интерфейсы
Большинство крупных кошельков (MetaMask, Trust Wallet и др.) умеют предупреждать о потенциально подозрительных адресах. Но если ты пользуешься менее известными dApp — будь особенно внимателен.
Заключение
Рекурсивный адрес — это не баг блокчейна, а потенциальная ловушка. Он может стать причиной заморозки средств, сбоев в работе контрактов или даже уязвимостей, которыми воспользуются хакеры.
Лучший способ защитить себя — понимать логику блокчейна, не торопиться и не отправлять токены без понимания куда они придут. Если ты увидел адрес, который кажется странным — лучше его не трогать.
Как в дикой природе: если не знаешь, что за ягода — лучше не ешь. То же правило работает и в Web3.