Prima dată când un utilizator plătește patruzeci de dolari ca să revendice o recompensă de cinci dolari, modelul tău de gas încetează să mai fie o abstracțiune. Gas-ul este prețul fiecărui opcode pe care îl rulează contractul tău, plătit în bani reali de cel care trimite tranzacția. Scrie neglijent și vei taxa fiecare interacțiune pe toată durata de viață a contractului. Optimizează orbește și vei livra ceva ce niciun auditor nu poate citi, ceea ce este propriul său tip de bug, mai scump.
Stocarea este lucrul scump
Nimic din ce faci pe EVM nu costă precum scrierea în stocare. O singură scriere la rece în stocare depășește cu ordine de mărime aritmetica, memoria și calldata, iar o plătești la fiecare actualizare, pentru totdeauna. Așadar proiectează aranjamentul stării mai întâi, nu la final. Împachetează valorile înrudite astfel încât mai multe câmpuri să împartă un singur slot de 32 de octeți: un uint96 pentru sumă și un uint160 pentru adresă încap împreună; două marcaje de timp și un indicator de stare pot împărți un slot în loc să ardă trei. Citește și scrie acele sloturi împreună, ca EVM să poată reutiliza un slot cald în loc să plătească prețul rece de două ori. Și fii onest cu privire la ce trebuie cu adevărat să existe on-chain. Datele pe care le citești doar off-chain nu au ce căuta deloc în stocare.
Aceasta este cea mai frecventă cheltuială în plus pe care o vedem. Echipele scriu în stocare lucruri de care au nevoie doar pentru istoric: piste de audit, prețuri trecute, un jurnal cu cine ce a făcut. Emiterea unui eveniment costă o fracțiune dintr-o scriere în stocare, iar evenimentele pot fi interogate complet din orice indexer sau subgraph. Dacă însuși contractul nu citește niciodată o valoare în timpul execuției, aceasta ar trebui să fie un eveniment, nu o variabilă de stare. Păstrează în stocare doar ce trebuie să consulte contractul pentru a lua o decizie on-chain. Restul este istoric, iar istoricul aparține jurnalului.
Grupează munca, mărginește fiecare buclă
Fiecare tranzacție plătește un cost de bază înainte de a face ceva util, așa că amortizează-l. O funcție care acceptă un tablou și procesează multe elemente într-un singur apel este mult mai ieftină per element decât aceeași muncă împrăștiată în multe tranzacții. Regula complementară este mai strictă: nu scrie niciodată o buclă a cărei lungime un utilizator sau trecerea timpului o pot crește nelimitat. O buclă nemărginită este două buguri deodată. Este un cost de gas care crește până când tranzacția nu mai încape într-un bloc, și este un vector de refuz al serviciului, în care un singur cont mare poate îngheța o funcție pentru toți. Preferă tiparele bazate pe extragere în locul împingerii către o mulțime și paginează orice ar putea crește.
Optimizează calea fierbinte, măsoară restul
Nu fiecare unitate de gas economisită merită prețul ei în complexitate. Assembly scris de mână, trucuri de biți împachetați și cache-uri ingenioase schimbă lizibilitatea pe o reducere, iar lizibilitatea nu este gratuită. Se plătește la audit, când un evaluator trebuie să se convingă că trucul este sigur, iar fiecare oră din acea evaluare costă mai mult decât gas-ul economisit pe o funcție care rulează de două ori pe zi. Așadar optimizează calea fierbinte care rulează la fiecare tranzacție, lasă funcțiile administrative reci simple și clare, și lasă cifrele să tranșeze disputa. Pune gas-ul în suita de teste: fă instantanee ale costului operațiunilor tale de bază, verifică față de acele instantanee și oprește build-ul când o modificare face o cale comună mai scumpă. Gas-ul devine o valoare pe care o revizuiești într-un diff, ca orice altă regresie, în loc de o surpriză pe care un utilizator o descoperă în producție.
Ieftin și ilizibil nu este o optimizare. Este o datorie pe care o plătești de fiecare dată când cineva trebuie să demonstreze că contractul este sigur.— Protocore · Inginerie blockchain
Designul conștient de gas nu este o pungă de trucuri aplicată la final. Este un număr mic de decizii luate devreme: aranjează stocarea deliberat, ține istoricul în evenimente, grupează ce poți și mărginește ce trebuie, și măsoară restul ca să optimizezi căile care contează și niciuna în plus. Fă asta și obții contracte ieftine de folosit și totuși suficient de lizibile încât să inspire încredere. Aceste două proprietăți nu sunt în conflict. Vin din același obicei de a ști exact cât costă codul tău.
Ai un sistem de construit?
Spune-ne care e problema. Revenim cu o arhitectură și un plan.
Începe un proiect