Analise smart-contract
03.04.2024

Pametne pogodbe s funkcijo Pause

Daljujemo serijo člankov, posvečenih opisu goljufivih shem v pametnih pogodbah. Danes bomo analizirali pametne pogodbe s funkcijo Pause.

Inteligentne pogodbe s funkcijo Pause zagotavljajo možnost začasne ali trajne ustavitve določenih operacij ali funkcij v pogodbi. Čeprav so lahko funkcije Pause koristne za varnost in vzdrževanje, predstavljajo tudi potencialno tveganje, če jih uporabljajo goljufi. Če se želite zaščititi in prepoznati morebitne nevarnosti, morate razumeti tveganja, pogoste sheme goljufij in kako jih prepoznati v pametni pogodbi.

Nevarnosti pametnih pogodb s funkcijo Pause:

  • Nepooblaščena pavza: Prevaranti lahko pridobijo nadzor nad funkcijo Pause in ustavijo pogodbo brez ustreznega dovoljenja, kar lahko povzroči motnje v poslovanju ali finančno izgubo.

  • Zavajajoče zamude: Zlonamerne pogodbe lahko pod pretvezo začasnega vzdrževanja ali varnostnih ukrepov začasno ustavijo kritične transakcije, kot so izplačila ali prenosi, z namenom, da uporabnikom onemogočijo dostop do njihovih sredstev.

  • Lažne trditve o nujnih primerih:

  • Prevaranti lahko lažno trdijo, da gre za nujne primere ali ranljivosti, da bi upravičili prekinitev pogodbe, in nato med prekinitvijo uporabijo sredstva uporabnikov.

  • Varnostna pretveza: Zlonamerne pogodbe lahko trdijo, da je bila odkrita varnostna ranljivost, zaradi česar se aktivira funkcija začasne prekinitve. V resnici lahko goljufi nameravajo izkoristiti situacijo.

  • Nujne sheme: Prevaranti lahko uporabijo jezik ali scenarije, ki vzbujajo strah, na primer trditev o "poskusu vloma" ali "izrednih razmerah", da upravičijo prekinitev, med katero lahko izvedejo nezakonita dejanja.

Kako lahko neodvisno ugotovite, ali so takšne grožnje prisotne v pametnih pogodbah?

Če želite sami ugotoviti prisotnost funkcij premora v pametnih pogodbah, vam bodo pri tem v pomoč naslednji nasveti:

  1. Preglejte izvorno kodo pogodbe in preverite, ali obstaja funkcija premora. Prepričajte se, da je mehanizem za začasno prekinitev dobro dokumentiran in ima ustrezne kontrole dostopa.

  2. Poiščite, kdo nadzoruje funkcijo za začasno prekinitev. Nepooblaščeno ali nepreverjeno posedovanje funkcije Začasna prekinitev je potencialna težava.

  3. Preberi dokumentacijo in projektne specifikacije ter zagotovi, da zagotavljajo jasne in točne informacije o funkciji Začasna prekinitev, njenem namenu in okoliščinah, v katerih se lahko uporablja.

  4. Preveri preglednost uporabe funkcije Začasna prekinitev. Zagotovite, da obstajajo jasni postopki za upravljanje in odločanje o aktivaciji ali deaktivaciji funkcije Pause.

  5. Pozornost na zunanje revizije varnosti pametnih pogodb, zlasti mehanizma Pause. Revizorji naj ocenijo varnost in preglednost funkcije Pause.

  6. Nazorno spremljajte obnašanje pogodbe in zagotovite, da se funkcija Pause aktivira le v upravičenih okoliščinah, na primer zaradi vzdrževanja ali varnostnih razlogov.

  7. Sodelujte s skupnostjo projekta in drugimi uporabniki, da bi razumeli njihove izkušnje in skrbi glede uporabe funkcije Pause.

  8. Sprejemajte najnovejše dogodke v naši skupnosti (kanal Telegram) in najboljše prakse za odkrivanje goljufij (naš blog in kanal YouTube).

Za odkrivanje potencialno zlonamerne funkcije v pametni pogodbi Pause morate opraviti skrbni pregled ter natančno preučiti kodo in dokumentacijo projekta. Izogibajte se pogodbam s sumljivim vedenjem ali pomanjkanjem preglednosti glede uporabe funkcije Pause.

V 99,9 % primerov varnostni skener podjetja Lotus Market najde vse običajne (tudi skrite) funkcije Pause. Uporabite našo premijsko naročnino in zaščitite svoja sredstva pred grožnjami.

V nadaljevanju si bomo ogledali nekaj najpogostejših primerov funkcije Prekinitev, ki jih platforma Lotus Market uspešno najde.

independently determine

Primer 1: Osnovna funkcija Prekinitev


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

Napotki za prepoznavanje: Poiščite pogodbo s funkcijami, kot sta pavza in unpause, ali podobnimi funkcijami, ki lahko preklopijo stanje pavze.

Preverite, ali je za nekatere funkcije uporabljen modifikator vrste whenNotPaused, da zagotovite, da se lahko izvedejo le, ko pogodba ni prekinjena.

Preverite mehanizem za nadzor dostopa, ki mora samo lastniku ali pooblaščenim osebam omogočati, da začasno ustavijo in prekličejo začasno ustavitev pogodbe.

Primer 2: Časovno aktivirana prekinitev


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

Napotki za prepoznavanje: Poiščite pogodbo s časovnim mehanizmom prekinitve, pri kateri imata prekinitev in preklic prekinitve določeno trajanje.

Preverite, ali se za določene funkcije uporablja modifikator vrste whenNotPaused. Prepričajte se, da pogodba uveljavlja trajanje premora in omogoča njegovo preklicanje šele po preteku določenega časa.

Pri prepoznavanju funkcij premora v pametni pogodbi je ključno, da preučite kodo, nadzor dostopa in namen mehanizma premora. Skrbno preglejte dokumentacijo in model upravljanja pogodbe ter sodelujte s projektno skupnostjo, da ocenite legitimnost pogodbe in ali ustreza namenu. Vedno bodite previdni in opravite skrbni pregled, preden se lotite kakršne koli transakcije ali naložbe, ki vključuje pogodbe z možnostjo začasne prekinitve.

time-activated pause

Primer 3: Funkcija pogojne prekinitve


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

Napotki za prepoznavanje: Poiščite pogodbo z mehanizmom pogojne prekinitve, ki lastniku omogoča izvajanje določenih transakcij, tudi če je pogodba prekinjena.

Poglejte, ali se modifikator vrste whenNotPaused uporablja za funkcije, ki zahtevajo, da je pogodba v stanju brez prekinitve.

Primer 4: Funkcija prekinitve v sili


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

Napotki za prepoznavanje: Poiščite pogodbo s funkcijo nujne prekinitve, ki lastniku omogoča takojšnjo prekinitev pogodbe tudi brez standardnih postopkov prekinitve.

Preverite, ali obstaja modifikator vrste whenNotPaused, da določite, katere operacije so omejene, ko je pogodba prekinjena.

Pozornost namenite funkcijam za začasno ustavitev pogodbe v sili in zagotovite, da je njihova uporaba strogo nadzorovana in dobro dokumentirana.

Prilagodite funkcije začasne ustavitve pogodbe njenemu modelu upravljanja in postopkom odločanja za aktiviranje in deaktiviranje funkcije začasne ustavitve.

Primer 5: Lastniško nadzorovana začasna ustavitev s časovno omejitvijo


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

Napotki za prepoznavanje: Poiščite pogodbo z lastniško nadzorovano pavzo, ki vključuje določeno trajanje pavze in preklic pavze.

Poglejte, ali se za ustrezne funkcije uporablja modifikator vrste whenNotPaused, ki omejuje delovanje, ko je pogodba prekinjena.

owner-controlled pause with time limit

Primer 6: Prekinitev tretje osebe s časovno omejitvijo


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

Napotki za prepoznavanje: Poiščite pogodbo z mehanizmom za začasno prekinitev, ki ga upravlja tretja oseba in pri katerem lahko tretja oseba začasno prekine in odklopi pogodbo z določenim trajanjem.

Preverite, ali je na voljo modifikator vrste whenNotPaused, da določite, katere operacije so omejene, ko je pogodba prekinjena.

Preverite, da so mehanizmi za nadzor dostopa do funkcij prekinitve v pogodbi, ne glede na to, ali so v lasti lastnika, upravljanju skupnosti ali tretje osebe, pregledni in dobro zasnovani.

Ko je v pametni pogodbi ugotovljena funkcija prekinitve, je treba opraviti temeljito analizo kode, preizkusiti nadzor dostopa ter razumeti namen in model nadzora mehanizma prekinitve. Ključnega pomena je, da se izvede skrbni pregled in sodeluje s projektno skupnostjo, da se oceni legitimnost pogodbe in ali ustreza namenu. Vedno bodite previdni in opravite ustrezno raziskavo, predena sklenete pogodbe, ki ponujajo možnost pavze, da zmanjšate morebitna tveganja.

 

Doufamo, da so vam ti primeri pomagali bolje razumeti shemo funkcije pavze v pametnih pogodbah.

 

 

Ker so vse informacije v verigi blokov odprte (seveda pod pogojem, da je izvorna koda pogodbe preverjena), lahko oboroženi s tem znanjem samostojno preučite pametne pogodbe in prepoznate različne sheme prevar.

 

Vse to pa smo za vas že storili! Prijavite se na premijsko naročnino in pridobite dostop do ekskluzivnih filtrov o funkcijah pametnih pogodb in sveže analitike. Povečajte svoje možnosti za uspešno vlaganje v donosne žetone.

Zdravljeni, ekipa Lotus Market.

All posts

Connect to a wallet

Metamask