![](/img/bg-single.png)
Älykkäiden sopimusten itsetarkastus ChatGPT:n avulla
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Älykkäitä sopimuksia auditoitaessa on käsiteltävä monenlaisia asioita, jotta voidaan varmistaa, että koodi on turvallista. Nämä kysymykset kattavat erilaisia näkökohtia, kuten pääsynvalvonta, varojen hallinta, tiedonhallinta, oletukset, riippuvuudet ja tietoturvatarkistuslistat. Alla on yksityiskohtainen tarkistuslista ja ohjeet ChatGPT-kyselyihin, jotka opastavat sinua älysopimusten auditointiprosessissa.
Jos haluat itse tutkia älysopimusta haavoittuvuuksien ja piilotettujen huijaustekniikoiden varalta, ensimmäinen askel on oikein muotoiltu ChatGPT-kysely.
Hyödyllinen kysely ChatGPT:tä varten olisi seuraava komento:
Tarjoa kattava luettelo kaikista ongelmista ja haavoittuvuuksista seuraavassa älysopimuksessa. Kuvaile ongelmat ja mahdolliset haavoittuvuudet yksityiskohtaisesti. Anna yksi hyväksikäyttöskenaario kullekin haavoittuvuudelle. Tulosta kelvollisena markdown-muotoisena taulukkona, jossa on luettelo objekteista, joissa jokaisessa on sarakkeet 'description', 'action', 'severity', 'actors', 'scenario', 'type' ja 'line'. 'type', jossa voi olla 'usability', 'vulnerability', 'optimization' tai 'suggestion'. 'actors' on luettelo mukana olevista toimijoista. 'severity' voi olla 'low', 'medium' tai 'high'. 'row' on ongelman rivinumero. Varmista, että kaikki taulukon kentät on täytetty.
Selvitä sitten älysopimusta syvällisemmin seuraavien kysymysten avulla.
Käyttöskenaariot:
- Keitä ovat järjestelmän toimijat?
- Mitä toimintoja järjestelmällä on?
- Mitkä ovat järjestelmän rajoitukset?
- Mitkä ovat mahdollisia tapoja murtaa järjestelmä?
- Millä puolustuksilla hyökkäyksiä torjutaan?
- Kuvaile rajoitusten perusteella kunkin toiminnon tilamuutokset.
- Anna tietoa käytetyistä Solidity- ja DeFi-malleista.
- Kirjoita positiivisia ja negatiivisia aksioomeja järjestelmää koskevien tietojen perusteella.
- Luettele tapoja optimoida ja muokata koodia luotettavammaksi (koodinpätkien avulla).
- Luettele koodissa käytetyt piilohuijausmenetelmät (koodinpätkien avulla).
Vinkki: Tietojen visuaalinen esittäminen antaa usein selkeämmän käsityksen järjestelmän toiminnasta. Kun työskentelet ChatGPT:n kanssa, on suositeltavaa pyytää visualisointeja lähtötiedoista, kuten tilamuutoksista ASCII-merkkikaavioina. Vaikka kaikki visualisoinnit eivät ehkä olekaan järkeviä, jotkin niistä voivat tarjota erittäin arvokasta tietoa älykkään sopimuksen toiminnasta.
Asiaatteessa, vaikka ChatGPT ei voi korvata inhimillistä tarkastajaa, se täydentää merkittävästi tarkastusprosessia tarjoamalla selkeämmän ymmärryksen protokollan tilasiirroista, rajoitteista, invarianteista ja yhteensopivuudesta. Tämä työkalu on erityisen tehokas protokollan tilasiirtymien ja rajoitusten ymmärtämisessä.
Vinkki: Ennen auditoinnin aloittamista, jos chatbotille annetaan dokumentaatiota auditoitavasta protokollasta, voidaan vastausten tarkkuutta ja relevanssia parantaa huomattavasti. Mainitse vain: "Tämä on dokumentaatio, joka tarjoaa parhaan kontekstin auditoimalleni 'protokollan_nimi'-protokollalle", ja lisää dokumentti."
Voidaan sanoa, että ChatGPT on tehokas avustaja auditoijille, joka tarjoaa jäsennellyn ja syvällisen lähestymistavan älykkäiden sopimusten auditointiin. On kuitenkin pidettävä mielessä, että ChatGTP (ja vastaavat palvelut) ovat vain monimutkaisia tulkintoja todennäköisyyksillä työskentelevästä koneanalyysistä, joten se tuottaa usein virheitä ja epätarkkuuksia. Näin ollen ChatGPT:n tulokseen ei voi täysin luottaa - se on vain hyvä työkalu oikeissa käsissä ja "lähtökohta" älykkäiden sopimusten tutkimuksessa.
Siten mahdollisilta riskeiltä suojautuakseen älysopimukset tulisi tutkia tarkemmin mahdollisten haavoittuvuuksien ja petollisten järjestelmien varalta.
Miten tehdä perusteellinen älysopimustarkastus? Top 100 kyselyä ChatGPT:lle
Yllä olemme tarkastelleet yleistä kyselyä (prompt) ChatGPT:lle, josta voit aloittaa älysopimuksen analysoinnin. Mutta yksityiskohtainen analyysi ei tietenkään rajoitu vain johdantokehotukseen.
Huijarit parantavat jatkuvasti taktiikkaansa, joten sinun on oltava tietoinen ja varovainen monessa asiassa - nämä ovat olennaisia strategioita, jotta voit suojella token-sijoitustasi.
Katsotaanpa listaa sadasta tärkeimmästä kyselystä, joiden avulla saat ammattimaisen lähestymistavan älysopimusten tarkastukseen:
- Kompiloidaanko koodi onnistuneesti?
- Mitä Solidityn versiota koodissa käytetään? Onko se nykyinen vakaa versio?
- Onko mukana selkeitä kommentteja, joissa selitetään funktioiden ja muuttujien tarkoitus?
- Käytetäänkö sopimuksessa "Ownable"-järjestelmää? Jos kyllä, niin minkä funktioiden osalta?
- Ovatko tilamuuttujat oikein allokoitu näkyvyyden muokkaajia käyttäen?
- Käytetäänkö tapahtumia asianmukaiseen lokitukseen?
- Ovatko virheilmoitukset käyttäjäystävällisiä?
- Tarkistetaanko matalan tason kutsujen paluuarvo?
- Onko olemassa skenaarioita, joissa omistaja voi valtuuttaa itsensä, mikä voi johtaa maton vetämiseen?
- Kuka valvoo etuoikeutettuja tilejä ja mitkä ovat valvontamekanismit?
- Mitä hallintamekanismeja sopimuksessa on, ja onko hallinto täysin avoin vai rajoitettu?
- Käytetäänkö järjestelmässä muita sopimuksia ja mitä rooleja ne täyttävät (esim. proxy-sopimus)?
- Onko käytössä aikalukitusmekanismi ja voiko sen ohittaa?
- Onko saatavilla riittävä dokumentaatio?
- Onko koodissa mahdollisia haavoittuvuuksia DoS- tai reentrancy-hyökkäyksille?
- Ovatko kaikki funktiot sisäisiä lukuun ottamatta niitä, joiden nimenomaisesti edellytetään olevan julkisia/ulkoisia?
- Ei aritmeettisia ylivuodotuksia/alijuoksutuksia matemaattisissa operaatioissa?
- Käytetäänkö suojattua OpenZeppelin-kirjastoa?
- Eetteriä tai poletteja ei voi lähettää vahingossa nollaosoitteeseen (0x0)?
- Ehdot tarkistetaan require-ohjelmalla ennen operaatioita ja tilamuutoksia?
- Säädetäänkö tila ennen operaatioiden suorittamista ja niiden aikana?
- Käytetäänkö suojausta reentry-hyökkäyksiltä (A kutsuu B:tä kutsuu A:ta)?
- Onko ERC20-rajapinta toteutettu asianmukaisesti?
- Käytetäänkö modifiointia useissa paikoissa vain, jos se on todella tarpeen?
- Säädetäänkö kaikki tyypit eksplisiittisesti (esim. uint256 käytetään uintin sijasta)?
- Ovatko kaikki metodit ja syklit suurimman sallitun kaasun rajan sisällä?
- Ei tarpeettomia alustuksia konstruktorissa (muista, että oletusarvot on asetettu)?
- Testaus on kattava: jokainen älysopimusmetodi ja kaikki mahdolliset syötetietotyypit on testattu?
- Onko fuzz-testausta suoritettu satunnaisten syötteiden avulla?
- Testataanko kaikki mahdolliset tilat, joissa sopimus voi olla?
- Eetterin ja tokeneiden oletusmäärät on määritelty wei-yksiköissä?
- Seurataanko crowdsale-loppulohkoa/-aikaa alkulohkon/ajan jälkeen (kaupankäynnin aloittaminen / mahdollistaminen)?
- Onko crowdsale-tokenien vaihtokurssi/muunnoskurssi asetettu oikein?
- Onko asetettu pehmeä/kovaa crowdsale-rajaa?
- Onko crowdsaleen sallittu vähimmäis-/maksimiosuus asetettu ja testattu?
- Onko crowdsalen whitelisting-toiminnallisuus testattu?
- Onko crowdsalen palautuslogiikka todennettu?
- Saavatko crowdsale-osallistujat suhteutetun määrän tokeneita vai voivatko he vaatia panostaan?
- Onko crowdsalen kunkin vaiheen kesto (esim, ennakkomyynti, julkinen myynti) oikein määritetty?
- Määritelläänkö, mitä toimintoja vain omistaja saa hallita (esim, crowdsalen keskeyttäminen, siirtyminen crowdsalen toiseen vaiheeseen, tokenien jakelun mahdollistaminen jne.)?
- Onko crowdsalen vesting- (vesting-) logiikka tarkistettu?
- Crowdsalessa on vikasietotila, joka omistajan ottaessa sen käyttöön rajoittaa ominaisuuksien kutsuja ja sisältää palautustoiminnon?
- Crowdsale on varotoiminto, jos se on järkevää.
- Onko tuodut kirjastot tarkistettu etukäteen, eivätkä ne sisällä ei-toivottuja osia, jotka voidaan korvata tulevissa versioissa ja joita voidaan käyttää haitallisiin tarkoituksiin?
- Token-siirtomenetelmät (transfer) kääritty requireen?
- Käytetäänkö require- ja assert-menetelmiä oikein? Assert-metodia käytetään vain asioihin, joita ei saisi koskaan tapahtua, yleensä sitä käytetään tilan tarkistamiseen muutosten jälkeen.
- Onko rekursiivisen kutsun hyökkäyksiä vastaan suojauduttu?
- Ovatko syötteessä olevien mielivaltaisten merkkijonojen pituudet rajoitettuja?
- Mahdollisuuksien mukaan vältetään matriisien käyttämistä ja käytetään sen sijaan mappingsia?
- Ei lohko-hasheja käytetä satunnaisarvojen käsittelyyn (kaivostyöläiset voivat vaikuttaa tähän)?
- Ei käytetä missään tx.origin:ia?
- Maastojen elementtejä siirretään alaspäin, kun elementti poistetaan, jotta ei jätetä aukkoja?
- Käytetäänkö revert:iä throw:n sijasta?
- Toiminnot päättyvät välittömästi, jos ehdot eivät täyty?
- Onko kääntäjän varoitukset korjattu?
- Käytetäänkö SafeMath-kirjastoa laskutoimituksissa?
- Luetaanko mitään muistipaikkoja (tallennuspisteitä) useammin kuin kerran?
- Käytetäänkö rajoittamattomia silmukoita/jonoja, jotka voivat aiheuttaa DoS:n?
- Käytetäänkö block.timestamp:ia vain pitkien aikavälien kohdalla?
- Käytetäänkö block. number laskettaessa kulunutta aikaa?
- Vältetäänkö delegatecall-kutsua, erityisesti ulkoisten (vaikka luotettavien) sopimusten osalta?
- Eikö array:n pituus päivity, kun sen yli iteroidaan?
- Onko allekirjoitukset suojattu toistolta nonce ja block.chainid:llä?
- Varmista, että kaikki allekirjoitukset käyttävät EIP-712:ta?
- abi.encodePacked():n tulosta ei pitäisi hashata, jos käytetään enemmän kuin 2 dynaamista tyyppiä. Yleensä on parempi käyttää abi.encode().
- Tarkista huolellisesti assembly-koodin lisäykset.
- Vältä riittämätöntä kaasunkulutusta (gas griefing).
- Onko kaikki yksityinen tieto todella yksityistä?
- Rakenteen/määrän päivittäminen muistissa (memory) ei muuta sitä tallennuksessa (stage)?
- Ovatko stage-muuttujat varjostettuja?
- Onko muuttujan arvon laskeminen lennossa halvempaa kuin sen tallentaminen?
- Luetaanko kaikki tilamuuttujat oikeasta sopimuksesta (master vs. klooni)?
- Käytetäänkö vertailuoperaattoreita (>, <, >=, <=) oikein, erityisesti estetäänkö off-by-one-virheet?
- Käytetäänkö loogisia operaattoreita (==, ! =, &&, ||, !) käytetään oikein, erityisesti virheiden välttämiseksi?
- Käytetäänkö kertolaskua aina ennen jakoa (ellei kertolasku voi ylivuotaa)?
- Korvataanko maagiset luvut vakiolla, jolla on intuitiivinen nimi?
- Jos ETH-vastaanottajalla on fallback (fallback ) -funktio, joka voidaan palauttaa, voiko tämä johtaa DoS:ään?
- Käytetäänkö SafeERC20-standardia ja tarkistetaanko palautusarvot turvallisella tavalla?
- oletetaanko, että msg. lähettäjä on aina relevantti käyttäjä?
- Eikö tx.origin:ia käytetä auktorisointiin?
- Eikö address.transfer() tai address.send() käytetä .call.value():n sijasta?
- Matalan tason kutsuja käytettäessä on varmistettava, että sopimus on olemassa ennen kutsua.
- Käytetäänkö assembly-koodia chainid- tai sopimuskoodin/size/hash-koodin käyttämiseen Solidity-syntaksin sijaan?
- Käytetäänkö delete-avainsanaa, kun muuttuja asetetaan nolla-arvoon (0, false, "" jne.)?
- Loogisille operaattoreille/vertailuille (&&/|||/>=/==/jne) välitetyillä lausekkeilla ei saa olla sivuvaikutuksia.
- Käsitellessäsi useita osoitteita, kysy itseltäsi, mitä tapahtuu, jos ne ovat samoja?
- Miten hyvin dokumentoitu koodi on? Annetaanko kommentteja ja esimerkkejä aina, kun käytetään epästandardia koodia?
- Jos käytetään ulkoista kutsua, varmista, että ulkoisen sopimuksen kutsu on todella tarpeen?
- Tarkistetaanko ulkoisen kutsun tulos ja käsitelläänkö virheet?
- Mitä tapahtuu, jos ulkoinen kutsu käyttää kaiken tarjotun kaasun?
- Jos ulkoinen kutsu kutsuu tiettyä funktiota, varmista, että funktio on todella olemassa (fantom-funktiot).
- Varmista, ettei ulkoisia kutsuja käytetä muokkaajissa (modifikaattorit)
- Kirjoitetaanko tapahtumia jokaiselle funktiolle, joka muuttaa varastoa?
- Tarkista oletuksesi siitä, mitä pääkäytössä käytettävät ulkoiset sopimukset tekevät ja palauttavat.
- Varoittelen merkkejä, joissa käytetään liian monta tai liian vähän desimaaleja. Varmista, että suurimmat ja pienimmät tuetut arvot on dokumentoitu.
- Onko rooleihin liittyvät valtuudet dokumentoitu?
- Mitkä ovat riskit, kun käyttöoikeuksia rikotaan, ja miten tämä voi vaikuttaa järjestelmän eri komponentteihin?
- Voiko omistaja manipuloida tokeneita ja ETH:ta sopimuksessa?
- Miten oraakkelin (Oracle) osoite asetetaan ja mikä prosessi on sen takana? Onko vara-orakkeleita varmuuskopiointia varten?
- Miten vastaavat toiminnot on toteutettu muissa projekteissa, onko parhaat käytännöt otettu huomioon?
Tämän tarkistuslistan avulla varmistat, että suoritat Solidity-älysopimusten perusteellisen tietoturvatarkastuksen. Se kattaa laajan valikoiman kriittisiä näkökohtia, joiden avulla voit tunnistaa ja lieventää mahdollisia haavoittuvuuksia ja riskejä koodissa ja siihen liittyvissä järjestelmissä.
Toivomme, että nämä esimerkit ovat auttaneet sinua ymmärtämään paremmin älysopimusten auditointimenetelmää.
Koska kaikki lohkoketjussa oleva tieto on avointa (edellyttäen tietenkin, että sopimuksen lähdekoodi on todennettu), voit tämän tiedon avulla varustautuneena tutkia itsenäisesti älysopimuksia ja tunnistaa erilaisia huijausjärjestelmiä.
Me olemme kuitenkin jo tehneet kaiken tämän puolestasi! Tilaa premium-tilaus ja saat käyttöösi yksinoikeudella suodattimia älykkäiden sopimusten ominaisuuksista ja tuoretta analytiikkaa. Lisää mahdollisuuksiasi sijoittaa menestyksekkäästi kannattaviin tokeneihin.
Hyvästi, Lotus Market -tiimi.