Teste de proprietate generalizate pentru seifurile ERC4626 PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Teste de proprietate generalizate pentru seifurile ERC4626

Pe măsură ce DeFi crește și se maturizează, infrastructura scalabilă și compozibilitatea sunt de prim rang pentru dezvoltatori. Solicitări Ethereum pentru comentarii (sau ERC) - seturi de instrumente standardizate pentru construirea de aplicații bazate pe Ethereum, cum ar fi standardul de simboluri utilizat pe scară largă ERC20 — să servească rolul esențial de a oferi orientări consecvente pentru ca dezvoltatorii să contribuie la ecosistem fără a începe de la zero. La inceputul acestui an, standard de seif tokenizat ERC4626 a fost creat pentru a încuraja compatibilitatea încrucișată între jetoanele cu randament. Standardizarea detaliilor implementărilor poate aborda, de asemenea, probleme stringente de componabilitate, făcând integrarea protocolului mai ușoară și, în cele din urmă, mai puțin predispusă la erori.

Mai multe proiecte DeFi au deja adoptată standardul, căutând să sporească gradul de compoziție al seifurilor lor și anticipăm o adoptare mai largă în întregul ecosistem. Adaptarea bolților existente cauzează totuși unele dureri de creștere; critic, anumite erori de implementare pot expune noi ținte pentru atac. Chiar și erorile mici (la fel de mici precum interpretarea greșită a interfeței standard) pot avea consecințe semnificative atât pentru securitate, cât și pentru experiența utilizatorului, subliniind nevoia de mai multe instrumente și măsuri de securitate, în special în cadrul unui ecosistem DeFi mai compus. 

Din fericire, erorile simple pot avea soluții relativ simple dacă sunt detectate cu mult înainte de a fi exploatate (și, în mod ideal, chiar înainte de a fi implementate). În acest scop, am eliberat Teste de proprietate ERC4626 pentru fuzzing și execuție simbolică pentru a ajuta constructorii de seifuri să detecteze încălcările standard care pot întrerupe integrările sau pot duce la vulnerabilități pe linie. În această postare, explicăm problema motivației, parcurgem abordarea noastră și încheiem cu câteva sfaturi utile.

Mai întâi, câteva detalii despre standardul ERC4626

Finalizat în martie, ERC4626 este standardul pentru seifurile tokenizate. A fost introdus în scopul extinderii celei utilizate pe scară largă ERC20 standard (în prezent, baza pentru sute de jetoane), încurajează standardizarea în seifurile cu randament și asigură compozibilitatea aplicațiilor și protocoalelor (de exemplu, agregatorii de randament) care trebuie să interacționeze cu acestea. Aceasta înseamnă că orice aplicație construită pe un seif ERC4626 poate fi extinsă cu ușurință pentru a funcționa cu orice alt seif ERC4626. 

Seifurile cu simboluri permit utilizatorilor să depună liber active pentru a bate acțiuni din seif și ulterior să răscumpere acele acțiuni pentru a retrage principalul și dobânda din seif. Aceste acțiuni de seif sunt jetoane ERC20 și, prin urmare, pot fi tranzacționate cu ușurință sau utilizate ca garanție pentru a împrumuta alte active. De exemplu, utilizatorii își pot depune activele în seifurile Yearn pentru a bate jetoane yVault, care pot fi apoi tranzacționate pe Uniswap, mize pentru un randament suplimentar sau folosite ca garanție pentru protocoalele de împrumut.

Logica de afaceri pentru generarea și distribuirea randamentului (și determinarea prețului acțiunilor) poate varia în funcție de implementare. Pentru a acoperi cât mai multe seifuri posibil (cu scopul de a le face interoperabile vs. identice), standardul ERC4626 se concentrează pe descrierea interfeței cu utilizatorul, lăsând majoritatea detaliilor de implementare nespecificate. Acest lucru permite variații în logica de afaceri atâta timp cât seiful îndeplinește cerințele specifice ale interfeței și încurajează interoperabilitate în multe tipuri diferite de aplicații și tipuri de seifuri ERC4626.

Pe măsură ce se creează mai multe seifuri, ne așteptăm să le vedem implementate conform standardului ERC4626 încă de la început; dar ne aflăm în prezent într-o fază oarecum de tranziție, în care dezvoltatorii care doresc să profite de o mai mare compozibilitate vor trebui să actualizeze seifurile, aplicațiile și protocoalele existente pentru a se conforma cu standardul. Și pe măsură ce fac upgrade, se confruntă cu o serie de complexități și provocări. 

Provocările conformității cu standardele (și capcanele neconformității)

Respectarea unui nou standard nu este întotdeauna simplă. Fiecare seif ERC4626 trebuie să implementeze cu fidelitate (și exact) cerințele standardului așa cum este descris. În caz contrar, integrarea seifurilor ERC4626 devine din ce în ce mai complexă pentru a ține seama de diferitele variații. Această complexitate face ca integrările să fie în mod inerent predispuse la erori; și pentru că nu sunt suficient de sigure pentru viitor, pot duce la vulnerabilități de securitate în timp.

Jetoanele ERC20 non-standard (de exemplu, Tether USD) necesită ca multe sisteme DeFi să utilizeze o bibliotecă suplimentară (cum ar fi SafeERC20) atunci când efectuează transferuri de jetoane pentru a face față în siguranță comportamentelor divergente (de exemplu, să nu returneze nimic atunci când un transfer reușește în loc să fie returnat). true). Aceasta înseamnă că orice sistem care interacționează cu aceste jetoane ar putea deveni vulnerabil dacă sistemul nu este proiectat să gestioneze în mod corespunzător cazurile de „returnări lipsă”. Aceste scenarii pot introduce o capcană comună de securitate și pot crește costurile generale de dezvoltare și întreținere (când se iau în considerare logica și dependențele suplimentare necesare pentru a atenua problemele). Conformitatea cu standardul este, prin urmare, critică nu numai pentru implementările individuale, ci și pentru securitatea întregului ecosistem. O vulnerabilitate într-un singur sistem sau dependență poate cauza probleme larg răspândite.

În mod ideal, standardele ar fi specificate formal, fără ambiguitate (de exemplu, specificația formală a ERC20), și fiecare implementare ar putea fi verificată în mod oficial în raport cu specificația standard. În practică, însă, acest lucru nu este ușor de realizat într-o perioadă scurtă de timp, din cauza costurilor și efortului necesar comunității.

Introducerea proprietăților executabile ERC4626 pentru a identifica problemele de conformitate 

Pe măsură ce lucrăm spre o stare ideală (fiecare seif verificat în mod formal conform specificațiilor formale riguroase), am scris standardul ERC4626 proprietăţi pentru a surprinde discrepanțe în detalii subtile și ușor de ratat ale cerințelor standard.  

Dezvoltatorii Vault pot rula testele pentru a detecta potențialele încălcări ale standardelor în implementările lor înainte de implementare. Iar integratorii de seifuri pot verifica dacă seifurile date respectă standardul înainte de a le integra în sistemul lor. Proprietățile pot fi, de asemenea, testate împotriva seifurilor active deja implementate pe rețeaua principală, prin testarea fork-ului rețelei principale. Testarea seifurilor live poate fi utilă – mai ales atunci când seifurile au fost implementate sau actualizate recent – ​​pentru a vă asigura că toți parametrii sistemului au fost setați corect. 

Am ales teste bazate pe proprietăți — scrise în Foundry și gata să fie rulate de fuzzer-ul său — pentru a face proprietățile executabile (și astfel testabile). În viitor, acestea pot fi, de asemenea, executate prin instrumente de execuție simbolică sau de verificare a modelului pentru a verifica în mod oficial dacă seiful dat îndeplinește proprietățile pentru toate intrările și condițiile posibile.

Am scris proprietățile să fie suficient de generale pentru a fi aplicate unei game largi de seifuri care implementează o logică de afaceri diferită. Am folosit doar funcții de interfață publică pentru a le face agnostice față de detaliile de implementare. (Datorită acestei restricții, totuși, anumite cerințe standard care se referă la datele interne specifice implementării au fost omise din proprietăți.)

De exemplu, următoarea proprietate corespunde uneia dintre cerințele convertToShares() funcție, „NU TREBUIE să arate nicio variație în funcție de apelant.” Având în vedere cele două adrese de cont și suma, face apel la fiecare dintre conturi convertToShares() cu aceeași sumă și se asigură că cele două valori returnate sunt egale. Această proprietate este independentă de detaliile de implementare ale convertToShares(), care variază în funcție de seif și trebuie să fie satisfăcut de orice seif care implementează ERC4626. Această proprietate poate fi executată furnizând valori specifice de intrare (pentru testarea unitară), multe intrări aleatorii (pentru testarea fuzz) sau valori simbolice (pentru execuția simbolică și verificarea formală). De asemenea, poate fi rulat local sau pe o furcă de rețea principală (pentru testarea integrării).

Caz de utilizare: proprietăți care testează erorile de rotunjire

Erorile de rotunjire, de exemplu, sunt o clasă importantă de erori (aparent minore) care pot avea unele implicații în serie. Logica contabilă de bază a ERC4626, de exemplu, calcularea numărului de acțiuni care urmează să fie bătute sau a cantității de active care trebuie retrasă, este implementată folosind aritmetica cu virgulă fixă ​​- erorile de rotunjire sunt inevitabile. Pentru securitate, totuși, standardul specifică în mod explicit direcția de rotunjire preferată pentru fiecare funcție de interfață, lăsând în același timp limitele de eroare nespecificate și dependente de implementare. Mai exact, cel deposit() și redeem() funcțiile ar trebui să returneze un în-aproximarea valorii exacte, în timp ce cel mint() și withdraw() funcțiile ar trebui să returneze un peste-apropiere. De exemplu, dacă prețul actual al acțiunii (adică, valoarea activelor pe acțiune) este 2, atunci deposit() cu 3 wei de active ar trebui să bată doar până la 1 wei de acțiuni (adică, floor(3/2)), in timp ce withdraw() cu 3 wei de active ar trebui să ardă cel puțin 2 wei de acțiuni (adică, ceil(3/2)).

Am scris proprietățile legate de rotunjire pentru a fi independente de logica contabilă subiacentă, tratând-o ca o cutie neagră. Mai exact, le-am formulat ca așa-numitele proprietăți „dus-întors”, care descriu relația dintre două funcții opuse. De exemplu, următoarea proprietate specifică faptul că retragerea activelor care tocmai au fost garantate prin baterea de acțiuni N trebuie să ardă nu mai puțin de N acțiuni. Cu alte cuvinte, nimeni nu poate obține un profit gratuit transformând active și acțiuni din seif înainte și înapoi prin baterea și retragerea în mod repetat.

fragment din testele de proprietate ERC4626

Într-adevăr, am constatat că mai multe seifuri ERC4626 de pe rețeaua principală nu reușesc să satisfacă proprietatea de mai sus din cauza erorilor de rotunjire. Aceasta înseamnă că oricine ar putea câștiga, de exemplu, o pereche de satoshi BTC (1 satoshi ~= 0.02 cent în momentul scrierii) prin simpla (și în mod repetat) batere și retragere, drenând încet seiful. Acest lucru poate genera un profit pentru lanțurile care se bucură de taxe foarte mici de gaz (de exemplu, Fantom) sau dacă prețul activelor devine suficient de mare în viitor.

Testarea standardului ERC4626 în sălbăticie

Ne-am testat proprietățile împotriva a ~100 de seifuri ERC4626 pe rețeaua principală și am găsit multe seifuri care nu au respectat cerințele standard - mai ales din cauza erorilor de rotunjire (de exemplu, folosind rotunjirea podelei acolo unde se dorește tavanul, așa cum am descris). Mai exact, anumite seifuri nu au reușit să bată numărul exact de acțiuni solicitat de către mint() funcția, deși standardul cere în mod explicit acest. Unii dintre ei au emis și un inconsistent Deposit eveniment în care datele înregistrate sunt diferite de ceea ce a fost de fapt bătut. Spre surprinderea noastră, unele bolți nu au bătut deloc pe loc; în schimb, pur și simplu pun cererile mint într-o coadă și le procesează ulterior într-un lot ca tranzacție separată.

Deși aceste comportamente divergente nu erau exploatabile în sine, ele pot deveni vulnerabile atunci când sunt integrate în alte sisteme care se așteaptă doar la comportamentele standard. Aceste probleme vor face integrarea seifului mult mai dificilă, potențial neutralizând eforturile în curs și stimulând motivația din spatele standardizării.

Folosind testele noastre de proprietate și alți pași acționați către conformitatea standard

Respectarea precisă a standardului poate preveni comportamentele divergente (în mod ideal, înainte ca acestea să fie implementate). Sperăm că proprietățile noastre vă vor ajuta, împreună cu câteva acțiuni suplimentare. Pentru cei care dezvoltă și/sau integrează seifuri ERC4626:

  • Vă recomandăm cu căldură să gestionați proprietatea noastră teste împotriva boltilor tale. Ei vor găsi rapid probleme dacă există încălcări clare ale standardului.
  • Vă sugerăm, de asemenea, să revizuiți proprietăţi pentru a verifica încrucișarea înțelegerea dvs. a cerințelor standard și pentru a vă ajusta implementarea dacă există vreo discrepanță neintenționată.
  • Dacă seiful dvs. trebuie să diverge de la standard, vă recomandăm să documentați în mod clar comportamentele nestandard, astfel încât alții să poată gestiona în mod corespunzător aceste abateri atunci când se integrează cu seiful dvs. Vă rugăm să rețineți că acest lucru ar trebui considerat ca o ultimă soluție.

***
Seifurile ERC4626 au potențialul de a deveni un element de construcție important pentru DeFi în viitorul apropiat - și, de dragul compozibilității, este important ca atât seifurile noi, cât și cele existente să urmeze standardul. Noi implementări vor apărea în urma standardului, așa că nu există un moment mai bun decât prezentul pentru a standardiza seifurile existente. 

Pe măsură ce lucrăm spre o stare ideală (unde diferite seifuri sunt compuse uniform), testele de proprietate ERC4626 pot fi efectuate pentru a detecta mai ușor încălcările standard în implementările seifului. Testele de proprietate (cu documentație și exemple) sunt toate disponibile public în Github-ul nostru depozit. Așteptăm feedback-ul și contribuțiile dvs.!

***
Părerile exprimate aici sunt cele ale personalului individual AH Capital Management, LLC („a16z”) citat și nu sunt punctele de vedere ale a16z sau ale afiliaților săi. Anumite informații conținute aici au fost obținute din surse terțe, inclusiv de la companii de portofoliu de fonduri administrate de a16z. Deși este luat din surse considerate a fi de încredere, a16z nu a verificat în mod independent astfel de informații și nu face nicio declarație cu privire la acuratețea actuală sau de durată a informațiilor sau adecvarea acestora pentru o situație dată. În plus, acest conținut poate include reclame de la terți; a16z nu a revizuit astfel de reclame și nu aprobă niciun conținut publicitar conținut în acestea.

Acest conținut este furnizat doar în scop informativ și nu ar trebui să fie bazat pe consiliere juridică, de afaceri, de investiții sau fiscală. Ar trebui să vă consultați propriii consilieri cu privire la aceste aspecte. Referințele la orice titluri de valoare sau active digitale au doar scop ilustrativ și nu constituie o recomandare de investiții sau o ofertă de a oferi servicii de consiliere în materie de investiții. În plus, acest conținut nu este îndreptat și nici nu este destinat utilizării de către niciun investitor sau potențial investitor și nu poate fi bazat în nicio circumstanță atunci când se ia o decizie de a investi într-un fond administrat de a16z. (Ofertă de a investi într-un fond a16z va fi făcută numai prin memoriul de plasament privat, acordul de subscriere și alte documente relevante ale oricărui astfel de fond și trebuie citită în întregime.) Orice investiții sau companii de portofoliu menționate, la care se face referire sau descrise nu sunt reprezentative pentru toate investițiile în vehicule administrate de a16z și nu poate exista nicio asigurare că investițiile vor fi profitabile sau că alte investiții realizate în viitor vor avea caracteristici sau rezultate similare. O listă a investițiilor realizate de fondurile gestionate de Andreessen Horowitz (excluzând investițiile pentru care emitentul nu a oferit permisiunea ca a16z să dezvăluie public, precum și investițiile neanunțate în active digitale tranzacționate public) este disponibilă la https://a16z.com/investments /.

Diagramele și graficele furnizate în interior au doar scop informativ și nu trebuie să se bazeze pe acestea atunci când se ia vreo decizie de investiție. Performanța trecută nu indică rezultatele viitoare. Conținutul vorbește doar de la data indicată. Orice previziuni, estimări, previziuni, obiective, perspective și/sau opinii exprimate în aceste materiale pot fi modificate fără notificare și pot diferi sau pot fi contrare opiniilor exprimate de alții. Vă rugăm să consultați https://a16z.com/disclosures pentru informații suplimentare importante

Timestamp-ul:

Mai mult de la Andreessen Horowitz