Analise smart-contract
03.04.2024

Contracte inteligente cu funcție de pauză

Continuăm seria de articole dedicate descrierii schemelor frauduloase în contractele inteligente. Astăzi vom analiza contractele inteligente cu funcția Pause.

Contractele inteligente cu funcții Pause oferă posibilitatea de a opri temporar sau permanent anumite operațiuni sau funcții din cadrul contractului. În timp ce funcțiile Pause pot fi utile pentru securitate și întreținere, acestea reprezintă, de asemenea, un risc potențial dacă sunt utilizate de către escroci. Pentru a vă proteja și a identifica potențialele amenințări, trebuie să înțelegeți riscurile, schemele comune de fraudă și cum să le recunoașteți într-un contract inteligent.

Pericolele contractelor inteligente cu funcția Pause:

  • Pause neautorizată: Fraudatorii pot obține controlul asupra funcției Pauză și pot opri contractul fără autorizarea corespunzătoare, ceea ce poate duce la întreruperea activității sau la pierderi financiare.

  • Întarzieri înșelătoare: Contractele malițioase pot suspenda tranzacțiile critice, cum ar fi retragerile sau transferurile, sub pretextul unor măsuri temporare de întreținere sau securitate, cu intenția de a refuza accesul utilizatorilor la activele lor.

  • Solicitări false de urgențe: Fraudatorii pot pretinde în mod fals urgențe sau vulnerabilități pentru a justifica o suspendare a contractului și apoi să utilizeze fondurile utilizatorilor în timpul pauzei.

  • Pretextul securității: Contractele malițioase pot pretinde că a fost descoperită o vulnerabilitate de securitate, ceea ce duce la activarea funcției de suspendare. În realitate, escrocii pot intenționa să profite de situație.

  • Scheme de urgență: Fraudatorii pot utiliza un limbaj sau scenarii care induc teamă, cum ar fi revendicarea unei "tentative de spargere" sau a unei "situații de urgență" pentru a justifica o pauză în timpul căreia pot comite acte ilegale.

Cum puteți determina independent dacă astfel de amenințări sunt prezente în contractele inteligente?

Dacă doriți să determinați pe cont propriu prezența funcțiilor de pauză în contractele inteligente, următoarele sfaturi vă vor fi utile în acest sens.

  1. Examinați codul sursă al contractului pentru a vedea dacă există o funcție de pauză. Asigurați-vă că mecanismul de pauză este bine documentat și are controale de acces adecvate.

  2. Aflați cine controlează funcția Pauză. Posesia neautorizată sau necontrolată a funcției Pauză este o problemă potențială.

  3. Luați documentația și specificațiile proiectului pentru a vă asigura că acestea oferă informații clare și exacte despre funcția Pauză, scopul acesteia și circumstanțele în care poate fi utilizată.

  4. Verificați transparența utilizării funcției Pauză. Asigurați-vă că există proceduri clare pentru gestionarea și decizia de activare sau dezactivare a funcției Pause.

  5. Alegeți atenție auditurilor externe ale securității contractelor inteligente, în special mecanismului Pause. Auditorii ar trebui să evalueze securitatea și transparența funcției Pause.

  6. Observați comportamentul contractului și asigurați-vă că funcția Pause este activată numai în circumstanțe legitime, cum ar fi motive de întreținere sau de siguranță.

  7. Engajați-vă cu comunitatea proiectului și cu alți utilizatori pentru a înțelege experiențele și preocupările acestora cu privire la utilizarea funcției Pause.

  8. Să fiți la curent cu cele mai recente evoluții din comunitatea noastră (canalul Telegram) și cu cele mai bune practici pentru detectarea fraudelor (blogul nostru și canalul YouTube).

Pentru a detecta o funcționalitate potențial malițioasă într-un contract inteligent Pause, trebuie să efectuați diligența necesară, examinând codul și documentația proiectului. Evitați contractele cu comportament suspect sau lipsă de transparență în ceea ce privește utilizarea funcționalității Pause.

Scanerul de securitate al Lotus Market găsește toate funcționalitățile Pause comune (inclusiv cele ascunse) în 99,9% din cazuri. Utilizați abonamentul nostru premium și protejați-vă fondurile de amenințări.

În continuare, vom analiza câteva dintre cele mai comune exemple ale funcției Pause pe care platforma Lotus Market le găsește cu succes.

independently determine

Exemplu 1: Funcția Pause de bază


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

Consilii pentru identificare: Căutați un contract cu funcții precum pause și unpause sau funcții similare care pot comuta starea de pauză.

Verificați dacă există un modificator de tip whenNotPaused aplicat anumitor funcții pentru a vă asigura că acestea pot fi executate numai atunci când contractul nu este suspendat.

Verificați mecanismul de control al accesului, care ar trebui să permită numai proprietarului sau persoanelor autorizate să suspende și să revoce suspendarea unui contract.

Exemplu 2: Pauză activată în timp


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

Consilii pentru identificare: Căutați un contract cu un mecanism de pauză activat în timp în care pauza și anularea pauzei au o durată specifică.

Verificați dacă există un modificator de tip whenNotPaused aplicat anumitor funcții. Asigurați-vă că contractul impune durata pauzei și permite ca aceasta să fie anulată numai după ce a trecut perioada de timp specificată.

În identificarea funcțiilor de pauză într-un contract inteligent, este esențial să examinați codul, controalele de acces și scopul mecanismului de pauză. Examinați cu atenție documentația și modelul de gestionare a contractului și dialogați cu comunitatea proiectului pentru a evalua legitimitatea contractului și dacă acesta este adecvat scopului. Manifestați întotdeauna prudență și efectuați verificări prealabile înainte de a vă angaja în orice tranzacție sau investiție care implică contracte suspendabile.

time-activated pause

Exemplu 3: Funcția de pauză condiționată


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

Consilii pentru identificare: Căutați un contract cu un mecanism de pauză condiționată care permite proprietarului să efectueze anumite tranzacții chiar dacă contractul este suspendat.

Verificați dacă modificatorul de tip whenNotPaused se aplică funcțiilor care necesită ca contractul să fie într-o stare nepausată.

Exemplu 4: Funcția de pauză de urgență


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

Consilii pentru identificare: Căutați un contract cu o funcție de pauză de urgență care permite proprietarului să suspende imediat contractul chiar și fără procedurile standard de suspendare.

Verificați dacă există un modificator de tip whenNotPaused pentru a determina ce operațiuni sunt restricționate atunci când contractul este suspendat.

acordați atenție funcțiilor de pauză de urgență ale contractului și asigurați-vă că utilizarea acestora este strict controlată și bine documentată.

potriviți funcțiile de suspendare ale contractului cu modelul său de guvernanță și procesele decizionale pentru activarea și dezactivarea funcției de suspendare.

Exemplul 5: Pauză controlată de proprietar cu limită de timp


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

Consilii pentru identificare: Căutați un contract cu o pauză controlată de proprietar care include o durată specifică a pauzei și anularea pauzei.

Verificați dacă există un modificator de tip whenNotPaused aplicat funcțiilor corespunzătoare pentru a restricționa operațiunile atunci când contractul este suspendat.

owner-controlled pause with time limit

Exemplul 6: Pauză terță parte cu limită de timp


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

Consilii pentru identificare: Căutați un contract cu un mecanism de suspendare gestionat de o terță parte, în care terța parte poate suspenda și deconecta contractul cu o durată stabilită.

Verificați dacă există un modificator de tip whenNotPaused pentru a determina ce operațiuni sunt restricționate atunci când un contract este suspendat.

Asigurați-vă că mecanismele de control al accesului pentru funcțiile de pauză din contract, indiferent dacă sunt deținute de proprietar, gestionate de comunitate sau de o terță parte, sunt transparente și bine concepute.

Când se identifică o funcție de pauză într-un contract inteligent, trebuie efectuată o analiză aprofundată a codului, trebuie testate controalele de acces și trebuie înțeles scopul și modelul de control al mecanismului de pauză. Este esențial să se efectueze un control diligent și să se colaboreze cu comunitatea proiectului pentru a evalua legitimitatea contractului și dacă acesta este adecvat scopului. Manifestați întotdeauna prudență și efectuați cercetări adecvate înainte de a încheia contracte care oferă o opțiune de pauză pentru a atenua riscurile potențiale.

 

Sperăm că aceste exemple v-au ajutat să înțelegeți mai bine schema funcției Pauză în contractele inteligente.

 

 

De vreme ce toate informațiile din blockchain sunt deschise (cu condiția, desigur, ca codul sursă al contractului să fie verificat), înarmat cu aceste cunoștințe puteți studia independent contractele inteligente și identifica diverse scheme de înșelăciune.

 

De altfel, noi am făcut deja totul pentru dumneavoastră! Înscrieți-vă pentru un abonament premium și obțineți acces la filtre exclusive privind caracteristicile contractelor inteligente și la analize proaspete. Creșteți-vă șansele de a investi cu succes în token-uri profitabile.

Regards, Lotus Market team.

All posts

Connect to a wallet

Metamask