Анализ смарт-контрактов
28.03.2024

Смарт-контракты с функцией AntiWhale

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

В этой статье мы рассмотрим подробно, что такое механизм AntiWhale, чем он отличается от механизма Cooldown, и в каких случаях они используются вместе, а в каких - по отдельности.

Механизм Cooldown

Назначение:

Механизм Cooldown предназначен для введения ограничений по времени между последовательными транзакциями с одного и того же адреса. Его цель - регулирование частоты транзакций и предотвращение чрезмерной активности по покупке или продаже в течение коротких временных интервалов.

Реализация:

Ограничения по времени: механизмы Cooldown устанавливают периоды ожидания между транзакциями, часто основанные на времени, прошедшем с момента последней транзакции с определенного адреса. Пользователи должны дождаться истечения периода ожидания, прежде чем начать новую транзакцию.

Индикаторы:

Сравнение временных меток: Ищите сегменты кода, в которых сравниваются временные метки блоков или используются функции, связанные с временем. Для отслеживания времени последней транзакции могут использоваться переменные состояния типа lastTransactionTimestamp.

Механизм AntiWhale

Назначение:

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

Реализация:

Ограничения на размер транзакций: механизмы AntiWhale обычно устанавливают ограничения на размер или стоимость отдельных транзакций. Транзакции, превышающие установленный порог, приводят к введению ограничений, таких как отказ от выполнения транзакции, высокая комиссия или другие механизмы перераспределения.

Индикаторы:

Ищите сегменты кода, которые проверяют размер или стоимость транзакций, а такие переменные состояния (например, maxTransactionAmount или whaleThreshold), они могут указывать на наличие механизма AntiWhale. AntiWhale в первую очередь влияет на пользователей с большими объемами транзакций и сосредоточен на решении проблем концентрации токенов у крупных держателей.

Основные отличия Cooldown и AntiWhale:

Параметры AntiWhale Cooldown
Параметры: Влияние AntiWhale: В первую очередь влияет на пользователей с большими объемами транзакций. Cooldown: Действует на всех пользователей, независимо от размера транзакции.
Параметры: Динамика рынка AntiWhale: Сосредоточен на решении проблем концентрации. Cooldown: Направлен на регулирование частоты транзакций.
Параметры: Цели проекта AntiWhale: Задача - распределение токенов и обеспечение стабильности рынка. Cooldown: В первую очередь направлен на обеспечение стабильности рынка и предотвращение быстрой торговли.

Сценарии использования:

  1. Минимизация манипулирования рынком:
    Оба механизма могут использоваться совместно для решения различных проблем, связанных с манипулированием рынком. Механизм AntiWhale помогает ограничить размер крупных транзакций, а механизм Cooldown предотвращает быстрое проведение нескольких транзакций в течение короткого промежутка времени.

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

  2. Обеспечение справедливого распределения:
    В контексте новых токенов или продаж токенов, предотвращение приобретения небольшим числом участников непропорционально большой доли общего объема предложения. Установление ограничений на максимальную сумму, которую может приобрести отдельный адрес в ходе продажи токенов или в течение определенного периода, позволяет более равномерно распределить токены между большим количеством участников.

  3. Устранение проблем с ликвидностью:
    Большие объемы транзакций крупных держателей могут повлиять на ликвидность и нарушить естественный процесс установления цены на децентрализованных биржах. Ограничивая скорость совершения сделок крупными держателями, механизм AntiWhale способствует поддержанию более стабильной ситуации с ликвидностью.

  4. Стабилизация цен:
    Предотвращение быстрых и масштабных сделок может способствовать стабилизации цен. Благодаря введению ограничений AntiWhale цена токена имеет больше времени для адаптации к рыночным условиям между транзакциями.

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

  6. Смягчение Flash-займов и атак:
    AntiWhale может добавить дополнительный уровень защиты от некоторых атак flash-loan и reentrancy за счет ограничения скорости выполнения транзакций.

utilization scenarios

Потенциальные риски для владельцев токенов:

  1. Установление слишком жестких лимитов AntiWhale может стать проблемой для пользователей, у которых действительно есть потребность в крупных транзакциях.

  2. Чрезмерная зависимость от механизма AntiWhale может непреднамеренно способствовать централизации, если она будет реализована без учета более широкой экосистемы.

Как самостоятельно определить наличие подобных угроз в смарт-контрактах?

Определение наличия в смарт-контракте механизма ограничений AntiWhale является важной задачей, вот несколько советов, которые помогут в этом:

  1. Изучите документацию контракта: начните с изучения документации и спецификаций контракта.

  2. Проанализируйте функции transfer: изучите функции, отвечающие за передачу токенов (transfer, transferFrom и т.п.). Ищите условные операторы, накладывающие ограничения на транзакции.

  3. Проверьте наличие сравнений временных меток: ищите случаи, когда в контракте сравниваются временные метки блоков.

  4. Проверьте переменные состояния: изучите переменные состояния, которые могут быть использованы для хранения информации, связанной с AntiWhale.

  5. Ищите функции или модификаторы, связанные с вычислениями во времени, такие как block.timestamp, block.number или now.

  6. Ищите параметры, которые управляют поведением AntiWhale: это могут быть maxTransferAmount, maxTxLimit и тому подобные. Эти параметры часто устанавливаются владельцем контракта или с помощью механизмов управления отдельными транзакциями.

  7. Изучите журналы событий: проверьте журналы событий на предмет наличия специальных событий. Реализации смогут регистрировать соответствующую информацию при выполнении транзакции, что позволяет получить представление о процессе охлаждения.

  8. Анализируйте логику, специфичную для пользователя: если в контракте реализованы пользовательские ограничения, проверьте логику определения индивидуальных лимитов на переводы. Эта логика может включать атрибуты пользователя, баланс или другие критерии.

  9. Будьте в курсе событий: Будьте в курсе последних событий в нашем сообществе (Телеграм-канал) и лучших практик по выявлению мошенничества (наш Блог и YouTube-канал).

Хорошие новости: наш Сканер безопасности успешно находит (в том числе скрытые), а также вычисляет ограничения на переводы (AntiWhale) в 90% случаев. Используйте нашу премиум подписку и защитите свои средства от угроз.

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

Пример 1: Ограничения по сумме транзакций с периодом охлаждения (Transaction Amount Limits with Cooldown)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    uint256 public cooldownTime = 1 days; // Cooldown time between transactions
    
    mapping(address => uint256) private lastTransactionTimestamp;
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        require(block.timestamp - lastTransactionTimestamp[msg.sender] >= cooldownTime, "Wait for cooldown period to end");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

Данный пример ограничивает максимальную сумму, которую может перевести один адрес в течение определенного периода времени.

Он включает механизм охлаждения, обеспечивающий период ожидания между транзакциями по одному и тому же адресу. Массив lastTransactionTimestamp отслеживает временную метку последней транзакции для каждого адреса.

Пример 2: Динамические ограничения на перевод (Progressive Transaction Limits)


    uint256 public initialMaxTransactionAmount = 500000; // Initial maximum transaction amount
    uint256 public maxTransactionIncreaseRate = 20000; // Maximum increase rate per transaction
    uint256 public cooldownTime = 2 days; // Cooldown time between transactions
            
    mapping(address => uint256) private lastTransactionTimestamp;
            
    function transfer(address to, uint256 value) public {
        uint256 currentMaxTransactionAmount = initialMaxTransactionAmount + (maxTransactionIncreaseRate * (block.timestamp - lastTransactionTimestamp[msg.sender]) / cooldownTime);
        require(value <= currentMaxTransactionAmount, "Exceeded maximum transaction amount");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

В данном примере используется динамический механизм, в котором максимальная сумма транзакции постепенно увеличивается с течением времени.

Параметр maxTransactionIncreaseRate управляет скоростью увеличения максимальной суммы транзакции. Массив lastTransactionTimestamp отслеживает временную метку последней транзакции для каждого адреса.

dynamic translation restrictions

Пример 3: Исключения с белым списком (Whitelist Exemption)


    address[] public whitelistedAddresses;
    mapping(address => bool) public isWhitelisted;
    
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount || isWhitelisted[msg.sender], "Exceeded maximum transaction amount");
        ...
    }

Данный пример использует исключения для определенных адресов от ограничений AntiWhale с помощью белых списков.

Адреса в массиве whitelistedAddresses считаются освобожденными от ограничения максимальной суммы транзакции. Массив isWhitelisted определяет, включен ли конкретный адрес в белый список.

Пример 4: Многоуровневые лимиты на транзакции (Tiered Transaction Limits)


    uint256[] public tieredLimits = [5000000, 2000000, 1000000]; // Tiered transaction limits for different address balances

    function transfer(address to, uint256 value) public {
        require(value <= getTransactionLimit(msg.sender), "Exceeded maximum transaction amount");
        ...
    }
    
    function getTransactionLimit(address user) internal view returns (uint256) {
        uint256 userBalance = balanceOf(user);
    
        if (userBalance < 10000) {
            return tieredLimits[0];
        } else if (userBalance < 50000) {
            return tieredLimits[1];
        } else {
            return tieredLimits[2];
        }
    }

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

Функция getTransactionLimit определяет соответствующий лимит транзакций на основе баланса пользователя.

Пример 5: Комиссия на большие транзакции (Tax on Large Transactions)


    uint256 public taxRate = 75; // 5% tax rate on transactions exceeding the limit
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        if (value > maxTransactionAmount) {
            uint256 taxAmount = (value * taxRate) / 100;
            uint256 netTransferAmount = value - taxAmount;
    
            // Transfer logic here for the net transfer amount
            ...
        } else {
            // Transfer logic here for amounts within the limit
            ...
        }
    }

В данном примере комиссия взимается с операций, превышающих максимальную сумму транзакции.

Ставка комиссии (TaxRate) определяет процент от суммы транзакции. Комиссия вычитается, после чего обрабатывается чистая сумма перевода.

Пример 6: Многоуровневые лимиты (Multi-Level Transaction Limits)


    uint256 public maxTransactionAmount1 = 500000; // Maximum transaction amount for tier 1 (500,000 tokens)
    uint256 public maxTransactionAmount2 = 200000; // Maximum transaction amount for tier 2 (200,000 tokens)
    
    function transfer(address to, uint256 value) public {
        if (value <= maxTransactionAmount1) {
            ...
        } else if (value <= maxTransactionAmount2) {
            ...
        } else {
            revert("Exceeded maximum transaction amount");
        }
    }

В данном примере реализовано несколько уровней лимитов на транзакции, на которых применяются различные лимиты в зависимости от суммы транзакции.

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

Пример 7: Динамические лимиты на транзакции в зависимости от баланса (Dynamic Transaction Limits based on Token Balance)


    uint256 public maxTransactionPercentage = 5; // Maximum transaction percentage relative to total token supply
    
    function transfer(address to, uint256 value) public {
        uint256 maxTransactionAmount = (totalSupply() * maxTransactionPercentage) / 100;
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

В данном примере динамически рассчитывается максимальная сумма транзакции в процентах от общей эмиссии (Total Supply). Параметр maxTransactionPercentage определяет допустимый процент для одной транзакции.

dynamic transaction limits

Пример 8: Лимиты, зависящие от времени (Time-Dependent Transaction Limits)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public startTime = 1700000000; // Start time in Unix timestamp
    uint256 public endTime = 1800000000; // End time in Unix timestamp

    function transfer(address to, uint256 value) public {
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Transaction not allowed at this time");
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

В данном примере применяются ограничения на транзакции, зависящие от времени, разрешая транзакции только в течение заданного временного промежутка.

Параметры startTime и endTime определяют период, в течение которого разрешены транзакции.

Пример 9: Прогрессивное налогообложение (Progressive Taxation)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public taxRate = 2; // Initial tax rate in percentage
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
    
        uint256 taxAmount = (value * taxRate) / 100;
        uint256 netTransferAmount = value - taxAmount;
    
        // Transfer logic here for the net transfer amount
        ...
    }

В данном примере представлен механизм прогрессивного налогообложения, при котором tax (fee) взимается с операций, превышающих максимальную сумму.

Ставка tax (fee) может быть скорректирована с течением времени или на основании определенных условий.

Пример 10: Лимиты на транзакции на основе балансов держателей (Weighted Transaction Limits based on Token Holders' Balances)


    uint256 public maxTotalTransactionAmount = 5000000; // Maximum total transaction amount for all token holders
    mapping(address => uint256) public userTransactionLimit; // Transaction limits based on individual token holder balances
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTotalTransactionAmount, "Exceeded maximum total transaction amount");
        require(value <= userTransactionLimit[msg.sender], "Exceeded individual transaction limit");
        ...
    }

В данном примере реализованы лимиты на транзакции, основанные как на общей сумме транзакций, так и на балансе отдельных держателей токенов.

Связка userTransactionLimit позволяет устанавливать персональные лимиты на основе балансов конкретных адресов.

 

Надеемся, что эти примеры помогли Вам лучше разобраться с механизмом AntiWhale в смарт-контрактах.

 

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

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

С уважением, команда Lotus Market.

All posts

Connect to a wallet

Metamask