Pelnas:
- Gebėjimas naudoti dirbtinį intelektą kuriant sistemas, testus ir peržiūrėti juodraščius, pagrįstus patikrintomis bibliotekomis (pvz., OpenZeppelin), ir suprasti, kad žmonės garantuoja gamybos saugumą
- Galimybė patikrinti kodo versiją, šabloną ir prieigos kontrolę, sukurtą dirbtinio intelekto naudojant kompiliavimą, testavimą ir testų tinklą
- Gebėjimas atskirti, kad kompiliavimas nereiškia, kad esate saugus ir kad testnet ir auditas yra būtini.
Išmaniosios sutarties rašymas skiriasi nuo įprastos programinės įrangos: jūsų parašytas kodas yra viešas, nekintamas ir programa, kuri tiesiogiai perkelia pinigus. Šiame skyriuje sužinosite, kaip dirbtinį intelektą naudoti kaip išmaniųjų sutarčių kūrimo asistentą; Mokysimės nuo juodraščio gamybos iki bandomojo rašymo, nuo modelio atšaukimo iki dujų (sandorio mokesčio) optimizavimo. Bet būkime aiškūs nuo pat pradžių: AI gamina brėžinius; Žmonės užtikrina saugų kodą, kuris pradedamas gaminti.
Pirmiausia žemė: kalba ir aplinka
Labiausiai paplitusi išmaniųjų sutarčių kalba yra Solidity (Ethereum ir EVM kalba – Ethereum Virtual Machine, virtualioji mašina, kurioje vykdomos sutartys – suderinamos grandinės). Alternatyva yra Vyper (į Pythoną panaši kalba, kuria siekiama būti labiau suvaržyta ir skaitoma). Jūsų kodas sunaudoja dujas (kiekvienos operacijos kaina blokų grandinei); Neefektyvus kodas yra brangus. Norint gauti tikslią išvestį, labai svarbu, kad šie terminai būtų aiškūs kontekste, kurį pateikiate AI.
Dirbtinis intelektas vertingiausias yra ne „rašymas nuo nulio“, o karkaso kūrimas + gera forma: standartus atitinkanti pradžia, planas, į kurį galima įtraukti savo patirtį.
AI naudojimo kodavime sluoksniai
1. Skeletų generavimas. AI greitai išgauna standartinio žetono (ERC-20) arba NFT (ERC-721 – unikalaus skaitmeninio turto standarto) skeletą. Tačiau įsitikinkite, kad dirbtinis intelektas naudoja patikrintą biblioteką: pavyzdžiui, „OpenZeppelin“ (bendruomenės patikima, audituota standartinė sutartinių biblioteka). Taisyklė yra naudoti patikrintą bloką, o ne rašyti apsaugą nuo nulio.
2. Funkcijos aprašymas ir apžvalga. Esamos funkcijos paaiškinimas AI leidžia anksti pastebėti logikos klaidas.
3. Bandymo generavimas. AI gerai generuoja bandomuosius atvejus kraštutiniams atvejams: nulinė įvestis, labai didelis skaičius, neteisėtas skambinantis asmuo, pakartotinis skambutis. Tai primena vieną iš scenarijų, kuriuos žmogus praleidžia.
4. Dujos ir skaitomumas. AI pažymi brangius modelius, pvz., nereikalingus įrašus saugykloje, ir siūlo alternatyvas.
Patarimas: nurodykite AI „Remiantis OpenZeppelin patikrintomis sutartimis, perrašyti saugumą nuo nulio“. AI yra daug rizikingiau parašyti originalų saugos kodą nei naudoti patikrintą biblioteką.
Silpnas raginimas / Stiprus raginimas
Silpnas raginimas:
Parašykite man simbolinę sutartį.
Šis raginimas pavojingas: neaišku, kuris standartas, kokia grandinė, kuri biblioteka, koks saugumo reikalavimas. AI generuoja atsitiktinį, galbūt pasenusį arba nesaugų kodą.
Galingas raginimas:
Jūsų vaidmuo: vyresnysis „Solidity“ kūrėjas. Sukurkite ERC-20 prieigos rakto juodraštį, skirtą su EVM suderinamai grandinei. Taisyklės: - Remiantis OpenZeppelin audituotomis ERC20 ir nuosavybės sutartimis. - Aiškiai parašykite Solidity versijos ir licencijos (SPDX) eilutę. - Tik savininkas turi leidimą kaldinti; pridėkite dangtelį nuo begalinio spaudimo. - Prie kiekvienos funkcijos pridėkite NatSpec komentarą. - Rašykite saugumą nuo nulio; Naudokite standartinį bloką. - Pabaigoje pridėkite įspėjimą: „Tai juodraštis; reikalingas auditas ir bandymai“. Pažymėkite sritis, dėl kurių nesate tikri, naudodami // TODO.
Skirtumas: stiprus raginimas suteikia aiškų vaidmenį, standartą, biblioteką, saugos ribą, dokumentacijos ir patvirtinimo lūkesčius.
Keturi kopijuojami šablonai
1) Standartais pagrįstas skeletas:
Jūsų vaidmuo: Solidity kūrėjas. Sukurkite [ERC-20 / ERC-721 / staking] sutarties sistemą, pagrįstą OpenZeppelin audituota biblioteka. Parašykite SPDX licenciją ir pragma versiją. Prie kiekvienos išorinės funkcijos pridėkite prieigos valdymą (kas gali skambinti). Saugumo išradimas iš naujo; Naudokite standartinius blokus. Tai juodraštis.
2) Funkcijų peržiūra:
Išnagrinėkite šią funkciją kaip vyresnysis kūrėjas: ką ji veikia, kokias būsenas ji keičia, kas gali tai pavadinti? Galimas logikos klaidas ir saugumo rizikas pažymėkite kaip HIPOTEzę, kiekvieną susiedami su eilute kode. Nesakykite „saugu“ tiesiai šviesiai; tiesiog išvardink dėmesio taškus.
3) Bandymo scenarijaus juodraštis:
Pasiūlykite šios sutarties bandomuosius atvejus (gali būti Foundry/Hardhat projektas). Konkrečiai padengti limito atvejus: nulinė įvestis, labai didelis skaičius, neteisėtas skambutis, pakartotinis skambutis, nepakanka lėšų. Parašykite KĄ kiekvienas testas patvirtina.
4) Dujų ir skaitomumo apžvalga:
Šioje sutartyje pažymėkite modelius, kurie gali sumažinti dujų sąnaudas: nereikalingas saugojimo rašymas, išorinis skambutis kilpoje, pasikartojantis skaičiavimas. Paaiškinkite kiekvieno pasiūlymo prieš/po skirtumą. Rekomenduoti saugumą pažeidžiančius optimizavimus; Jei neaišku, pasakykite „klausk auditoriaus“.
Trys mini dėklai (skaičiais)
1 atvejis – skeletas išsaugotas 4 valandas. Viena komanda per 30 minučių išgavo audituotos bibliotekoje pagrįstos teisių suteikimo sutarties su AI skeletą; Rankiniu būdu užtruko ~4 valandas. Komanda skyrė laiko saugumui ir bandymams. Pelnas buvo gautas ne perkeliant saugumą, o iš varginančios sistemos pagreitinimo.
2 atvejis – pasenusios versijos gaudyklė. AI sukūrė šabloną, kuris siunčia neapdorotą eterį perkeliant, o tai neberekomenduojama, nes mokymo duomenys yra pasenę. Kūrėjas tai pastebėjo ir pakeitė į dabartinį skambučiais pagrįstą ir nuo pakartotinio įėjimo apsaugotą modelį. Pamoka: visada patvirtinama, kad AI biblioteka / modelis yra atnaujintas; AI nežino daugiau nei mokymo pabaigos data.
3 atvejis – bandomajame juodraštyje iššoko paslėpta klaida. „Neteisėto skambintojo“ testas, kurį sukūrė AI, atskleidė, kad kūrėjas pamiršo prieigos kontrolę funkcijoje. onlyOwner trūksta 1 eilutės, sugauta per 5 minutes testnete; Galėjo būti prarastos lėšos pagrindiniame tinkle. Pamoka: AI apima žmogaus akląją zoną atliekant bandymus.
Prisiminkite saugos modelius naudojant AI
AI gerai primena žinomus pažeidžiamumo modelius, pavyzdžiui, kontrolinį sąrašą. Dažniausiai pasitaikantys modeliai:
- Pakartotinis įėjimas: skambinti iš išorės neatnaujinant būsenos. Sprendimas: patikrinimų-efektų-sąveikų tvarka, sugrįžimo apsauga.
- Prieigos kontrolės trūkumas: bet kas gali iškviesti svarbią funkciją.
- Sveikųjų skaičių perpildymas / nepakankamumas: „Modern Solidity“ sugauna daugumą jų, tačiau vis tiek kyla pavojus žemo lygio kode.
- Nepakankamas įvesties patvirtinimas: nulinis adresas, nulinio kiekio kontrolė.
- Oracle priklausomybė: aklas pasitikėjimas išoriniais duomenimis (pvz., kaina).
Dėmesio: AI gali prisiminti šį sąrašą, bet negali garantuoti, ar sąraše esantis elementas yra jūsų konkrečiame kode. Kontrolinis sąrašas yra pradžia; Tai nepakeičia konteinerių kontrolės.
Teisingas kontekstas: gero AI kodo paslaptis
AI sukuriamo kodo kokybė tiesiogiai priklauso nuo konteksto, kurį jam suteikiate, kokybės. Web3 tai ypač svarbu, nes viena maža detalė (kuri grandinė, kuri Solidity versija, kuris žetonų standartas) pakeičia visą išvestį. Geras kontekstas apima:
- Tikslinė grandinė ir aplinka: „Ethereum mainnet“ ar „Layer 2“ (pigesnė šoninė grandinė, einanti ant pagrindinės grandinės)? Dujų kaina ir kai kurios funkcijos skiriasi priklausomai nuo grandinės.
- Versija ir biblioteka: kuri Solidity versija, kuri OpenZeppelin versija? Jei versija nenurodyta, AI gali sukurti pasenusius, nebenaudojamus šablonus.
- Saugumo reikalavimai: ar yra viršutinė riba, ar ją galima pristabdyti, ar ją padidinti? Tai reikia pasakyti nuo pat pradžių.
- Apribojimai: aiškios ribos, pvz., „nenaudoti surinkimo“, „vengti išorinio skambučio“, „optimizuoti dujas, bet išlaikyti skaitomumą“.
Kitas galingas būdas yra pirmiausia paprašyti dirbtinio intelekto plano, tada kodo: „Pirmiausia išvardykite šios sutarties funkcijas ir ką kiekviena atliks; parašykite kodą, kai jį patvirtinsiu“. Tai anksti užfiksuoja, kad dirbtinis intelektas juda neteisinga kryptimi ir leidžia išlaikyti architektūrinį sprendimą.
Užuomina: paklauskite AI „kodėl parašėte šį kodą taip? paklausti. Loginio pagrindimo paaiškinimas pagreitins mokymąsi ir iškels visas logines klaidas (pvz., klaidingą saugumo prielaidą). Nepasitikėkite dirbtinio intelekto, kuris negali apginti savo kodo, išvestimi.
Dažnos klaidos
- Sukurti AI saugumą nuo nulio. Naudokite patikrintą biblioteką.
- Nepatvirtina AI sukurtos versijos / modelio. Treniruočių duomenys gali būti seni.
- Aplenkiamas testinis tinklas. Kiekvienas juodraštis turi būti paleistas bandomajame tinkle prieš pradedant transliuoti.
- Nepridedama NatSpec / dokumentacijos. Apžiūra ir priežiūra tampa sudėtinga.
- „Jis sudarytas, todėl saugu“ klaidingas supratimas. Būti sudarytam nereiškia būti saugiam.
- Pamiršus prieigos kontrolę. Tai viena dažniausių ir brangiausių klaidų.
Apibendrinant
- Išmaniojo sutarčių rašymo metu AI kuria sistemas, testus ir peržiūros juodraščius; Žmogus garantuoja gamybos saugumą.
- Kurkite saugumą ne nuo nulio, o remdamiesi patikrintomis bibliotekomis (pvz., OpenZeppelin).
- Visada patvirtinamas YZ gaminamų versijų ir modelių naujingumas.
- Bandymo stuburai yra vertingi fiksuojant žmogaus akląsias zonas (ribinius atvejus, prieigos kontrolę).
- Būti sudarytam nereiškia būti saugiam; Testnet ir auditas yra būtini.
Taikymo užduotis
Jei norite naudoti paprastą ERC-20 prieigos raktą, sugeneruokite juodraštį naudodami aukščiau pateiktą raginimą „standartais pagrįstu skeletu“. Tada: (1) patikrinkite, ar ji naudoja pažymėtą biblioteką, (2) patikrinkite prieigos valdiklius, (3) sugeneruokite testus naudodami raginimą „bandymo atvejo juodraštis“ ir iš tikrųjų paleiskite bent vieną nesąžiningo skambinančiojo testą. Raskite ir atkreipkite dėmesį į bent vieną saugos tašką, kurio AI praleido.
kontrolinis sąrašas
- [ ] Raginoje aiškiai nurodžiau standartą ir grandinę.
- [ ] Norėjau pasiteisinusios bibliotekoje pagrįstos produkcijos.
- [ ] Yra SPDX licencija ir pragma versija.
- [ ] Kiekvienoje svarbioje funkcijoje yra prieigos kontrolė.
- [ ] Sukūriau ir vykdžiau ribinių atvejų testus.
- [ ] Patvirtinau, kad biblioteka / modelis yra atnaujintas.
- [ ] Pažymėjau kodą auditui ir testavimui; Aš negavau jo be priežiūros mainnete.