Analise smart-contract
28.03.2024

Smart contracts with AntiWhale function

Kontynuujemy serię artykułów poświęconych opisowi oszukańczych schematów w inteligentnych umowach. Dziś przeanalizujemy inteligentne umowy z mechanizmem ograniczenia wielkości transferu AntiWhale.

W tym artykule szczegółowo omówimy, czym jest mechanizm AntiWhale, w jaki sposób różni się od mechanizmu Cooldown oraz kiedy są one używane razem, a kiedy osobno.

Mechanizm Cooldown

Cel:

Mechanizm Cooldown ma na celu narzucenie ograniczeń czasowych między kolejnymi transakcjami z tego samego adresu. Jego celem jest regulowanie częstotliwości transakcji oraz zapobieganie nadmiernej aktywności kupna lub sprzedaży w krótkich odstępach czasu.

Realizacja:

Ograniczenia czasowe: Mechanizmy Cooldown ustanawiają okresy oczekiwania między transakcjami, często na podstawie upływu czasu od ostatniej transakcji z danego adresu. Użytkownicy muszą odczekać okres oczekiwania, zanim rozpoczną nową transakcję.

Wskaźniki:

Porównanie znaczników czasowych: Szukaj segmentów kodu, które porównują znaczniki czasowe bloków lub korzystają z funkcji związanych z czasem. Zmienne stanu typu lastTransactionTimestamp mogą być używane do śledzenia czasu ostatniej transakcji.

Mechanizm AntiWhale

Cel:

Głównym celem mechanizmu AntiWhale jest zmniejszenie wpływu dużych transakcji z pojedynczego adresu lub małej grupy adresów, często nazywanych "wielorybami". Celem jest zapobieganie nadmiernej koncentracji żetonów w tych samych rękach oraz zwalczanie możliwej manipulacji lub destabilizacji rynku.

Implementacja:

Ograniczenia wielkości transakcji: Mechanizmy AntiWhale zazwyczaj ustanawiają limity na wielkość lub wartość indywidualnych transakcji. Transakcje przekraczające określony próg są poddawane restrykcjom, takim jak odrzucenie transakcji, wysokie opłaty lub inne mechanizmy redystrybucji.

Wskaźniki:

Szukaj segmentów kodu, które sprawdzają wielkość lub wartość transakcji, oraz takich zmiennych stanu (takich jak maxTransactionAmount lub whaleThreshold), które mogą wskazywać na obecność mechanizmu AntiWhale. AntiWhale głównie wpływa na użytkowników z dużymi wolumenami transakcji i koncentruje się na adresowaniu koncentracji żetonów u dużych posiadaczy.

Główne różnice między Cooldown a AntiWhale:

Parametry AntiWhale Cooldown
Parametry:Wpływ AntiWhale:Przede wszystkim wpływa na użytkowników z wysokimi wolumenami transakcji. Cooldown:Dotyczy wszystkich użytkowników, niezależnie od wielkości transakcji.
Parametry:Dynamika rynku AntiWhale:Skoncentrowany na rozwiązywaniu problemów koncentracji. Cooldown:Mający na celu regulowanie częstotliwości transakcji.
Parametry:Cel projektu AntiWhale:Celem jest dystrybucja tokenów i zapewnienie stabilności rynku. Cooldown:Głównie mający na celu zapewnienie stabilności rynku i zapobieganie szybkiemu handlowi.

Scenariusze wykorzystania:

  1. Minimalizowanie manipulacji rynkiem:
    Oba mechanizmy mogą być stosowane razem w celu rozwiązania różnych problemów manipulacyjnych na rynku. Mechanizm AntiWhale pomaga ograniczyć wielkość dużych transakcji, natomiast mechanizm Cooldown zapobiega szybkiemu pojawianiu się wielu transakcji w krótkim czasie.

    Załóżmy, że jedna jednostka posiada znaczną część całkowitego zasobu tokenów. Bez mechanizmu AntiWhale ta jednostka mogłaby dokonywać dużych transakcji, co mogłoby spowodować znaczne wahania cen, prowadzące do manipulacji rynkiem. Poprzez ograniczenie maksymalnej wielkości lub częstotliwości transakcji na pojedynczym adresie w określonym czasie, mechanizm AntiWhale ma na celu zapobieganie wpływowi dużych posiadaczy na rynek.

  2. Zapewnienie uczciwego podziału:
    W kontekście nowych tokenów lub sprzedaży tokenów zapobieganie temu, aby mała liczba uczestników zdobyła nieproporcjonalną część całkowitego zasobu. Ustalenie limitów na maksymalną ilość, jaką pojedynczy adres może zakupić podczas sprzedaży tokenów lub w określonym okresie, pozwala na bardziej równomierny podział tokenów między większą liczbę uczestników.

  3. Radzenie sobie z problemami płynności:
    Wysokie wolumeny transakcji dużych posiadaczy mogą wpływać na płynność i zakłócać naturalny proces odkrywania cen na zdecentralizowanych giełdach. Poprzez ograniczanie szybkości transakcji przez dużych posiadaczy, mechanizm AntiWhale pomaga utrzymać bardziej stabilną sytuację płynności.

  4. Stabilizacja cen:
    Zapobieganie szybkim i masowym transakcjom może pomóc w stabilizacji cen. Poprzez egzekwowanie ograniczeń AntiWhale cena tokenów ma więcej czasu na dostosowanie się do warunków rynkowych między transakcjami.

  5. Zapobieganie front-runningowi:
    AntiWhale może być stosowany do zwalczania front-runningu, gdzie handlowcy wykorzystują informacje czasowo wrażliwe do wykonania transakcji przed innymi. Mechanizm AntiWhale może zmniejszyć korzyść uzyskaną dzięki szybkiemu wykonywaniu transakcji.

  6. Ograniczenie ataków Flash-loan i reentrancy:
    AntiWhale może dodać dodatkową warstwę obrony przed niektórymi atakami Flash-loan i reentrancy poprzez ograniczenie szybkości wykonania transakcji.

scenariusze wykorzystania

Ryzyka dla posiadaczy tokenów:

  1. Ustawienie zbyt restrykcyjnych limitów AntiWhale może stanowić problem dla użytkowników, którzy faktycznie potrzebują dużych transakcji.

  2. Nadmierne poleganie na mechanizmie AntiWhale może niechcący promować centralizację, jeśli zostanie wdrożony bez uwzględnienia szerszego ekosystemu.

Jak samodzielnie określić obecność takich zagrożeń w inteligentnych umowach?

Określenie, czy mechanizm ograniczeń AntiWhale jest obecny w inteligentnej umowie, jest ważnym zadaniem. Oto kilka wskazówek, które pomogą w tym:

  1. Zapoznaj się z dokumentacją umowy: zacznij od przeglądania dokumentacji umowy i specyfikacji.

  2. Analizuj funkcje transferu: przejrzyj funkcje odpowiedzialne za transferowanie tokenów (transfer, transferFrom, itp.). Szukaj warunkowych instrukcji nakładających ograniczenia na transakcje.

  3. Sprawdź porównania znaczników czasowych: szukaj przypadków, gdzie umowa porównuje znaczniki czasowe bloków.

  4. Sprawdź zmienne stanu: przeanalizuj zmienne stanu, które mogą być używane do przechowywania informacji związanych z AntiWhale.

  5. Szukaj funkcji lub modyfikatorów związanych z obliczeniami czasowymi, takich jak block.timestamp, block.number lub now.

  6. Szukaj parametrów kontrolujących zachowanie AntiWhale: mogą to być maxTransferAmount, maxTxLimit i podobne. Te parametry są często ustawiane przez właściciela umowy lub przez mechanizmy zarządzania indywidualnymi transakcjami.

  7. Analizuj dzienniki zdarzeń: sprawdź dzienniki zdarzeń pod kątem specjalnych wydarzeń. Implementacje mogą rejestrować istotne informacje podczas wykonania transakcji, co daje wgląd w proces chłodzenia.

  8. Analizuj logikę specyficzną dla użytkownika: jeśli ograniczenia użytkownika są wdrożone w umowie, sprawdź logikę określania indywidualnych limitów transferu. Logika ta może obejmować atrybuty użytkownika, saldo lub inne kryteria.

  9. Bądź na bieżąco: Śledź najnowsze wydarzenia w naszej społeczności (kanał Telegram) i najlepsze praktyki w zakresie wykrywania oszustw (nasz Blog i kanał YouTube).

Dobra wiadomość: Nasz Skaner Bezpieczeństwa z powodzeniem znajduje (w tym ukryte) oraz oblicza ograniczenia transferu (AntiWhale) w 90% przypadków. Skorzystaj z naszej subskrypcji premium i zabezpiecz swoje środki przed zagrożeniami.

Chociaż mechanizm AntiWhale został zaprojektowany w celu zapobiegania manipulacji rynkiem i zapewnienia dystrybucji tokenów, oszuści mogą wykorzystać jego możliwości do oszukiwania użytkowników. Poniżej przedstawiono kilka możliwych scenariuszy oraz wskazówki dotyczące zabezpieczenia inwestycji w tokeny przy zastosowanym mechanizmie AntiWhale.

Przykład 1: Ograniczenia dotyczące wielkości transakcji z okresem ochłodzenia (Ograniczenia wielkości transakcji z 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;
    }

Ten przykład ogranicza maksymalną wielkość, którą pojedynczy adres może przesłać w określonym czasie.

Zawiera mechanizm ochładzania, który wprowadza okres oczekiwania między transakcjami na tym samym adresie. Tablica lastTransactionTimestamp śledzi znacznik czasowy ostatniej transakcji dla każdego adresu.

Przykład 2: Dynamiczne ograniczenia transakcji (Postępujące limity transakcji)

    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;
    }

Ten przykład używa dynamicznego mechanizmu, w którym maksymalna wielkość transakcji stopniowo wzrasta w czasie.

Parametr maxTransactionIncreaseRate kontroluje szybkość, z jaką maksymalna wielkość transakcji może wzrastać. Tablica lastTransactionTimestamp śledzi znacznik czasowy ostatniej transakcji dla każdego adresu.

dynamiczne ograniczenia transakcji

Przykład 3: Wyjątki na białej liście (Wyjątek na białej liście)

    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");
        ...
    }

Ten przykład używa wyjątków na białej liście dla określonych adresów, które są wyłączone z ograniczeń dotyczących maksymalnej wielkości transakcji AntiWhale.

Adresy znajdujące się w tablicy whitelistedAddresses są traktowane jako wyłączone z ograniczenia maksymalnej wielkości transakcji. Tablica isWhitelisted określa, czy określony adres znajduje się na białej liście.

Przykład 4: Warstwowe limity transakcji (Warstwowe limity transakcji)

    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];
        }
    }

Ten przykład implementuje warstwowe limity transakcji w zależności od salda adresu nadawcy. Użytkownicy z niższym saldem mają wyższy limit transakcji, a użytkownicy z wyższym saldem mają niższy limit transakcji.

Przykład 5: Opłaty od dużych transakcji (Podatek od Dużych Transakcji)

    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
            ...
        }
    }

W tym przykładzie pobierana jest opłata od transakcji przekraczających maksymalną wielkość transakcji.

Stopa prowizji (TaxRate) określa procentowy udział wartości transakcji. Prowizja jest potrącana, a następnie przetwarzana jest netto kwota transferu.

Przykład 6: Warstwowe limity (Warstwowe Limity Transakcji)

    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");
        }
    }

Ten przykład implementuje wiele poziomów limitów transakcji, gdzie różne limity są stosowane w zależności od wielkości transakcji.

Pozwala to na ustawienie limitów transakcji na różnych poziomach dokładności dla różnych woluminów tokenów.

Przykład 7: Dynamiczne limity transakcji w zależności od salda (Dynamiczne Limity Transakcji w oparciu o Saldo Tokenów)

    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");
        ...
    }

Ten przykład dynamicznie oblicza maksymalną wielkość transakcji jako procent całkowitego zapasu. Parametr maxTransactionPercentage określa dozwolony procent dla pojedynczej transakcji.

dynamiczne limity transakcji

Przykład 8: Limity transakcji zależne od czasu (Limity Transakcji Zależne od Czasu)

    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");
        ...
    }

W tym przykładzie zastosowano ograniczenia czasowe transakcji, pozwalając na realizację transakcji tylko w określonym przedziale czasowym.

Parametry startTime i endTime określają okres, w którym transakcje są dozwolone.

Przykład 9: Progresywne opodatkowanie (Progresywne Opodatkowanie)

    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
        ...
    }

Ten przykład przedstawia mechanizm progresywnego opodatkowania, gdzie podatek (opłata) jest pobierany od transakcji przekraczających maksymalną kwotę.

Stopa podatku (opłaty) może być dostosowywana w czasie lub na podstawie określonych warunków.

Przykład 10: Limity transakcji oparte na saldach posiadaczy (Limity Transakcji Względem Sald Posiadaczy Tokenów)

    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");
        ...
    }

Ten przykład implementuje limity transakcji oparte zarówno na całkowitej kwocie transakcji, jak i na saldach indywidualnych posiadaczy tokenów.

Binding userTransactionLimit pozwala na ustawienie spersonalizowanych limitów opartych na saldach określonych adresów.


Mamy nadzieję, że te przykłady pomogły Ci lepiej zrozumieć mechanizm AntiWhale w inteligentnych umowach.

Ponieważ wszystkie informacje w blockchainie są otwarte (pod warunkiem, że kod źródłowy umowy jest zweryfikowany), dzięki tej wiedzy możesz samodzielnie badać inteligentne umowy i identyfikować różne schematy oszustw.

Jednakże zrobiliśmy to już dla Ciebie! Zapisz się na subskrypcję premium i uzyskaj dostęp do wyłącznych filtrów dotyczących cech inteligentnych umów oraz świeżych analiz. Zwiększ swoje szanse na skuteczne inwestowanie w zyskowne tokeny.

Pozdrowienia, Zespół Lotus Market.

All posts

Connect to a wallet

Metamask