Analise smart-contract
03.04.2024

Inteligentne kontrakty z funkcją pauzy

Kontynuujemy serię artykułów poświęconych opisowi oszukańczych schematów w smart kontraktach. Dzisiaj przeanalizujemy inteligentne kontrakty z funkcją Pause.

Inteligentne kontrakty z funkcjami Pause zapewniają możliwość tymczasowego lub trwałego zatrzymania niektórych operacji lub funkcji w ramach kontraktu. Podczas gdy funkcje Pause mogą być przydatne dla bezpieczeństwa i konserwacji, stanowią one również potencjalne ryzyko, jeśli są wykorzystywane przez oszustów. Aby chronić się i identyfikować potencjalne zagrożenia, należy zrozumieć ryzyko, typowe schematy oszustw i sposób ich rozpoznawania w inteligentnym kontrakcie.

Niebezpieczeństwa związane z inteligentnymi kontraktami z funkcją Pause:

  • Nieautoryzowane wstrzymanie: Oszuści mogą uzyskać kontrolę nad funkcją Pause i zatrzymać kontrakt bez odpowiedniej autoryzacji, co może skutkować zakłóceniami biznesowymi lub stratami finansowymi.

  • Złudne opóźnienia: Złośliwe umowy mogą zawieszać krytyczne transakcje, takie jak wypłaty lub przelewy, pod pozorem tymczasowej konserwacji lub środków bezpieczeństwa, z zamiarem uniemożliwienia użytkownikom dostępu do ich aktywów.

  • Fałszywe twierdzenia o nagłych wypadkach: Oszuści mogą fałszywie twierdzić, że wystąpiły sytuacje awaryjne lub luki w zabezpieczeniach, aby uzasadnić zawieszenie umowy, a następnie wykorzystać środki użytkowników podczas przerwy.

  • Pretekst bezpieczeństwa: Złośliwe umowy mogą twierdzić, że odkryto lukę w zabezpieczeniach, co skutkuje aktywacją funkcji zawieszenia. W rzeczywistości oszuści mogą chcieć wykorzystać tę sytuację.
  • Schematy awaryjne: Oszuści mogą używać języka lub scenariuszy wywołujących strach, takich jak twierdzenie o "próbie włamania" lub "sytuacji awaryjnej", aby uzasadnić przerwę, podczas której mogą popełniać nielegalne działania.

Jak można niezależnie ustalić, czy takie zagrożenia są obecne w inteligentnych kontraktach?

Jeśli chcesz samodzielnie określić obecność funkcji Pause w inteligentnych kontraktach, poniższe wskazówki będą w tym pomocne.

  1. Zbadaj kod źródłowy kontraktu, aby sprawdzić, czy istnieje funkcja Pause. Upewnij się, że mechanizm pauzy jest dobrze udokumentowany i ma odpowiednią kontrolę dostępu.

  2. Dowiedz się, kto kontroluje funkcję Pause. Nieautoryzowane lub niekontrolowane posiadanie funkcji pauzy stanowi potencjalny problem.

  3. Przeczytaj dokumentację i specyfikacje projektu, aby upewnić się, że zawierają one jasne i dokładne informacje na temat funkcji pauzy, jej celu i okoliczności, w których może być używana.

  4. Sprawdź przejrzystość korzystania z funkcji pauzy. Upewnij się, że istnieją jasne procedury zarządzania i podejmowania decyzji o aktywacji lub dezaktywacji funkcji Pause.

  5. Zwróć uwagę na zewnętrzne audyty bezpieczeństwa inteligentnych kontraktów, w szczególności mechanizmu Pause. Audytorzy powinni ocenić bezpieczeństwo i przejrzystość funkcji Pause.

  6. Obserwuj zachowanie kontraktu i upewnij się, że funkcja Pause jest aktywowana tylko w uzasadnionych okolicznościach, takich jak konserwacja lub względy bezpieczeństwa.

  7. Współpracuj ze społecznością projektu i innymi użytkownikami, aby zrozumieć ich doświadczenia i obawy dotyczące korzystania z funkcji Pause.

  8. Bądź na bieżąco z najnowszymi osiągnięciami naszej społeczności (kanał Telegram) i najlepszymi praktykami w zakresie wykrywania oszustw (nasz blog i kanał YouTube).

Aby wykryć potencjalnie złośliwą funkcjonalność w inteligentnym kontrakcie Pause, należy zachować należytą staranność, analizując kod i dokumentację projektu. Unikaj kontraktów z podejrzanym zachowaniem lub brakiem przejrzystości w zakresie korzystania z funkcji Pause.

Skaner bezpieczeństwa Lotus Market znajduje wszystkie popularne (w tym ukryte) funkcje Pause w 99,9% przypadków. Skorzystaj z naszej subskrypcji premium i chroń swoje środki przed zagrożeniami.

Następnie przyjrzymy się kilku najczęstszym przykładom funkcji Pause, które platforma Lotus Market z powodzeniem wykrywa.

independently determine

Przykład 1: Podstawowa funkcja Pause


  contract BasicPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z funkcjami takimi jak pause i unpause lub podobnymi funkcjami, które mogą przełączać stan pauzy.

Sprawdź, czy modyfikator typu whenNotPaused został zastosowany do niektórych funkcji, aby upewnić się, że mogą one być wykonywane tylko wtedy, gdy kontrakt nie jest zawieszony.

Sprawdź mechanizm kontroli dostępu, który powinien zezwalać tylko właścicielowi lub upoważnionym osobom na zawieszanie i cofanie zawieszenia kontraktu.

Przykład 2: Pauza aktywowana czasem


  contract TimeActivatedPauseToken {
    address public owner;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(uint256 _duration) {
        owner = msg.sender;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z aktywowanym czasowo mechanizmem pauzy, w którym pauza i anulowanie pauzy mają określony czas trwania.

Sprawdź, czy istnieje modyfikator typu whenNotPaused zastosowany do niektórych funkcji. Upewnij się, że kontrakt wymusza czas trwania pauzy i pozwala na jej anulowanie dopiero po upływie określonego czasu.

Podczas identyfikowania funkcji Pause w inteligentnym kontrakcie, krytyczne jest zbadanie kodu, kontroli dostępu i celu mechanizmu pauzy. Należy dokładnie zapoznać się z dokumentacją i modelem zarządzania umowami, a także zaangażować się w społeczność projektową w celu oceny legalności umowy i tego, czy jest ona odpowiednia do celu. Zawsze zachowuj ostrożność i przeprowadzaj należytą staranność przed zaangażowaniem się w jakąkolwiek transakcję lub inwestycję obejmującą umowy z możliwością zawieszenia.

time-activated pause

Przykład 3: Funkcja pauzy warunkowej


  contract ConditionalPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z mechanizmem warunkowej pauzy, który pozwala właścicielowi na wykonanie pewnych transakcji, nawet jeśli kontrakt jest zawieszony.

Sprawdź, czy modyfikator typu whenNotPaused ma zastosowanie do funkcji, które wymagają, aby kontrakt był w stanie bez pauzy.

Przykład 4: Funkcja pauzy awaryjnej


  contract EmergencyPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function emergencyPause() public {
        require(msg.sender == owner, "Only the owner can initiate emergency pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z funkcją pauzy awaryjnej, która pozwala właścicielowi na natychmiastowe zawieszenie kontraktu nawet bez standardowych procedur zawieszenia.

Sprawdź modyfikator typu whenNotPaused, aby określić, które operacje są ograniczone, gdy kontrakt jest zawieszony.

Zwróć uwagę na funkcje pauzy awaryjnej kontraktu i upewnij się, że ich użycie jest ściśle kontrolowane i dobrze udokumentowane.

Dopasuj funkcje zawieszenia kontraktu do jego modelu zarządzania i procesów decyzyjnych dotyczących aktywacji i dezaktywacji funkcji zawieszenia.

Przykład 5: Pauza kontrolowana przez właściciela z limitem czasu


  contract TimedPauseToken {
    address public owner;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(uint256 _duration) {
        owner = msg.sender;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z kontrolowaną przez właściciela pauzą, która zawiera określony czas trwania pauzy i anulowania pauzy.

Sprawdź modyfikator typu whenNotPaused zastosowany do odpowiednich funkcji w celu ograniczenia operacji, gdy umowa jest zawieszona.

owner-controlled pause with time limit

Przykład 6: Third party pause with time limit


  contract ThirdPartyTimedPauseToken {
    address public owner;
    address public thirdParty;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(address _thirdParty, uint256 _duration) {
        owner = msg.sender;
        thirdParty = _thirdParty;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner || msg.sender == thirdParty, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == thirdParty, "Only the third party can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == thirdParty, "Only the third party can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner and the third party
    }
}

Wskazówki do identyfikacji: Poszukaj kontraktu z zarządzanym przez stronę trzecią mechanizmem zawieszenia, w którym strona trzecia może zawiesić i rozłączyć kontrakt z określonym czasem trwania.

Sprawdź modyfikator typu whenNotPaused, aby określić, które operacje są ograniczone, gdy kontrakt jest zawieszony.

Upewnij się, że mechanizmy kontroli dostępu do funkcji Pause w kontrakcie, niezależnie od tego, czy są własnością właściciela, zarządzane przez społeczność, czy też przez stronę trzecią, są przejrzyste i dobrze zaprojektowane.

Gdy funkcja Pause zostanie zidentyfikowana w inteligentnym kontrakcie, należy przeprowadzić dokładną analizę kodu, przetestować kontrole dostępu oraz zrozumieć cel i model kontroli mechanizmu pauzy. Kluczowe znaczenie ma przeprowadzenie należytej staranności i zaangażowanie społeczności projektowej w celu oceny legalności umowy i tego, czy jest ona odpowiednia do celu. Zawsze należy zachować ostrożność i przeprowadzić odpowiednie badania przed zawarciem umów, które oferują opcję pauzy w celu ograniczenia potencjalnego ryzyka.

 

Mamy nadzieję, że te przykłady pomogły ci lepiej zrozumieć schematy funkcji pauzy w inteligentnych kontraktach.

 

 

Ponieważ wszystkie informacje w łańcuchu bloków są jawne (oczywiście pod warunkiem, że kod źródłowy kontraktu jest zweryfikowany), uzbrojony w tę wiedzę możesz niezależnie badać inteligentne kontrakty i identyfikować różne schematy oszustw.

 

Jednak już zrobiliśmy to wszystko za Ciebie! Zarejestruj się w subskrypcji premium i uzyskaj dostęp do ekskluzywnych filtrów funkcji inteligentnych kontraktów i świeżych analiz. Zwiększ swoje szanse na udane inwestycje w dochodowe tokeny.

Z wyrazami szacunku, zespół Lotus Market.

All posts

Connect to a wallet

Metamask