![](/img/bg-single.png)
Viedo līgumu pašauditēšana ar ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Veicot viedo līgumu revīziju, ir jāaptver plašs jautājumu loks, lai nodrošinātu koda drošību. Šie jautājumi aptver dažādus aspektus, tostarp piekļuves kontroli, aktīvu pārvaldību, datu pārvaldību, pieņēmumus, atkarības un drošības pārbaudes sarakstus. Zemāk piedāvājam detalizētu kontrolsarakstu un norādījumus par ChatGPT vaicājumiem, kas palīdzēs jums gudro līgumu audita procesā.
Ja vēlaties paši izpētīt kādu gudro līgumu, lai noteiktu, vai tajā nav ievainojamību un slēptu krāpšanas paņēmienu, pirmais solis ir pareizi sagatavots ChatGPT vaicājums.
Pierocīgs ChatGPT vaicājums būtu šāda komanda:
Sniedziet visaptverošu sarakstu ar visām problēmām un ievainojamībām šajā gudrajā līgumā. Detalizēti aprakstiet problēmas un iespējamās ievainojamības. Sniedziet vienu izmantošanas scenāriju katrai ievainojamībai. Izvadiet kā derīgu tabulu markdown formātā ar objektu sarakstu, katram no tiem norādot kolonnas "apraksts", "darbība", "nopietnība", "dalībnieki", "scenārijs", "tips" un "rinda". "tips", kur var būt "lietojamība", "ievainojamība", "optimizācija" vai "ieteikums". "actors" ir iesaistīto dalībnieku saraksts. "nopietnība" var būt "zema", "vidēja" vai "augsta". "rinda" ir problēmas rindas numurs. Pārliecinieties, ka visi tabulas lauki ir aizpildīti.
Pēc tam izmantojiet turpmāk uzdotos jautājumus, lai padziļināti izpētītu viedo līgumu.
Izmantošanas scenāriji:
- Kādi ir sistēmas dalībnieki?
- Kādas darbības ir sistēmai?
- Kādi ir sistēmas ierobežojumi?
- Kādi ir iespējamie veidi, kā sistēmu uzlauzt?
- Kāda aizsardzība tiek izmantota, lai novērstu uzbrukumus?
- Aprakstiet, pamatojoties uz ierobežojumiem, katras funkcijas stāvokļa izmaiņas.
- Izklāstiet informāciju par izmantotajiem Solidity un DeFi šabloniem.
- Sastādiet pozitīvas un negatīvas aksiomas, pamatojoties uz informāciju par sistēmu.
- Nosauciet veidus, kā optimizēt un modificēt kodu, lai padarītu to uzticamāku (ar koda fragmentiem).
- Nosaukt kodā izmantotās slēptās krāpšanas metodes (ar koda fragmentiem).
Padoms: Datu vizuālais attēlojums bieži sniedz skaidrāku izpratni par sistēmas darbību. Strādājot ar ChatGPT, ieteicams pieprasīt izejas datu vizualizāciju, piemēram, stāvokļa izmaiņas ASCII rakstzīmju diagrammu veidā. Lai gan ne visām vizualizācijām var būt jēga, dažas no tām var sniegt ļoti vērtīgu ieskatu viedā līguma darbībā.
Patiesībā, lai gan ChatGPT nevar aizstāt cilvēku auditoru, tā būtiski papildina audita procesu, nodrošinot skaidrāku izpratni par protokola stāvokļu pārejām, ierobežojumiem, invariantiem un savietojamību. Šis rīks ir īpaši efektīvs, lai izprastu protokola stāvokļa pārejas un ierobežojumus.
Padoms: Pirms audita uzsākšanas, nodrošinot čatbotu ar auditējamā protokola dokumentāciju, var ievērojami uzlabot atbilžu precizitāti un atbilstību. Vienkārši miniet: "Šī ir dokumentācija, kas sniedz vislabāko kontekstu attiecībā uz "protokola_nosaukumu", kuru es auditēju," un ievietojiet dokumentu.
Var teikt, ka ChatGPT ir spēcīgs palīgs auditoriem, kas nodrošina strukturētu un padziļinātu pieeju viedo līgumu auditēšanai. Tomēr jāatceras, ka ChatGTP (un līdzīgi pakalpojumi) ir tikai sarežģītas mašīniskās analīzes interpretācijas, kas strādā ar varbūtībām, tāpēc bieži vien rada kļūdas un neprecizitātes. Attiecīgi uz ChatGPT rezultātiem nevar pilnībā paļauties - tas ir tikai labs rīks pareizās rokās un "sākumpunkts" viedo līgumu izpētē.
Tāpēc, lai pasargātu sevi no iespējamiem riskiem, viedie līgumi ir jāizpēta rūpīgāk, meklējot iespējamās ievainojamības un krāpnieciskas shēmas.
Kā veikt padziļinātu viedo līgumu auditu? Top 100 pieprasījumi ChatGPT
Apskatīts vispārīgs pieprasījums (pamudinājums) ChatGPT, no kura var sākt viedā līguma analīzi. Taču, protams, padziļināta analīze neaprobežojas tikai ar ievada uzvedni.
Pārkāpēji nepārtraukti uzlabo savu taktiku, tāpēc jums ir jābūt informētam un piesardzīgam daudzos aspektos - tās ir būtiskas stratēģijas, lai aizsargātu savus žetonu ieguldījumus.
Apskatīsim 100 svarīgāko vaicājumu sarakstu, kas ļaus jums profesionāli veikt viedo līgumu auditu:
- Vai kods ir veiksmīgi kompilēts?
- Kāda Solidity versija ir izmantota kodā? Vai tā ir pašreizējā stabilā versija?
- Vai ir skaidri komentāri, kas izskaidro funkciju un mainīgo mērķi?
- Vai līgumā ir izmantota "Ownable" shēma? Ja jā, tad kurām funkcijām?
- Vai stāvokļa mainīgie ir pareizi piešķirti, izmantojot redzamības modifikatorus?
- Vai tiek izmantoti notikumi pareizai žurnālu reģistrēšanai?
- Vai tiek sniegti lietotājam draudzīgi kļūdu ziņojumi?
- Vai tiek pārbaudīta zema līmeņa izsaukumu atgriešanas vērtība?
- Vai ir scenāriji, kuros īpašnieks var pilnvarot sevi, kas varētu novest pie paklāja vilkšanas?
- Kam ir kontrole pār priviliģētajiem kontiem un kādi ir kontroles mehānismi?
- Kādi pārvaldības mehānismi ir līgumā, un vai pārvaldība ir pilnībā atvērta vai ierobežota?
- Vai sistēmā tiek izmantoti citi līgumi un kādas funkcijas tie pilda (piemēram, pilnvarotā līgums)?
- Vai ir laika bloķēšanas mehānisms un vai to var apiet?
- Vai ir pieejama atbilstoša dokumentācija?
- Vai kodā ir iespējamas DoS vai reentrancesijas uzbrukumu ievainojamības?
- Visas funkcijas ir iekšējas, izņemot tās, kurām ir skaidri noteikts, ka tās ir publiskas/ārējas?
- Matemātiskajās operācijās nav aritmētisko pārplūžu/nepilnību?
- Vai tiek izmantota droša OpenZeppelin bibliotēka?
- Eteri vai žetonus nevar nejauši nosūtīt uz nulles adresi (0x0)?
- Uzdevumi tiek pārbaudīti ar require pirms operācijām un stāvokļa izmaiņām?
- Vai stāvoklis tiek iestatīts pirms darbību izpildes un to izpildes laikā?
- Vai tiek izmantota aizsardzība pret atkārtotiem (reentry) uzbrukumiem (A sauc B sauc A)?
- Vai ERC20 saskarne ir pareizi īstenota?
- Vai modifikators tiek izmantots vairākās vietās tikai tad, ja tas patiešām ir nepieciešams?
- Vai visi tipi ir skaidri noteikti (piemēram, uint256 vietā tiek izmantots uint)?
- Vai visas metodes un cikli nepārsniedz maksimālo pieļaujamo gāzes limitu?
- Konstruktorā nav nevajadzīgu inicializāciju (atcerieties, ka ir iestatītas noklusējuma vērtības)?
- Testu pārklājums ir pilnīgs: ir pārbaudīta katra viedā līguma metode un visi iespējamie ievades datu tipi?
- Vai ir veikta fuzz testēšana, izmantojot nejaušus ievades datus?
- Vai ir pārbaudīti visi iespējamie stāvokļi, kuros var atrasties līgums?
- Lai eteru un žetonu noklusējuma summas ir norādītas wei vienībās?
- Vai pūļa pārdošanas beigu bloks/laiks ir pēc sākuma bloka/laika (tirdzniecības sākšanas/ieslēgšanas)?
- Vai pūļa pārdošanas žetonu maiņas/konversijas kurss ir iestatīts pareizi?
- Vai ir iestatīts mīkstais/cietais pūļa pārdošanas limits?
- Vai ir iestatīts un pārbaudīts minimālais/marksimālais pieļaujamais ieguldījums pūļa pārdošanā?
- Vai ir pārbaudīta pūļa pārdošanas baltā saraksta funkcionalitāte?
- Vai ir pārbaudīta pūļa pārdošanas atmaksas loģika?
- Vai pūļa pārdošanas dalībnieki saņem proporcionālu skaitu žetonu vai viņi var pieprasīt savu ieguldījumu?
- Vai katra pūļa pārdošanas posma ilgums (piem, iepriekšēja pārdošana, publiskā pārdošana) ir pareizi konfigurēts?
- Vai ir norādīts, kuras funkcijas drīkst kontrolēt tikai īpašnieks (piem, apturēt pūļa pārdošanu, pāriet uz citu pūļa pārdošanas posmu, ieslēgt žetonu izplatīšanu u. c.)?
- Vai ir pārbaudīta pūļa pārdošanas tiesību piešķiršanas (tiesību piešķiršanas) loģika?
- Vai pūļa pārdošanai ir drošais režīms, kas, īpašniekam to ieslēdzot, ierobežo funkciju izsaukumus un ietver atmaksas funkciju?
- Crowdsale ir rezerves funkcija, ja tai ir saprātīga jēga.
- Vai importētās bibliotēkas ir iepriekš pārbaudītas un nesatur nevēlamas daļas, kuras var tikt aizstātas nākamajās versijās un kuras varētu tikt izmantotas ļaunprātīgiem mērķiem?
- Vai toenu pārneses metodes (transfer) ir ietītas require?
- Vai require un assert ir izmantotas pareizi? Assert metodi izmanto tikai lietām, kurām nekad nevajadzētu notikt, parasti to izmanto, lai pārbaudītu stāvokli pēc izmaiņu veikšanas.
- Vai ir aizsardzība pret rekursīvo izsaukumu uzbrukumiem?
- Vai ir ierobežots patvaļīgu ieejas virkņu garums?
- Ja iespējams izvairīties no masīvu izmantošanas un tā vietā izmantot kartēšanu?
- Vai bloka hashe netiek izmantoti, lai apstrādātu nejaušas vērtības (to var ietekmēt kalnrači)?
- Visur netiek izmantots tx.origin?
- Matula elementi tiek nobīdīti uz leju, kad elements tiek dzēsts, lai neatstātu atstarpes?
- Vai throw vietā tiek izmantots revert?
- Funkcijas nekavējoties beidzas, ja nosacījumi netiek izpildīti?
- Vai ir novērsti kompilatora brīdinājumi?
- Vai aprēķinos tiek izmantota SafeMath bibliotēka?
- Vai kāds atmiņas slots (glabāšanas slots) tiek nolasīts vairāk nekā vienu reizi?
- Vai tiek izmantoti neierobežoti cikli/plaukti, kas varētu izraisīt DoS?
- Vai block.timestamp tiek izmantots tikai gariem intervāliem?
- Vai netiek izmantots block. number, lai aprēķinātu pagājušo laiku?
- Vai ir jāizvairās no delegatecall izsaukuma, jo īpaši ārējiem (pat ja uzticamiem) līgumiem?
- Vai masīva garums netiek atjaunināts, to iterējot?
- Vai paraksti ir aizsargāti pret atkārtojumiem ar nonce un block.chainid?
- Uliecinieties, ka visi paraksti izmanto EIP-712?
- Abi.encodePacked() rezultātu nevajadzētu hešēt, ja tiek izmantoti vairāk nekā 2 dinamiskie tipi. Kopumā vēlams izmantot abi.encode().
- Urūpīgi pārbaudiet asamblejas koda iestarpinājumus.
- Izvairieties no nepietiekama gāzes patēriņa (gas griefing).
- Vai visi privātie dati patiešām ir privāti?
- Vai struktūras/plaknes atjaunināšana atmiņā (atmiņā) nemainīs to glabāšanā (stadijā)?
- Vai stadijas mainīgie ir pārtēnoti?
- Vai mainīgā vērtības aprēķināšana lidojumā ir lētāka nekā tā glabāšana?
- Vai visi stāvokļa mainīgie tiek nolasīti no pareizā līguma (master vs. clone)?
- Vai salīdzināšanas operatori (>, <, >=, <=) tiek lietoti pareizi, īpaši, lai novērstu kļūdas, kas nav pa vienai?
- Vai logiskie operatori (==, ! =, &&, ||, !) tiek lietoti pareizi, jo īpaši, lai novērstu kļūdas, kas nav pa vienai?
- Vai reizināšana vienmēr tiek veikta pirms dalīšanas (ja vien reizināšana var pārplūst)?
- Vai maģiskie skaitļi tiek aizstāti ar konstantu ar intuitīvu nosaukumu?
- Ja ETH saņēmējam ir atgriezeniskā (fallback ) funkcija, kuru var atgriezt, vai tas var izraisīt DoS?
- Vai tiek izmantots SafeERC20 standarts un vai atgrieztās vērtības tiek pārbaudītas drošā veidā?
- Vai tiek pieņemts, ka msg. sūtītājs vienmēr ir attiecīgais lietotājs?
- Vai autorizācijai netiek izmantots .origin?
- Vai .call.value() vietā netiek izmantots .address.transfer() vai .address.send()?
- Vai, izmantojot zema līmeņa izsaukumus, pārliecinieties, ka pirms izsaukuma pastāv līgums.
- Vai piekļuvei chainid vai līguma kodam/izmēram/hash tiek izmantots asamblejas kods, nevis Solidity sintakse?
- Vai, iestatot mainīgajam nulles vērtību (0, false, "" utt.), tiek izmantots atslēgvārds delete?
- Logiskajiem operatoriem/ salīdzinājumiem (&&/|||/>=/==/ utt.) nodotajiem izteicieniem nedrīkst būt blakusparādību.
- Kad strādājot ar vairākām adresēm, vaicājiet sev, kas notiek, ja tās ir vienādas?
- Kā labi ir dokumentēts kods? Vai ir sniegti komentāri un piemēri visur, kur tiek izmantots nestandarta kods?
- Ja tiek izmantots ārējais izsaukums, pārliecinieties, ka ārējā līguma izsaukums patiešām ir nepieciešams?
- Vai tiek pārbaudīts ārējā izsaukuma rezultāts un vai tiek apstrādātas kļūdas?
- Kas notiek, ja ārējais izsaukums izmanto visu sniegto gāzi?
- Ja ārējais izsaukums izsauc konkrētu funkciju, pārliecinieties, vai šī funkcija patiešām pastāv (fiktīvas funkcijas).
- Pārliecinieties, ka modifikatoros netiek izmantoti ārējie izsaukumi (modifikatori)
- Vai notikumi tiek izdoti katrai funkcijai, kas modificē krātuvi?
- Pārbaudiet savus pieņēmumus par to, ko dara un ko atdod galvenajā izmantotie ārējie līgumi.
- Urvērsiet uzmanību, vai žetonos netiek izmantoti pārāk daudz vai pārāk maz decimālskaitļu. Pārliecinieties, ka maksimālās un minimālās atbalstītās vērtības ir dokumentētas.
- Vai ir dokumentētas ar lomām saistītās pilnvaras?
- Kādi ir riski, ja tiek pārkāptas piekļuves tiesības, un kā tas var ietekmēt dažādus sistēmas komponentus?
- Vai īpašnieks var manipulēt ar žetoniem un ETH līguma ietvaros?
- Kā tiek noteikta Oracle (Oracle) adrese un kāds ir tās process? Vai ir rezerves orakļi rezerves kopijām?
- Kā līdzīgas funkcijas ir īstenotas citos projektos, vai ir ņemta vērā labākā prakse?
Šis kontrolsaraksts palīdzēs jums nodrošināt, ka veicat rūpīgu Solidity viedo līgumu drošības auditu. Tas aptver plašu kritisko aspektu klāstu, lai identificētu un mazinātu iespējamās neaizsargātības un riskus kodā un saistītajās sistēmās.
Mēs ceram, ka šie piemēri ir palīdzējuši jums labāk izprast viedo līgumu audita metodoloģiju.
Tā kā visa informācija blokķēdē ir atklāta (protams, ar nosacījumu, ka ir pārbaudīts līguma pirmkods), bruņojies ar šīm zināšanām, jūs varat patstāvīgi izpētīt viedos līgumus un identificēt dažādas krāpšanas shēmas.
Vis to jau esam izdarījuši jūsu vietā! Pierakstieties uz premium abonementu un iegūstiet piekļuvi ekskluzīviem viedo līgumu funkciju filtriem un svaigai analīzei. Palielini savas izredzes veiksmīgi investēt ienesīgos žetonos.
Regards, Lotus Market komanda.