![](/img/bg-single.png)
Samorevizijske pametne pogodbe s ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Pri revidiranju pametnih pogodb je treba zajeti številne zadeve, da se zagotovi varnost kode. Ta vprašanja zajemajo različne vidike, vključno z nadzorom dostopa, upravljanjem sredstev, upravljanjem podatkov, predpostavkami, odvisnostmi in varnostnimi kontrolnimi seznami. V nadaljevanju navajamo podroben kontrolni seznam in navodila za poizvedbe ChatGPT, ki vas bodo vodili skozi postopek revidiranja pametnih pogodb.
Če želite sami raziskati pametno pogodbo za ranljivosti in skrite tehnike prevar, je prvi korak pravilno oblikovana poizvedba ChatGPT.
Uporabna poizvedba za ChatGPT bo naslednji ukaz:
Predstavite izčrpen seznam vseh težav in ranljivosti naslednje pametne pogodbe. Podrobno opišite težave in morebitne ranljivosti. Za vsako ranljivost navedite en scenarij izkoriščanja. Izhodni rezultat je veljavna tabela v formatu markdown s seznamom objektov, vsak s stolpci "opis", "ukrep", "resnost", "akterji", "scenarij", "vrsta" in "vrstica". "type", kjer je lahko "usability" (uporabnost), "vulnerability" (ranljivost), "optimization" (optimizacija) ali "suggestion" (predlog). "actors" (akterji) je seznam vključenih akterjev. "resnost" je lahko "nizka", "srednja" ali "visoka". "vrstica" je številka vrstice problema. Prepričajte se, da so izpolnjena vsa polja v preglednici.
Potem z naslednjimi vprašanji podrobneje raziščite pametno pogodbo.
Scenariji uporabe:
- Kateri so akterji v sistemu?
- Katera dejanja ima sistem?
- Katere so omejitve sistema?
- Kateri so možni načini za zlom sistema?
- Katera obramba se uporablja za preprečevanje napadov?
- Na podlagi omejitev opišite spremembe stanja vsake funkcije.
- Podajte informacije o uporabljenih predlogah Solidity in DeFi.
- Napišite pozitivne in negativne aksiome na podlagi informacij o sistemu.
- Navedite načine za optimizacijo in spreminjanje kode, da bo bolj zanesljiva (z izseki kode).
- Navedite metode skritih prevar, ki se uporabljajo v kodi (z izseki kode).
Nasvet: Vizualna predstavitev podatkov pogosto omogoča jasnejše razumevanje delovanja sistema. Pri delu z aplikacijo ChatGPT je priporočljivo, da zahtevate vizualizacijo izhodnih podatkov, kot so spremembe stanja, v obliki znakovnih diagramov ASCII. Čeprav vse vizualizacije niso smiselne, lahko nekatere zagotovijo zelo dragocen vpogled v delovanje pametne pogodbe.
Sicer ChatGPT ne more nadomestiti človeškega revizorja, vendar pomembno dopolnjuje postopek revizije, saj omogoča jasnejše razumevanje prehodov stanj protokola, omejitev, invariant in združljivosti. To orodje je še posebej učinkovito pri razumevanju prehodov stanja protokola in omejitev.
Nasvet: Če pred začetkom revizije klepetalnemu robotu zagotovite dokumentacijo o revidiranem protokolu, lahko močno izboljšate natančnost in ustreznost odgovorov. Samo omenite: "To je dokumentacija, ki zagotavlja najboljši kontekst za 'ime_protokola', ki ga revidiram," in vstavite dokument.
Razumemo lahko, da je ChatGPT močan pomočnik za revizorje, ki zagotavlja strukturiran in poglobljen pristop k revidiranju pametnih pogodb. Vendar je treba upoštevati, da je ChatGTP (in podobne storitve) le zapletena interpretacija strojne analize, ki dela z verjetnostmi, zato pogosto proizvaja napake in netočnosti. V skladu s tem se na rezultate ChatGPT ni mogoče v celoti zanesti - so le dobro orodje v pravih rokah in "izhodišče" pri raziskovanju pametnih pogodb.
Zato je treba za zaščito pred morebitnimi tveganji pametne pogodbe natančneje pregledati glede morebitnih ranljivosti in goljufivih shem.
Kako izvesti poglobljeno revizijo pametnih pogodb? Top 100 zahtevkov za ChatGPT
Zgoraj smo obravnavali splošno poizvedbo (poziv) za ChatGPT, na podlagi katere lahko začnete analizirati pametno pogodbo. Seveda pa podrobna analiza ni omejena le na uvodni poziv.
Prevaranti nenehno izboljšujejo svoje taktike, zato morate biti informirani in previdni v številnih vidikih - to so bistvene strategije za zaščito naložbe v žetone.
Poglejmo si seznam 100 najpomembnejših poizvedb, s katerimi boste strokovno pristopili k reviziji pametne pogodbe:
- Ali je koda uspešno sestavljena?
- Katera različica Solidityja je uporabljena v kodi? Ali je to trenutna stabilna različica?
- Ali so prisotni jasni komentarji, ki pojasnjujejo namen funkcij in spremenljivk?
- Ali pogodba uporablja shemo "Ownable"? Če da, za katere funkcije?
- Ali so spremenljivke stanja pravilno dodeljene z uporabo modifikatorjev vidljivosti?
- Ali se dogodki uporabljajo za pravilno beleženje?
- Ali so na voljo uporabniku prijazna sporočila o napakah?
- Ali je preverjena povratna vrednost klicev na nizki ravni?
- Ali obstajajo scenariji, pri katerih se lahko lastnik pooblasti, kar bi lahko vodilo do vlečenja preproge?
- Kdo ima nadzor nad privilegiranimi računi in kakšni so nadzorni mehanizmi?
- Kateri mehanizmi upravljanja obstajajo v pogodbi in ali je upravljanje popolnoma odprto ali omejeno?
- Ali se v sistemu uporabljajo druge pogodbe in kakšne vloge opravljajo (npr. pogodba pooblaščenca)?
- Ali obstaja mehanizem časovne blokade in ali ga je mogoče zaobiti?
- Ali je na voljo ustrezna dokumentacija?
- Ali so v kodi možne ranljivosti za napade DoS ali reentrancy?
- Ali so vse funkcije notranje, razen tistih, za katere se izrecno zahteva, da so javne/zunanje?
- Ali ni aritmetičnih prelivov/podlivov pri matematičnih operacijah?
- Ali se uporablja varna knjižnica OpenZeppelin?
- Eterja ali žetonov ni mogoče pomotoma poslati na ničelni naslov (0x0)?
- Pred operacijami in spremembami stanja se pogoji preverijo z ukazom require?
- Se stanje nastavi pred in med izvajanjem dejanj?
- Se uporablja zaščita pred napadi ponovnega vstopa (reentry) (A pokliče B pokliče A)?
- Ali je vmesnik ERC20 ustrezno implementiran?
- Ali se modifikator uporablja na več mestih le, če je to res potrebno?
- Ali so vsi tipi eksplicitno določeni (npr. namesto uint se uporablja uint256)?
- Ali so vse metode in cikli znotraj največje dovoljene meje plina?
- V konstruktorju ni nepotrebnih inicializacij (ne pozabite, da so nastavljene privzete vrednosti)?
- Popolna pokritost s testi: testirane so vse metode pametne pogodbe in vse možne vrste vhodnih podatkov?
- Izvedeno je bilo fuzz testiranje z uporabo naključnih vhodov?
- I so testirana vsa možna stanja, v katerih je lahko pogodba?
- Privzete količine etrov in žetonov so določene v enotah wei?
- Ali blok/čas konca množične prodaje sledi bloku/času začetka (začetek/povezava trgovanja)?
- Ali je menjalni/konverzijski tečaj žetonov množične prodaje pravilno določen?
- Ali je določena mehka/trda omejitev množične prodaje?
- Ali je določen in preizkušen najmanjši/najvišji dovoljeni prispevek za množično prodajo?
- Ali je bila preizkušena funkcionalnost bele liste množične prodaje?
- Ali je bila preverjena logika vračila v množični prodaji?
- Ali udeleženci množične prodaje prejmejo sorazmerno število žetonov ali lahko zahtevajo svoj prispevek?
- Ali je trajanje vsake faze množične prodaje (npr, predprodaja, javna prodaja) ustrezno konfigurirano?
- I je določeno, katere funkcije lahko nadzira samo lastnik (npr, zaustavitev množične prodaje, prehod na drugo fazo množične prodaje, omogočanje razdeljevanja žetonov itd.")?
- Ali je preverjena logika dodeljevanja pravic (vesting) v množični prodaji?
- Ima množična prodaja varen način, ki, če ga omogoči lastnik, omeji klice funkcij in vključuje funkcijo vračila?
- Crowdsale ima funkcijo povratnega delovanja, če je to smiselno.
- Ali so bile uvožene knjižnice predhodno preverjene in ne vsebujejo nezaželenih delov, ki bi jih lahko v prihodnjih različicah zamenjali in uporabili v zlonamerne namene?
- Metode prenosa žetonov (transfer) zavite v require?
- So require in assert uporabljeni pravilno? Metoda assert se uporablja samo za stvari, ki se ne bi smele nikoli zgoditi, običajno se uporablja za preverjanje stanja po izvedenih spremembah.
- Ali obstaja obramba pred napadi z rekurzivnimi klici?
- Ali so dolžine poljubnih nizov v vhodu omejene?
- Kjer je mogoče, se izogibajte uporabi polj in namesto njih uporabite preslikave?
- Ali se blokovni heši ne uporabljajo za obdelavo naključnih vrednosti (rudarji lahko vplivajo na to)?
- Nikjer se ne uporablja tx.origin?
- Elemente matrike se ob brisanju elementa premakne navzdol, da ne bi ostale vrzeli?
- Ali se namesto meta uporablja revert?
- Funkcije se končajo takoj, če pogoji niso izpolnjeni?
- So bila opozorila prevajalnika odpravljena?
- Se pri izračunih uporablja knjižnica SafeMath?
- Se kakšne pomnilniške reže (shranjevalne reže) berejo več kot enkrat?
- Se uporabljajo neomejene zanke/plošče, ki bi lahko povzročile DoS?
- Se block.timestamp uporablja samo za dolge intervale?
- Se ne uporablja block. number za izračun pretečenega časa?
- Se izogibamo klicu delegatecall, zlasti za zunanje (tudi če zaupanja vredne) pogodbe?
- Se dolžina polja ne posodablja, medtem ko ga iteriramo?
- Ali so podpisi zaščiteni pred ponovnim predvajanjem z nonce in block.chainid?
- Preveri, ali vsi podpisi uporabljajo EIP-712?
- Izhod abi.encodePacked() se ne sme hashirati, če se uporabljata več kot 2 dinamična tipa. Na splošno je bolje uporabiti abi.encode().
- Skrbno preverite vstavljanje kode sklopa.
- Izogibajte se nezadostni porabi plina (gas griefing).
- I so vsi zasebni podatki res zasebni?
- Ak posodobitev strukture/mape v pomnilniku (memory) je ne spremeni v shrambi (stage)?
- Ali so spremenljivke stage zasenčene?
- Ali je izračun vrednosti spremenljivke na poti cenejši od shranjevanja?
- Ali se vse spremenljivke stanja berejo iz pravilne pogodbe (master proti klonu)?
- Ali se primerjalni operatorji (>, <, >=, <=) uporabljajo pravilno, zlasti za preprečevanje napak zunaj ene vrednosti?
- Ali se logični operatorji (==, ! =, &&, ||, !) uporabljajo pravilno, zlasti za preprečevanje napak pri deljenju?
- Ali se množenje vedno izvede pred deljenjem (razen če se množenje lahko prelije)?
- Ali so magična števila nadomeščena s konstanto z intuitivnim imenom?
- Če ima prejemnik ETH povratno funkcijo (fallback ), ki jo je mogoče vrniti, bi to lahko vodilo v DoS?
- Ali se uporablja standard SafeERC20 in ali se povratne vrednosti preverjajo na varen način?
- Ali se predpostavlja, da je msg. pošiljatelj vedno ustrezen uporabnik?
- Kolikor se za avtorizacijo ne uporablja parameter.origin?
- Kolikor se namesto .call.value() ne uporablja address.transfer() ali address.send()?
- Ko uporabljate klice na nizki ravni, se prepričajte, da pred klicem obstaja pogodba.
- Ali se za dostop do chainid ali pogodbene kode/velikosti/pomnilnika namesto sintakse Solidity uporablja zbirna koda?
- Ali se pri nastavitvi spremenljivke na ničelno vrednost (0, false, "" itd..) uporablja ključna beseda delete?
- Izrazi, posredovani logičnim operatorjem/primerjavam (&&/|||/>=/==/itd.), ne smejo imeti stranskih učinkov.
- Ko imate opravka z več naslovi, se vprašajte, kaj se zgodi, če so enaki?
- Kako dobro je dokumentirana koda? Ali so na voljo komentarji in primeri povsod, kjer se uporablja nestandardna koda?
- Če se uporablja zunanji klic, se prepričajte, da je klic zunanje pogodbe res potreben?
- Ali je rezultat zunanjega klica preverjen in ali se obravnavajo napake?
- Kaj se zgodi, če zunanji klic uporabi vse zagotovljene pline?
- Če zunanji klic kliče določeno funkcijo, se prepričajte, da ta funkcija dejansko obstaja (fantomske funkcije).
- Prepričajte se, da se v modifikatorjih ne uporabljajo zunanji klici (modifikatorji)
- Ali se izdajo dogodki za vsako funkcijo, ki spreminja skladišče?
- Preverite svoje predpostavke o tem, kaj počnejo in vračajo zunanje pogodbe, uporabljene v glavnem.
- Pozorite na žetone, ki uporabljajo preveč ali premalo decimalk. Zagotovite, da so dokumentirane največje in najmanjše podprte vrednosti.
- Ali so dokumentirana pooblastila, povezana z vlogami?
- Katera so tveganja pri kršitvi pravic dostopa in kako lahko to vpliva na različne komponente sistema?
- Ali lahko lastnik manipulira z žetoni in ETH znotraj pogodbe?
- Kako je določen naslov Oracle (Orakelj) in kakšen je postopek v ozadju? Ali obstajajo rezervna oraklja za varnostno kopijo?
- Kako se podobne funkcije izvajajo v drugih projektih, ali so bile upoštevane najboljše prakse?
Ta kontrolni seznam vam bo pomagal zagotoviti izvedbo temeljite varnostne revizije pametnih pogodb Solidity. Zajema številne kritične vidike za prepoznavanje in zmanjševanje morebitnih ranljivosti in tveganj v kodi in povezanih sistemih.
Doufamo, da so vam ti primeri pomagali bolje razumeti metodologijo revizije pametnih pogodb.
Ker so vse informacije v verigi blokov odprte (seveda če je izvorna koda pogodbe preverjena), lahko oboroženi s tem znanjem samostojno preučite pametne pogodbe in prepoznate različne goljufive sheme.
Vse to 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.