Un ghid pas cu pas pentru auditarea contractului inteligent al unui proiect cripto

Un audit al contractelor inteligente este o încercare structurată de a descoperi cum un contract poate eșua, poate fi utilizat greșit sau poate fi controlat într-un mod neașteptat de utilizatori. Nu este același lucru cu rularea unui scaner, citirea unei insignă de audit sau confirmarea faptului că codul sursă este verificat. Utilizați fluxul de lucru de mai jos pentru a revizui un contract EVM implementat sau o bază de cod înainte de a-i încredința fonduri semnificative.

Important: Acesta este un cadru practic de evaluare, nu o garanție că un proiect este sigur și nu oferă sfaturi de investiții. Un protocol de producție cu o valoare substanțială ar trebui să fie evaluat independent de către profesioniști cu experiență în domeniul securității. Imaginile în stil interfață din acest ghid sunt ilustrative și nu ar trebui tratate ca dovezi despre un anumit proiect sau o implementare.

Lista de verificare a auditului dintr-o privire

PasÎntrebare principalăDovezi utile
1. Domeniu de aplicareRevizuiesc exact contractul pe care îl solicită utilizatorii?Adresă, lanț, bytecode, proxy și implementare
2. Puncte de intrareCe poate face fiecare apelant?Funcții publice/externe, schimbări de stare, graf de apeluri
3. AutomatizareCe modele evidente merită atenție?Rezultatul compilatorului, constatările Slither, triajul detectorului
4. Securitate manualăPoate o secvență de apeluri să încalce presupunerile?Apeluri externe, reintrare, apeluri inverse, gestionarea defecțiunilor
5. LogicăContabilitatea rămâne corectă în cazurile limită?Aritmetică, rotunjire, taxe, limite, tranziții de stare
6. PrivilegiiCine poate schimba sau opri sistemul?Roluri, proprietar, chei de administrator, proxy, inițializator
7. TestareaSe menține comportamentul în cazul unor intrări și secvențe neașteptate?Teste unitare, fuzz, invariante și fork
8. RaportarePoate o altă persoană reproduce și retesta rezultatul?Starea constatărilor, impactului, dovezilor, remedierilor și retestării

Pasul 1: Confirmați domeniul de aplicare și artefactul implementat

Ecran generic de verificare a contractului care afișează rețeaua principală Ethereum, o adresă a contractului, versiunea compilatorului, starea sursei verificate și o potrivire exactă a bytecode-ului
O vizualizare de verificare a contractului care arată rețeaua, adresa, versiunea compilatorului și verificările de potrivire a bytecode-ului pentru înregistrare înainte de analiză.

Începeți cu lanțul și adresa exacte. Înregistrați adresa de implementare, hash-ul tranzacției, numărul blocului, versiunea compilatorului, setările optimizatorului, argumentele constructorului și commit-ul sau versiunea despre care echipa spune că este implementată. Un proiect poate avea mai multe adrese pentru un token, un router, un seif, un proxy, o implementare, un oracol sau o implementare de test. O verificare a adresei greșite nu are nicio valoare practică.

Verificați dacă sursa verificată a explorerului reproduce bytecode-ul implementat. Verificarea este utilă deoarece vă permite să inspectați sursa și ABI-ul, dar este doar o verificare a identității: nu dovedește că logica de business este sigură. Dacă contractul este actualizabil, identificați atât proxy-ul, cât și implementarea sa curentă. Citiți adresa de implementare din mecanismul documentat al proxy-ului sau din informațiile explorerului, apoi confirmați că implementarea este cea pe care intenționați să o revizuiți. Ghidul oficial de verificare Foundry al Etherscan documentează verificarea pentru contractele noi și existente.

De asemenea, definiți limita. Includeți bibliotecile importate, contractele moștenite, bibliotecile legate, contractele helper implementate, adaptoarele Oracle, token-urile primite de la utilizatori și componentele privilegiate off-chain. Notați ce este în afara domeniului de aplicare și de ce. Acest lucru previne ca o revizuire restrânsă să fie confundată cu o revizuire a întregului sistem.

Pasul 2: Creați o hartă a punctelor de intrare și a activelor

Fereastră generică de revizuire a surselor care listează funcțiile Solidity publice și externe alături de o implementare de contract în stil ERC-20
Un inventar de funcții care separă punctele de intrare publice și externe înainte ca recenzorul să urmărească modificările stării acestora.

Enumerați fiecare funcție publică și externă, inclusiv funcțiile moștenite și rutinele de gestionare a primirilor sau de rezervă. Pentru fiecare dintre ele, înregistrați dacă aceasta poate:

  • mutați moneda sau token-urile native;
  • menta, arde, împrumuta, lichida sau modifica contabilitatea;
  • modificarea unui oracol, a unei taxe, a unei limite, a unui rol, a unei stări de pauză sau a unei implementări;
  • efectuați un apel extern, un apel delegat sau un apel de nivel scăzut; sau
  • citește datele pe care se bazează o altă funcție de schimbare de stare.

Apoi, mapați activele și limitele de încredere. Urmăriți un depozit de la utilizator în spațiul de stocare, prin calcularea prețurilor și a cotelor, până la retragere. Identificați fiecare adresă furnizată de un apelant și fiecare adresă încărcată din spațiul de stocare. Întrebați care valori sunt considerate corecte: un oracol, un token, un mesaj bridge, un keeper, un receptor de apel invers sau un administrator. Țintele de revizuire cu cea mai mare valoare sunt funcțiile care combină inputul controlat de utilizator, starea privilegiată, aritmetica și un apel extern.

Pasul 3: Compilați corect și rulați analiza statică

Terminal generic care afișează punctul comenzii slither și rezultatele pentru reintrare, apeluri de nivel scăzut neverificate și o problemă a interfeței ERC-20
O analiză statică poate scoate la iveală rapid problemele potențiale, care trebuie totuși confirmate în raport cu codul real și modelul de amenințare.

Reproduceți versiunea proiectului cu versiunea Solidity, versiunile de dependențe, configurația optimizatorului și ipotezele lanțului țintă menționate. Tratați avertismentele compilatorului ca elemente de revizuire, mai degrabă decât ca zgomot inofensiv. Considerațiile de securitate ale Solidity recomandă în mod specific luarea în serios a avertismentelor, menținerea unor contracte ușor de înțeles și verificarea problemelor cunoscute ale compilatorului. Consultați lista oficială a erorilor cunoscute ale compilatorului Solidity atunci când versiunea compilatorului sau modelele de cod afectate o fac relevantă.

Pentru un proiect Hardhat, Foundry sau similar, rulați Slither din rădăcina proiectului. Documentația oficială descrie instrumentul ca un analizor static Solidity și Vyper și oferă comanda comună:

slither .

Salvați rezultatul și evaluați fiecare rezultat în funcție de impact și încredere. Examinați cu atenție descoperirile care implică trimiteri arbitrare de token-uri, upgrade-uri neprotejate, reintrare, valori returnate neverificate, apeluri delegate periculoase, tx.origin, aleatorietate slabă și interfețe incorecte. Un detector poate raporta un fals pozitiv, poate rata o eroare economică specifică proiectului sau poate semnala cod care este intenționat constrâns în altă parte. Analiza statică restrânge căutarea; nu înlocuiește raționamentul manual. Depozitul și documentația Slither listează, de asemenea, imprimante pentru puncte de intrare, autorizare, grafice de apeluri și rezumate de contracte care ajută la organizarea unei revizuiri.

Pasul 4: Urmărirea manuală a apelurilor externe și a reintrarii

Fereastră generică de revizuire a codului care evidențiază un apel de valoare de nivel scăzut înainte de o actualizare a soldului și o notă de revizuire a reintrarii de severitate ridicată
Un apel extern este evidențiat înaintea unei actualizări a soldului, ilustrând întrebarea de comandă pe care un recenzent ar trebui să o testeze în fiecare cale de retragere.

Pentru fiecare apel extern, opriți și urmăriți starea înainte, în timpul și după apel. Apelatul poate fi un contract malițios, un token cu hook-uri, un receptor de apel invers sau un alt protocol care modifică o dependență partajată. Documentația Solidity explică faptul că o interacțiune cu un alt contract poate transfera controlul către acel contract și recomandă modelul Checks-Effects-Interactions: validați mai întâi, actualizați starea acestui contract a doua oară și interacționați extern la urmă.

Nu limitați căutarea la transferuri Ether evidente. Verificați hook-urile în stil ERC-777, apelurile inverse ERC-1155, apelurile inverse flash-loan, ruterele arbitrare, apelurile oracle și apelurile efectuate prin bibliotecile moștenite. Verificați reintrarea între funcții și contracte: un apel invers poate intra într-o funcție diferită care citește o stare intermediară. Confirmați că fiecare apel de nivel scăzut își verifică rezultatul succesului și gestionează corect o valoare returnată. Întrebați dacă un destinatar eșuat poate bloca permanent retragerile sau o buclă.

Înregistrați o secvență de atac concretă pentru fiecare problemă plauzibilă. De exemplu: atacatorul depune bani, începe o retragere, primește un apel invers, reintroduce o a doua retragere și abia apoi permite finalizarea primului apel. Dacă secvența nu poate fi făcută să funcționeze din cauza unui invariant sau a unei gărzi specifice, notați motivul respectiv. Acest lucru face ca concluzia să fie auditabilă, mai degrabă decât speculativă.

Pasul 5: Testarea invarianților aritmetici și de afaceri

Listă de verificare generică pentru audit care prezintă verificări pentru limite întregi, rotunjire, calcul al prețului acțiunilor și cazuri limită cu valoare zero
O listă de verificare aritmetică și logică de afaceri evidențiază cazurile limită pe care testele obișnuite de tip „cale fericită” le omit adesea.

Verificați semnificația fiecărei unități și conversii: wei versus ether, zecimale token, puncte de bază, acțiuni versus active, valori cu semn și unități de timp. Urmați direcția de rotunjire. O împărțire care rotunjește în favoarea unui deponent, împrumutat, lichidator sau beneficiar de comisioane poate pierde valoare atunci când este repetată. Verificați înmulțirea înainte de împărțire, sumele minime și maxime, plafoanele comisioanelor, prețurile neactualizate, oferta zero, soldul zero și primul deponent sau ultimul retrăgător.

Solidity 0.8 și versiunile ulterioare detectează în mod normal depășirea și depășirea valorilor aritmetice, dar codul din interiorul unui uncheckedbloc modifică în mod deliberat acest comportament. Aritmetica verificată poate, de asemenea, face ca un protocol să revină la normal sau să devină inutilizabil dacă limitele nu sunt proiectate corect. Testați ambele rezultate: furt sau contabilizare incorectă și denial of service cauzat de o valoare care nu poate fi niciodată procesată.

Scrieți invarianții în limbaj simplu înainte de a-i transforma în teste. Exemplele includ „acțiunile totale corespund activelor conform regulii de rotunjire menționate”, „un utilizator nu poate retrage mai mult decât creanța sa înregistrată”, „oferta totală de tokenuri este egală cu suma soldurilor acolo unde se aplică modelul respectiv” și „o taxă nu poate depăși plafonul configurat”. Comparați soldurile de stocare cu soldurile reale ale tokenurilor, deoarece tokenurile pot fi trimise direct către un contract sau se pot comporta diferit față de implementarea ERC-20 presupusă.

Pasul 6: Examinați permisiunile și posibilitatea de actualizare

Ecranul cu permisiuni generice și posibilitatea de actualizare afișează rolurile de proprietar, administrator, utilizator care întrerupe procesul, utilizator care face upgrade și o relație proxy-implementare
Revizuirea privilegiilor ar trebui să conecteze fiecare rol la adresa sa, acțiunea permisă, procesul de transfer și calea de actualizare.

Construiți o matrice de privilegii. Pentru fiecare funcție administrativă, identificați rolul necesar, deținătorul actual, mecanismul de transfer, întârzierea, controlul cu semnături multiple sau guvernanță și comportamentul în situații de urgență. Acordați o atenție deosebită creării de funcții, pauzei, modificării taxelor, modificării surselor Oracle, recuperării fondurilor, actualizării codului și modificării adreselor de token sau router de încredere. Documentația OpenZeppelin privind controlul accesului distinge proprietatea simplă de permisiunile bazate pe roluri și descrie privilegiile minime ca o practică de securitate utilă.

Separați „codul permite unui administrator să facă asta” de „un utilizator arbitrar poate face asta”. Prima poate fi un risc explicit de guvernanță sau custodie; a doua este o vulnerabilitate de autorizare. Verificați dacă verificările de rol acoperă fiecare cale sensibilă, inclusiv asistenții interni accesibili din funcțiile publice. Verificați dacă un administrator implicit își poate acorda lui însuși sau altora puteri suplimentare și dacă transferul de proprietate poate fi trimis accidental către o adresă inutilizabilă.

Pentru proxy-uri, examinați inițializatorul, autorizația de implementare, întârzierea de actualizare, structura de stocare și planul de revenire la normal sau de urgență. Ghidul OpenZeppelin privind contractele actualizabile explică de ce constructorii nu inițializează stocarea proxy, de ce inițializatorii trebuie protejați, de ce o implementare nu ar trebui să rămână neinițializată și de ce schimbarea ordinii sau a tipurilor de stocare poate corupe o actualizare. Tratați o cheie de administrator proxy ca parte a limitei de securitate a protocolului, nu ca un detaliu de implementare.

Pasul 7: Exersați sistemul cu fuzzing, invarianți și furci

Tablou de bord generic de testare care prezintă teste fuzz reușite, teste invariante reușite și o secvență de apeluri contraexemplu
Campaniile de succes sunt dovezi utile, în timp ce o urmă contraexemplu arată exact ce secvență necesită investigare.

Executați teste unitare pentru comportamentul așteptat, apoi adăugați teste negative pentru apelanți neautorizați, valori zero, valori maxime, semnături expirate, date Oracle învechite, transferuri eșuate și operații repetate. Analizați intrările în loc să testați doar câteva numere selectate manual. Includeți actori multipli și contracte de receptori rău intenționați acolo unde designul permite apeluri inverse.

Folosește testarea invariabilă pentru proprietățile care trebuie să rămână adevărate după mai multe apeluri randomizate. Documentația de testare invariabilă Foundry descrie secvențe randomizate, intrări fuzzed, rulări, adâncime, contracte țintă și expeditori țintă. Configura handlere-uri astfel încât apelurile să fie semnificative; dacă fiecare depunere fuzzed este anulată deoarece actorul de testare nu are token-uri, un invariant care trece poate însemna pur și simplu că nicio stare utilă nu s-a schimbat.

Când este posibil, utilizați o bifurcație a rețelei țintă pentru a exersa adresele implementate, configurația curentă, comportamentul token-urilor și rutarea proxy. Păstrați testele fork în siguranță și doar pentru citire, cu excepția cazului în care utilizați o bifurcație locală izolată. Minimizați fiecare secvență eșuată și păstrați contraexemplu, adresele apelantului, contextul blocului, soldurile și valorile de stocare relevante. Un test care trece este o dovadă despre căile testate, nu o dovadă a tuturor căilor posibile.

Pasul 8: Scrieți constatările care pot fi corectate și retestate

Raport de audit generic care prezintă constatările în funcție de severitate, cu stările de risc deschis, remediat și acceptat, plus o listă de verificare pentru retestare
Un raport util leagă severitatea și starea problemei de dovezi, o corecție specifică și o condiție de retestare.

Folosiți o singură înregistrare per problemă. O constatare practică ar trebui să conțină:

  • Titlu și locație: contract, funcție, fișier și referință de linie sau cod.
  • Impact: ce poate fi furat, înghețat, umflat, ocolit sau incorectificat.
  • Condiție prealabilă: permisiunile, soldurile, temporizarea sau configurația necesare.
  • Reproducere: o scurtă secvență de tranzacții, test, urmă sau dovadă.
  • Recomandare: un cod specific sau o modificare operațională, cu compromisuri.
  • Stare: deschisă, remediată, atenuată, risc acceptat sau nereproductibilă.
  • Retestare: testul sau observația exactă care confirmă rezoluția.

Severitatea ar trebui să reflecte impactul realist și exploatabilitatea, nu cât de alarmant arată un model de cod. Explicați presupunerile. Un apel de nivel scăzut poate fi în siguranță în spatele unui invariant puternic; o modificare aparent obișnuită a parametrilor poate fi critică dacă controlează un oracol sau o actualizare. După o corecție, revizuiți diferența, rulați din nou testul relevant, rulați din nou suita completă și verificați dacă există regresii. Dacă adresa implementată a fost deja actualizată sau modificată, retestați implementarea și configurația on-chain.

Greșeli frecvente de audit de evitat

  • „Sursa este verificată, deci este sigură.” Verificarea stabilește corespondența între sursă și bytecode; nu validează designul.
  • „Scanerul nu a găsit nimic, deci nu există erori.” Instrumentele sunt cele mai puternice la tiparele cunoscute, în timp ce defectele economice și cele între contracte necesită adesea analiză umană.
  • „Proiectul are un raport de audit, deci implementarea curentă este acoperită.” Comparați commit-ul, domeniul de aplicare, adresele de implementare, remedierile și istoricul actualizărilor din raport.
  • „Testele fuzz au trecut, deci invariantul este corect.” Mai întâi confirmați că invariantul exprimă proprietatea economică intenționată și că gestionatorii ating stări semnificative.
  • „Controlul administrativ nu este o problemă de securitate.” Poate fi o presupunere intenționată de încredere, dar utilizatorii ar trebui să poată vedea cine poate crea, întrerupe, modifica parametrii sau face upgrade.

Autoverificare finală înainte de a avea încredere în rezultat

Ar trebui să poți răspunde cu da la aceste întrebări:

  • Am înregistrat setările exacte ale lanțului, adresei, bytecode-ului, proxy-ului, implementării și build-ului?
  • Am inventariat fiecare punct de intrare care schimbă starea și activele pe care le poate afecta?
  • Am compilat corect, am inspectat avertismentele și am triat constatările automate?
  • Am urmărit fiecare apel extern, apel invers, apel de nivel scăzut și cale de eroare?
  • Am testat rotunjirea, limitele, valorile zero, datele învechite și acțiunile repetate?
  • Am mapat toate rolurile privilegiate, cheile, întârzierile, inițializatoarele și căile de actualizare?
  • Am păstrat fuzz-ul semnificativ și contraexemplele invariante?
  • Poate un evaluator independent reproduce fiecare constatare și verifica fiecare corecție?

Dacă vreun răspuns este nu, etichetați auditul ca fiind incomplet și menționați dovezile lipsă. O limitare transparentă este mai utilă decât o concluzie vagă „sigură”. Securitatea contractelor inteligente este un proces continuu: fiecare actualizare, modificare a dependenței, integrare nouă și modificare a privilegiilor poate crea o nouă limită de revizuire.

Lasă un comentariu

Managing Crypto Portfolio Risk: How to Allocate Your Assets

Managing Crypto Portfolio Risk: How to Allocate Your Assets

Learn how to allocate crypto by risk tolerance, time horizon, diversification, custody, liquidity, and rebalancing—without relying on a one-size-fits-all formula.

Un ghid pas cu pas pentru auditarea contractului inteligent al unui proiect cripto

Un ghid pas cu pas pentru auditarea contractului inteligent al unui proiect cripto

Învață cum să auditezi pas cu pas contractul inteligent al unui proiect cripto, de la verificarea permisiunilor de implementare și mapare până la testarea logicii, actualizărilor și remedierilor.

Ghidul complet pentru construirea unui portofoliu de criptomonede pe termen lung

Ghidul complet pentru construirea unui portofoliu de criptomonede pe termen lung

Construiește un portofoliu pe termen lung de criptomonede cu un cadru axat pe risc pentru alocare, selecție de active, custodie, disciplină de cumpărare, reechilibrare, evidențe și evitarea înșelăciunilor.

On-Chain Analysis for Beginners: How to Track Whale Wallets and Smart Money

On-Chain Analysis for Beginners: How to Track Whale Wallets and Smart Money

Learn how to read on-chain data, track whale wallets, evaluate smart-money labels, and separate verifiable blockchain facts from inference before acting on wallet activity.

Eroare „Marjă insuficientă” în contractele futures pe criptomonede: Ce înseamnă și cum se rezolvă

Eroare „Marjă insuficientă” în contractele futures pe criptomonede: Ce înseamnă și cum se rezolvă

Află de ce platformele futures pentru criptomonede afișează o eroare „Marjă insuficientă”, cum să diagnostichezi cauza, să o remediezi în siguranță și să eviți problemele legate de marjă înainte de a plasa următoarea tranzacție.

Binance Launchpad și Launchpool: Cum să participi și să câștigi tokenuri noi

Binance Launchpad și Launchpool: Cum să participi și să câștigi tokenuri noi

Află cum funcționează Binance Launchpad și Launchpool, cum să verifici eligibilitatea, să te alături în siguranță, să urmărești recompensele și să înțelegi limitele și riscurile.

Eroarea „Toleranță de alunecare depășită” pe CEX-uri și DEX-uri: Cum se remediază

Eroarea „Toleranță de alunecare depășită” pe CEX-uri și DEX-uri: Cum se remediază

Află ce înseamnă „toleranță de alunecare depășită” pe CEX-uri și DEX-uri, cum să verifici dacă o tranzacție a eșuat și când să actualizezi, să reduci dimensiunea, să utilizezi un ordin limită sau să ajustezi toleranța.

Bybit Copy Trading: How to Follow and Copy Top-Performing Crypto Traders

Bybit Copy Trading: How to Follow and Copy Top-Performing Crypto Traders

Learn how Bybit Copy Trading works, how to evaluate Master Traders, set copy parameters, manage risk, and monitor copied USDT perpetual trades.

Înțelegerea tokenomicii: Cum afectează cererea și oferta prețul unei monede

Înțelegerea tokenomicii: Cum afectează cererea și oferta prețul unei monede

Află cum oferta, cererea, deblocările, emisiile, consumurile și utilitatea de tokenuri pot afecta prețul unei criptomonede - și ce nu poate prezice tokenomica.

Cum să analizezi volumul tranzacțiilor pentru a confirma o pompă de criptomonede

Cum să analizezi volumul tranzacțiilor pentru a confirma o pompă de criptomonede

Învață cum să compari volumul criptomonedelor cu valoarea sa de referință, să confirmi depășirile de preț, să identifici momentumul care scade și să eviți să confundi o creștere manipulată cu o creștere puternică.