Фьючерсы
Доступ к сотням фьючерсов
TradFi
Золото
Одна платформа мировых активов
Опционы
Hot
Торги опционами Vanilla в европейском стиле
Единый счет
Увеличьте эффективность вашего капитала
Демо-торговля
Введение в торговлю фьючерсами
Подготовьтесь к торговле фьючерсами
Фьючерсные события
Получайте награды в событиях
Демо-торговля
Используйте виртуальные средства для торговли без риска
Запуск
CandyDrop
Собирайте конфеты, чтобы заработать аирдропы
Launchpool
Быстрый стейкинг, заработайте потенциальные новые токены
HODLer Airdrop
Удерживайте GT и получайте огромные аирдропы бесплатно
Pre-IPOs
Откройте полный доступ к глобальным IPO акций
Alpha Points
Торгуйте и получайте аирдропы
Фьючерсные баллы
Зарабатывайте баллы и получайте награды аирдропа
Инвестиции
Simple Earn
Зарабатывайте проценты с помощью неиспользуемых токенов
Автоинвест.
Автоинвестиции на регулярной основе.
Бивалютные инвестиции
Доход от волатильности рынка
Мягкий стейкинг
Получайте вознаграждения с помощью гибкого стейкинга
Криптозаймы
0 Fees
Заложите одну криптовалюту, чтобы занять другую
Центр кредитования
Единый центр кредитования
Рекламные акции
AI
Gate AI
Ваш универсальный AI-ассистент для любых задач
Gate AI Bot
Используйте Gate AI прямо в вашем социальном приложении
GateClaw
Gate Синий Лобстер — готов к использованию
Gate for AI Agent
AI-инфраструктура: Gate MCP, Skills и CLI
Gate Skills Hub
Более 10 тыс навыков
От офиса до трейдинга: единая база навыков для эффективного использования ИИ
GateRouter
Умный выбор из более чем 40 моделей ИИ, без дополнительных затрат (0%)
Я только что написал анализ проблемы повторного вызова — вопроса безопасности, который многие разработчики всё ещё игнорируют при создании смарт-контрактов.
Проще говоря, reentrancy — это ситуация, когда смарт-контракт вызывается повторно до завершения первого вызова. Представьте так: ContractA выполняет функцию, вызывает ContractB, а ContractB в свою очередь вызывает обратно ContractA, пока тот ещё не завершил выполнение. Это — уязвимость, которую злоумышленник может использовать.
Конкретный пример: EtherStore содержит 10 Ether, ContractB уже отправил 1 Ether. Когда ContractB вызывает функцию вывода, он проверяет, есть ли у него баланс больше нуля, и если да — отправляет Ether обратно. Но тут кроется опасность — обновление баланса до нуля происходит после отправки. Поэтому злоумышленник может создать fallback-функцию, которая при получении Ether снова вызывает функцию вывода. Этот цикл будет продолжаться, пока все Ether не будут выведены.
Я расскажу о трёх способах защиты от reentrancy:
Первый — использование модификатора nonReentrant. Этот способ блокирует контракт во время выполнения функции, чтобы никто не мог повторно вызвать её. Простое, но эффективное решение для отдельной функции.
Второй — применение шаблона Checks-Effects-Interactions. Вместо обновления баланса после отправки, делайте это заранее. Так, даже если произойдет повторный вызов, баланс уже будет равен нулю, и проверка не пропустит.
Третий — создание отдельного глобального контракта GlobalReentrancyGuard. Этот метод использует общий флаг состояния для контроля reentrancy во многих контрактах одновременно. Особенно полезно, если ваш проект включает взаимодействие нескольких контрактов. Вместо проверки в каждом контракте, вы делаете это централизованно.
Проблема reentrancy не нова, но остаётся одной из самых распространённых уязвимостей. Я вижу, что многие разработчики всё ещё не применяют эти меры последовательно. Если вы работаете с Solidity, убедитесь, что хорошо понимаете эту проблему и внедряете хотя бы один из трёх методов в свой проект. Безопасность смарт-контрактов — не опция, а обязательное требование.