Jedinica 2 / 11

Podrška za pisanje pametnih ugovora: Solidity/Vyper nacrt i generiranje sigurnog koda

Dobici:

  • Sposobnost korištenja umjetne inteligencije za izradu okvira, testova i pregleda nacrta na temelju dokazanih biblioteka (npr. OpenZeppelin) i razumijevanje da ljudi jamče sigurnost proizvodnje
  • Sposobnost provjere verzije koda, uzorka i kontrole pristupa koju proizvodi umjetna inteligencija putem kompilacije, testiranja i testneta
  • Biti u stanju razlikovati da kompilacija ne znači biti siguran i da su testnet i revizija bitni.

Pisanje pametnog ugovora razlikuje se od običnog softvera: kod koji pišete je javan, nepromjenjiv i program koji izravno premješta novac. U ovoj ćete jedinici naučiti kako koristiti AI kao pomoćnika za razvoj pametnih ugovora; Učit ćemo od izrade nacrta do pisanja testa, od opoziva uzorka do optimizacije plina (transakcijska naknada). Ali budimo jasni od samog početka: AI proizvodi nacrte; Ljudi osiguravaju siguran kod koji ide u proizvodnju.

Osnova prije svega: jezik i okolina

Najčešći jezik pametnih ugovora je Solidity (jezik Ethereuma i EVM — Ethereum Virtual Machine, virtualni stroj na kojem se izvode ugovori — kompatibilni lanci). Alternativa je Vyper (jezik sličan Pythonu koji ima za cilj biti ograničeniji i čitljiviji). Vaš kod troši plin (trošak svake transakcije u blockchain); Neučinkovit kod je skup. Održavanje jasnih pojmova u kontekstu koji ste dali umjetnoj inteligenciji ključno je za dobivanje točnog rezultata.

Ono gdje je umjetna inteligencija najvrjednija nije u "pisanju od nule", već u izradi okvira + dobrog kalupa: početak usklađen sa standardima, nacrt na koji možete dodati svoju stručnost.

Slojevi korištenja AI u kodiranju

1. Generiranje kostura. AI brzo rudari kostur standardnog tokena (ERC-20) ili NFT (ERC-721 — jedinstveni standard digitalne imovine). Ali budite sigurni da AI koristi provjerenu biblioteku: na primjer, OpenZeppelin (pouzdana, revidirana standardna ugovorna biblioteka zajednice). Pravilo je koristiti testirani blok radije nego pisati sigurnost od nule.

2. Opis funkcije i pregled. Objašnjavanje postojeće funkcije umjetnoj inteligenciji omogućuje vam rano uočavanje logičkih pogrešaka.

3. Generiranje testa. AI je dobar u generiranju testnih slučajeva za rubne slučajeve: nula unosa, vrlo velik broj, neovlašteni pozivatelj, ponovljeni poziv. Ovo podsjeća na jedan od scenarija koji se preskaču.

4. Plin i čitljivost. AI označava skupe obrasce kao što je nepotrebno upisivanje u pohranu i predlaže alternative.

Savjet: Uputite umjetnu inteligenciju da "izradi na revidiranim ugovorima OpenZeppelina, ponovno napiše sigurnost od nule." Puno je riskantnije za AI napisati izvorni sigurnosni kod nego koristiti testiranu biblioteku.

Slab upit / Jak upit

Slab upit:

Napiši mi simbolični ugovor.

Ovaj upit je opasan: nije jasno koji standard, koji lanac, koja biblioteka, koji sigurnosni zahtjev. AI generira nasumični, vjerojatno zastarjeli ili nesiguran kod.

Snažan upit:

Vaša uloga: stariji Solidity programer. Generirajte nacrt tokena ERC-20 za lanac kompatibilan s EVM-om. Pravila:- Temeljeno na OpenZeppelin-ovim revidiranim ERC20 i Ownable ugovorima.- Izričito napišite liniju Solidity verzije i licence (SPDX).- Samo vlasnik ima dopuštenje za kovanje; dodati kapu protiv beskonačnog pritiskanja. - Dodajte NatSpec komentar svakoj funkciji. - Napišite sigurnost od nule; Koristite standardni blok. - Dodajte upozorenje na kraju: "Ovo je nacrt; potrebna je revizija i testiranje". Označite područja za koja niste sigurni s // TODO.

Razlika: snažan prompt daje jasnu ulogu, standard, biblioteku, sigurnosnu granicu, dokumentaciju i očekivanja provjere valjanosti.

Četiri predloška za kopiranje

1) Kostur temeljen na standardima:

Vaša uloga: Solidity programer. Generirajte [ERC-20 / ERC-721 / staking] ugovorni okvir na temelju OpenZeppelin revidirane knjižnice. Napišite SPDX licencu i pragma verziju. Dodajte kontrolu pristupa (tko može nazvati) svakoj vanjskoj funkciji. Ponovno otkrivanje sigurnosti; Koristite standardne blokove. Ovo je nacrt.

2) Pregled funkcije:

Ispitajte sljedeću funkciju poput starijeg programera: što radi, koja stanja mijenja, tko je može pozvati? Označite moguće logičke pogreške i sigurnosne rizike kao HIPOTEZE, povezujući svaku s retkom u kodu. Nemojte odmah reći "sigurno"; samo navedite točke pažnje.

3) Nacrt testnog scenarija:

Predloži testne slučajeve za ovaj ugovor (može biti nacrt za Ljevaonicu/Hardhat). Posebno pokrijte ograničene slučajeve: nulti unos, vrlo velik broj, neovlašteni poziv, reentrant poziv, nedostatna sredstva. Napišite ŠTO svaki test potvrđuje.

4) Pregled plina i čitljivosti:

U ovom ugovoru označite obrasce koji mogu smanjiti trošak plina: nepotrebno pisanje pohrane, vanjski poziv u petlji, ponavljajući izračun. Objasnite razliku prije/poslije u svakom prijedlogu. Preporučite optimizacije za probijanje sigurnosti; Ako nije jasno, recite "pitajte revizora".

Tri mini kofera (u broju)

Slučaj 1 — Kostur spašen 4 sata. Jedan tim je u 30 minuta iskopao kostur revidiranog ugovora o stjecanju prava temeljenog na knjižnici s AI; Ručno je trebalo ~4 sata. Tim je posvetio vrijeme sigurnosti i testiranju. Dobitak nije došao od prijenosa sigurnosti, već od ubrzavanja zamornog okvira.

Slučaj 2 — Zamka zastarjele verzije. AI je proizveo obrazac koji šalje sirovi Ether prijenosom, što se više ne preporučuje jer su podaci o obuci zastarjeli. Programer je to primijetio i promijenio u trenutni obrazac koji se temelji na pozivima i zaštićen je ponovnim ulaskom. Lekcija: Knjižnica/uzorak umjetne inteligencije uvijek se potvrđuje da je ažuran; AI ne zna dalje od krajnjeg datuma obuke.

Slučaj 3 — Testna skica otkrila je skrivenu pogrešku. Test "neovlaštenog pozivatelja" koji je AI napravio otkrio je da je programer zaboravio kontrolu pristupa u funkciji. onlyOwner nedostaje 1 linija, uhvaćen za 5 minuta na testnetu; Moglo je doći do gubitka sredstava na glavnoj mreži. Lekcija: AI pokriva ljudsku slijepu točku u testiranju.

Pamćenje sigurnosnih obrazaca pomoću AI

AI je dobra u podsjećanju na poznate obrasce ranjivosti poput popisa za provjeru. Najčešći uzorci:

  • Ponovni pristup: Upućivanje vanjskog poziva bez ažuriranja statusa. Rješenje: redoslijed provjere-učinci-interakcije, zaštita od ponovnog ulaska.
  • Nedostatak kontrole pristupa: Svatko može pozvati kritičnu funkciju.
  • Integer overflow/underfall: Modern Solidity hvata većinu njih, ali još uvijek predstavlja rizik u kodu niske razine.
  • Neadekvatna potvrda unosa: nula adresa, nula kontrola količine.
  • Oracle ovisnost: slijepo povjerenje u vanjske podatke (kao što je cijena).
Pažnja: AI može pozvati ovaj popis, ali ne može jamčiti nalazi li se stavka na popisu u vašem specifičnom kodu. Popis za provjeru je početak; Nije zamjena za kontrolu kontejnera.

Pravilan kontekst: Tajna dobrog koda iz umjetne inteligencije

Kvaliteta koda koji AI proizvodi izravno ovisi o kvaliteti konteksta koji mu date. U Web3 ovo je posebno kritično jer jedan mali detalj (koji lanac, koja verzija Solidityja, koji standard tokena) mijenja cijeli izlaz. Dobar kontekst uključuje:

  • Ciljni lanac i okruženje: Ethereum mainnet ili Layer 2 (jeftiniji bočni lanac koji radi na vrhu glavnog lanca)? Cijena goriva i neke značajke razlikuju se ovisno o lancu.
  • Verzija i biblioteka: Koja verzija Solidityja, koja verzija OpenZeppelina? Ako verzija nije navedena, AI može proizvesti zastarjele, odbačene uzorke.
  • Sigurnosni zahtjevi: Postoji li ograničenje, može li se pauzirati, može li se povećati? To treba reći od samog početka.
  • Ograničenja: Jasna ograničenja kao što su "ne koristiti montažu", "izbjegavati vanjski poziv", "optimizirati plin, ali zadržati čitljivost".

Još jedna moćna tehnika je prvo zatražiti od umjetne inteligencije plan, a zatim kod: "Prvo navedite funkcije ovog ugovora i što će svaka raditi; napišite kod kad ga odobrim." Ovo rano hvata AI kako ide u krivom smjeru i omogućuje vam da zadržite arhitektonsku odluku.

Savjet: Pitajte AI ​​"zašto ste napisali ovaj kod ovako?" pitati. Objašnjenje obrazloženja ubrzat će vaše učenje i iznijeti na površinu sve logičke pogreške (npr. lažnu sigurnosnu pretpostavku). Ne vjerujte rezultatima umjetne inteligencije koja ne može obraniti vlastiti kod.

Uobičajene greške

  • Stavljanje sigurnosti u AI od nule. Koristite testiranu biblioteku.
  • Ne potvrđuje se verzija/uzorak koji je izradio AI. Podaci o obuci mogu biti stari.
  • Zaobilaženje testne mreže. Svaka skica trebala bi se pokrenuti na testnoj mreži prije objavljivanja.
  • Ne dodaje se NatSpec/dokumentacija. Inspekcija i održavanje postaju otežani.
  • Zabluda "Sastavljeno je, pa je sigurno". Biti sastavljen ne znači biti siguran.
  • Zaboravljamo kontrolu pristupa. To je jedna od najčešćih i najskupljih grešaka.

Ukratko

  • U pisanju pametnih ugovora AI proizvodi okvire, testove i preglede nacrta; Human jamči sigurnost proizvodnje.
  • Izgradite sigurnost ne od nule, već na temelju dokazanih biblioteka (npr. OpenZeppelin).
  • Ažurnost verzija i uzoraka koje proizvodi YZ uvijek se potvrđuje.
  • Testni dijelovi su vrijedni u hvatanju ljudskih slijepih točaka (granični slučajevi, kontrola pristupa).
  • Biti sastavljen ne znači biti siguran; testnet i revizija su obavezni.

Zadatak aplikacije

Za jednostavan ERC-20 token, generirajte nacrt pomoću "kostura temeljenog na standardima" iznad. Zatim: (1) provjerite koristi li označenu biblioteku, (2) provjerite kontrole pristupa, (3) generirajte testove s upitom "skica testnog slučaja" i zapravo pokrenite barem jedan test lažnog pozivatelja. Pronađite i zabilježite barem jednu sigurnosnu točku koju je umjetna inteligencija propustila.

popis za provjeru

  • [ ] Jasno sam naveo standard i lanac u upitu.
  • [ ] Želio sam dokazanu produkciju temeljenu na knjižnici.
  • [ ] SPDX licenca i pragma verzija dostupna.
  • [ ] Postoji kontrola pristupa u svakoj kritičnoj funkciji.
  • [ ] Kreirao sam i pokrenuo testove za granične slučajeve.
  • [ ] Potvrdio sam da je biblioteka/uzorak ažuran.
  • [ ] Označio sam kod za reviziju i testiranje; Nisam ga dobio bez nadzora na mainnetu.