Аналіз смарт-контрактів
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