![](/img/bg-single.png)
Contracte inteligente cu autoaudit cu ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
La auditarea contractelor inteligente, o gamă largă de aspecte trebuie să fie acoperite pentru a se asigura că codul este sigur. Aceste întrebări acoperă diverse aspecte, inclusiv controlul accesului, gestionarea activelor, gestionarea datelor, ipoteze, dependențe și liste de verificare a securității. Mai jos oferim o listă de verificare detaliată și instrucțiuni pentru interogările ChatGPT pentru a vă ghida în procesul de auditare a contractelor inteligente.
Dacă doriți să investigați singur un contract inteligent pentru vulnerabilități și tehnici ascunse de înșelăciune, primul pas este o interogare ChatGPT corect elaborată.
O interogare utilă pentru ChatGPT ar fi următoarea comandă:
Furnizați o listă completă a tuturor problemelor și vulnerabilităților din următorul contract inteligent. Descrieți în detaliu problemele și posibilele vulnerabilități. Furnizați un scenariu de exploatare pentru fiecare vulnerabilitate. Ieșiți ca un tabel valid în format markdown cu o listă de obiecte, fiecare cu coloanele 'description', 'action', 'severity', 'actors', 'scenario', 'type' și 'line'. "type" unde poate fi "usability", "vulnerability", "optimization" sau "suggestion". "actors" este o listă a actorilor implicați. "severity" poate fi "low", "medium" sau "high". "row" este numărul de rând al problemei. Asigurați-vă că toate câmpurile din tabel sunt completate.
Apoi utilizați următoarele întrebări pentru a explora contractul inteligent mai în profunzime.
Scenarii de utilizare:
- Cine sunt actorii din sistem?
- Ce acțiuni are sistemul?
- Care sunt limitările sistemului?
- Care sunt unele modalități potențiale de a sparge sistemul?
- Ce mijloace de apărare sunt folosite pentru a contracara atacurile?
- Descrieți, pe baza constrângerilor, schimbările de stare ale fiecărei funcții.
- Furnizați informații despre modelele Solidity și DeFi utilizate.
- Scrieți axiome pozitive și negative pe baza informațiilor despre sistem.
- Enumerați modalități de optimizare și modificare a codului pentru a-l face mai fiabil (cu fragmente de cod).
- Listați metodele de înșelăciune ascunse utilizate în cod (cu fragmente de cod).
Sfat: Reprezentarea vizuală a datelor oferă adesea o înțelegere mai clară a funcționării sistemului. Atunci când lucrați cu ChatGPT, este recomandat să solicitați vizualizări ale datelor de ieșire, cum ar fi modificările de stare sub formă de diagrame de caractere ASCII. De fapt, deși ChatGPT nu poate înlocui un auditor uman, acesta completează în mod semnificativ procesul de audit prin furnizarea unei înțelegeri mai clare a tranzițiilor de stare ale protocolului, a constrângerilor, invarianților și compatibilității. Acest instrument este deosebit de eficient pentru înțelegerea tranzițiilor de stare și a constrângerilor protocolului.
Sfat: Înainte de a începe un audit, furnizarea către chatbot a documentației privind protocolul auditat poate îmbunătăți considerabil acuratețea și relevanța răspunsurilor. Este suficient să menționați: "Aceasta este documentația care oferă cel mai bun context pentru "protocol_name" pe care îl auditez" și să introduceți documentul.
Se poate spune că ChatGPT este un asistent puternic pentru auditori, oferind o abordare structurată și aprofundată a auditării contractelor inteligente. Cu toate acestea, trebuie avut în vedere faptul că ChatGPT (și serviciile similare) sunt doar interpretări complexe ale analizei automate care lucrează cu probabilități, astfel încât produce adesea erori și inexactități. În consecință, rezultatul ChatGPT nu poate fi pe deplin fiabil - este doar un instrument bun în mâinile potrivite și un "punct de plecare" în cercetarea contractelor inteligente.
De aceea, pentru a vă proteja de eventualele riscuri, contractele inteligente ar trebui examinate mai atent pentru a depista eventualele vulnerabilități și scheme frauduloase.
Cum să efectuați un audit aprofundat al contractelor inteligente? Top 100 de solicitări către ChatGPT
Am luat în considerare mai sus o interogare generală (prompt) către ChatGPT, de la care puteți începe să analizați un contract inteligent. Dar, desigur, analiza detaliată nu se limitează la promptul introductiv.
Scammerii își îmbunătățesc în mod constant tacticile, așa că trebuie să fiți informați și precauți în multe aspecte - acestea sunt strategii esențiale pentru a vă proteja investiția în token.
Să aruncăm o privire la o listă a primelor 100 de interogări care vă vor oferi o abordare profesională a auditului unui contract inteligent:
- Codul se compilează cu succes?
- Ce versiune de Solidity este utilizată în cod? Este aceasta versiunea stabilă curentă?
- Sunt prezente comentarii clare care explică scopul funcțiilor și variabilelor?
- Contractul utilizează o schemă "Ownable"? Dacă da, pentru ce funcții?
- Variabilele de stare sunt alocate corect folosind modificatori de vizibilitate?
- Evenimentele sunt utilizate pentru o logare adecvată?
- Sunt furnizate mesaje de eroare ușor de utilizat?
- Este verificată valoarea de retur a apelurilor de nivel scăzut?
- Există scenarii în care proprietarul se poate autoriza care ar putea duce la tragerea covorului?
- Cine deține controlul asupra conturilor privilegiate și care sunt mecanismele de control?
- Ce mecanisme de guvernanță există în contract și guvernanța este complet deschisă sau limitată?
- Sunt utilizate alte contracte în sistem și ce roluri îndeplinesc acestea (de exemplu, contractul proxy)?
- Există un mecanism de blocare în timp și poate fi eludat?
- Există o documentație adecvată disponibilă?
- Există vulnerabilități potențiale la atacuri DoS sau de reentranță în cod?
- Toate funcțiile sunt interne, cu excepția celor care trebuie în mod explicit să fie publice/externe?
- Nu există depășiri/subdepășiri aritmetice în operațiunile matematice?
- Se utilizează biblioteca sigură OpenZeppelin?
- Etherul sau tokenurile nu pot fi trimise accidental la o adresă nulă (0x0)?
- Condițiile sunt verificate cu require înainte de operații și schimbări de stare?
- Se stabilește starea înainte și în timpul executării acțiunilor?
- Se utilizează protecția împotriva atacurilor de reintroducere (reentry) (A apelează B apelează A)?
- Interfața ERC20 este implementată în mod corespunzător?
- Modificatorul este utilizat în mai multe locuri numai dacă este cu adevărat necesar?
- Toate tipurile sunt stabilite în mod explicit (de exemplu, uint256 este utilizat în loc de uint)?
- Toate metodele și ciclurile se încadrează în limita maximă admisibilă a gazelor?
- Nu există inițializări inutile în constructor (amintiți-vă că valorile implicite sunt setate)?
- Există o acoperire completă a testelor: fiecare metodă de contract inteligent și toate tipurile posibile de date de intrare sunt testate?
- Au fost efectuate teste fuzz folosind intrări aleatorii?
- Sunt testate toate stările posibile în care se poate afla un contract?
- Cantitățile implicite de ether și jetoane sunt specificate în unități de wei?
- Blocul/timpul de încheiere a crowdsale vine după blocul/timpul de începere (începerea/activarea tranzacționării)?
- Taxa de schimb/conversie a jetoanelor crowdsale este setată corect?
- Există o limită soft/hard de crowdsale setată?
- Este stabilită și testată contribuția minimă/maximă permisă la crowdsale?
- A fost testată funcționalitatea de whitelisting la crowdsale?
- A fost verificată logica de rambursare la crowdsale?
- Participanții la crowdsale primesc un număr proporțional de jetoane sau își pot revendica contribuția?
- Durata fiecărei etape a crowdsale (de ex, pre-vânzare, vânzare publică) configurată corespunzător?
- Se specifică ce funcții ar trebui să fie controlate numai de către proprietar (de ex, punerea în pauză a crowdsale-ului, trecerea la o altă etapă a crowdsale-ului, activarea distribuției de jetoane etc.)?
- Este verificată logica de vesting (investire) a crowdsale-ului?
- Crowdsale are un mod de siguranță care, atunci când este activat de către proprietar, limitează apelurile funcției și include o funcție de rambursare?
- Crowdsale are o caracteristică de rezervă dacă are un sens rezonabil.
- Bibliotecile importate au fost verificate în prealabil și nu conțin părți nedorite care ar putea fi înlocuite în versiunile viitoare și ar putea fi utilizate în scopuri rău intenționate?
- Metodele de transfer de jetoane (transfer) învelite în require?
- Sunt utilizate corect require și assert? Metoda assert este utilizată numai pentru lucruri care nu ar trebui să se întâmple niciodată, de obicei este utilizată pentru a verifica starea după ce au fost efectuate modificări.
- Există o apărare împotriva atacurilor de apelare recursivă?
- Sunt limitate lungimile șirurilor arbitrare din intrare?
- Unde este posibil, evitați utilizarea array-urilor și utilizați în schimb mapări?
- Nu sunt utilizate hașuri de bloc pentru a gestiona valori aleatorii (minerii pot afecta acest lucru)?
- Nu utilizează tx.origin nicăieri?
- Elementele array sunt deplasate în jos atunci când un element este șters pentru a nu lăsa goluri?
- Se utilizează revert în loc de throw?
- Funcțiile se termină imediat dacă condițiile nu sunt îndeplinite?
- Au fost rezolvate avertismentele compilatorului?
- Se utilizează biblioteca SafeMath în calcule?
- Se citesc mai multe sloturi de memorie (sloturi de stocare) de mai multe ori?
- Se utilizează bucle/șiruri nemărginite care ar putea cauza DoS?
- Se utilizează block.timestamp numai pentru intervale lungi?
- Nu se utilizează block. number pentru a calcula timpul scurs?
- Se evită apelul delegatecall, în special pentru contractele externe (chiar dacă sunt de încredere)?
- Nu se actualizează lungimea array-ului în timpul iterației peste acesta?
- Sunt semnăturile protejate împotriva redării cu nonce și block.chainid?
- Asigurați-vă că toate semnăturile utilizează EIP-712?
- Sosirea lui abi.encodePacked() nu ar trebui să fie hașurată dacă sunt utilizate mai mult de 2 tipuri dinamice. În general, este preferabil să se utilizeze abi.encode().
- Verificați cu atenție inserțiile de cod de asamblare.
- Evitați consumul insuficient de gaz (gas griefing).
- Sunt toate datele private cu adevărat private?
- Actualizarea unei structuri/unui array în memorie (memorie) nu îl va modifica în stocare (etapă)?
- Variabilele de etapă sunt eclipsate?
- Calcularea valorii unei variabile din mers este mai ieftină decât stocarea acesteia?
- Toate variabilele de stare sunt citite din contractul corect (master vs. clonă)?
- Operatorii de comparație (>, <, >=, <=) sunt utilizați corect, în special pentru a preveni erorile off-by-one?
- Operatorii logici (==, ! =, &&, ||, !) sunt utilizați corect, în special pentru a preveni erorile off-by-one?
- Întotdeauna se efectuează înmulțirea înainte de împărțire (cu excepția cazului în care înmulțirea poate depăși limita)?
- Numerele magice sunt înlocuite cu o constantă cu un nume intuitiv?
- Dacă un destinatar ETH are o funcție de rezervă (fallback ) care poate fi inversată, aceasta ar putea duce la un DoS?
- Se utilizează standardul SafeERC20 și valorile de retur sunt verificate într-un mod sigur?
- Se presupune că msg. este întotdeauna un utilizator relevant?
- Nu se utilizeazăx.origin pentru autorizare?
- Nu se utilizează address.transfer() sau address.send() în loc de .call.value()?
- Când utilizați apeluri de nivel scăzut, asigurați-vă că există un contract înainte de apel.
- Se utilizează codul de asamblare pentru accesarea codului chainid sau a codului contractului/dimensiunii/hash în loc de sintaxa Solidity?
- Se utilizează cuvântul cheie delete atunci când se setează o variabilă la o valoare nulă (0, false, "" etc.)?
- Expresiile trecute la operatorii/comparările logice (&&/||/>=/==/etc) nu trebuie să aibă efecte secundare.
- Când aveți de-a face cu adrese multiple, întrebați-vă ce se întâmplă dacă acestea sunt aceleași?
- Cât de bine documentat este codul? Sunt furnizate comentarii și exemple ori de câte ori se utilizează cod non-standard?
- Dacă se utilizează apelul extern, asigurați-vă că un apel extern de contract este cu adevărat necesar?
- Se verifică rezultatul apelului extern și sunt gestionate erorile?
- Ce se întâmplă dacă apelul extern utilizează tot gazul furnizat?
- Dacă apelul extern apelează o funcție specifică, asigurați-vă că funcția există cu adevărat (funcții fantomă).
- Asigurați-vă că nu sunt utilizate apeluri externe în modificatori (modificatori)
- Sunt emise evenimente pentru fiecare funcție care modifică stocarea?
- Verificați-vă ipotezele cu privire la ceea ce fac și returnează contractele externe utilizate în principal.
- Aveți grijă la jetoanele care utilizează prea multe sau prea puține zecimale. Asigurați-vă că valorile maxime și minime acceptate sunt documentate.
- Autoritatea asociată rolurilor este documentată?
- Care sunt riscurile atunci când drepturile de acces sunt încălcate și cum poate afecta acest lucru diversele componente ale sistemului?
- Puterea proprietarului de a manipula jetoanele și ETH în cadrul contractului?
- Cum este stabilită adresa oracolului (Oracle) și care este procesul din spatele acesteia? Există oracole de rezervă pentru backup?
- Cum sunt implementate funcții similare în alte proiecte, au fost luate în considerare cele mai bune practici?
Această listă de verificare vă va ajuta să vă asigurați că efectuați un audit de securitate complet al contractelor inteligente Solidity. Ea acoperă o gamă largă de aspecte critice pentru a identifica și a atenua potențialele vulnerabilități și riscuri din cod și din sistemele aferente.
Sperăm că aceste exemple v-au ajutat să înțelegeți mai bine metodologia de audit a contractelor 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.