Scris de: Sui Network
Sui este un lanț public L1 reproiectat și construit din primele principii, cu scopul de a oferi creatorilor și dezvoltatorilor o platformă de dezvoltare capabilă să găzduiască următorul miliard de utilizatori în Web3. Aplicațiile de pe Sui se bazează pe limbajul de contract inteligent Move și sunt scalabile pe orizontală, permițând dezvoltatorilor să sprijine o gamă largă de dezvoltare de aplicații rapid și la costuri reduse. Rețeaua principală Sui a fost lansată oficial pe 3 mai 2023.
Acest articol va servi ca referință rapidă pentru dezvoltatori cu privire la cele mai bune practici din Sui Network.
Mutați cunoștințele generale
Citiți mai multe despre upgrade-urile pachetelor și scrieți un cod pentru upgrade.
Pachetele sunt imuabile și codul de pachet vulnerabil poate fi apelat pentru totdeauna. Soluția este să adăugați protecție la nivel de obiect. Dacă actualizați un pachet de la P la P', alte pachete și clienți care depind de P vor continua să folosească P în loc să actualizeze automat la P'. Prin urmare, codul care depinde atât de pachet, cât și de client trebuie actualizat pentru a indica în mod explicit către P'. Pachetele despre care se așteaptă să fie extinse de pachete dependente pot evita spargerea extensiilor lor anterioare cu fiecare actualizare, oferind o interfață (imuabilă) care se conformează standardului pentru toate versiunile. Luând ca exemplu puntea încrucișată Wormhole, mesajele sunt trimise prin Wormhole ca punte Pentru a genera un pachet de extensie pentru trimiterea mesajelor, puteți utiliza instrucțiunea prepare_message în orice versiune a pachetului Wormhole pentru a genera un MessageTicket și clientul. codul care trimite mesajul trebuie să treacă MessageTicket la publish_message în cea mai recentă versiune a pachetului. Funcțiile publice nu pot fi șterse sau modificate, dar funcțiile publice (prieten) pot. Sunteți liber să utilizați funcții publice (prieten) sau numai vizibile pentru dvs., cu excepția cazului în care doriți să faceți publică pentru totdeauna funcția de bibliotecă. Nu puteți șterge tipuri de structuri, nu puteți adăuga câmpuri noi (deși puteți adăuga câmpuri dinamice) sau nu puteți face upgrade la noi funcții. Gândiți-vă bine când adăugați tipuri noi, odată adăugate, acestea sunt acolo pentru totdeauna!
Utilizați colecții suportate de vectori (cum ar fi vector, VecSet, VecMap, PriorityQueue), cu maximum 1000 de elemente de date.
Colecțiile care utilizează suport de câmp dinamic (cum ar fi Table, Bag, ObjectBag, ObjectTable, LinkedTable) sunt utilizate pentru orice colecție care permite terților să adauge, colecții mai mari și colecții de dimensiune necunoscută. Obiectele Sui Move au o dimensiune maximă de 250 KB - orice încercare de a crea un obiect mai mare va determina întreruperea tranzacției; vă rugăm să vă asigurați că obiectul dvs. nu crește mai mult decât colecția suportată de vector.
Dacă funcția dvs. f necesită o plată de la apelant, de exemplu folosind SUI, utilizați funcția fun f(plată: monedă) în loc de funcția fun f(plată: &mut Monedă, sumă: u64). Acest lucru este mai sigur pentru apelant, deoarece știu exact cât să plătească și nu trebuie să se bazeze pe funcția f pentru a extrage suma corectă.
Nu este necesară o mică optimizare a consumului de gaz. Când se calculează costul pe Sui, acesta este rotunjit la cea mai apropiată găleată, așa că numai fluctuațiile foarte puternice vor provoca schimbări de gaz. Mai ales dacă afacerea dvs. este deja în intervalul cu cel mai mic cost, nu poate fi mai ieftină. Vă rugăm să consultați imaginea de mai jos pentru detalii.
Urmați convențiile de codare Move pentru a obține un stil consistent.
Componabilitate Utilizați standardul de afișare pentru a personaliza modul în care apar obiectele dvs. în portofele, aplicații și browsere. Evitați utilizarea funcției „auto-transfer” - este posibil în orice moment să returnați obj din funcția curentă în loc să scrieți transfer::transfer(obj, tx_context::sender(ctx)), ceea ce permite apelantului sau blocarea tranzacției programabile (bloc de tranzacție programabil) folosește obj. Test Utilizați sui::test_scenario` pentru a simula un scenariu de testare cu mai multe tranzacții și mai mulți expeditori. Utilizați sui::test_utilsmodule pentru a obține mesaje mai bune de corectare a erorilor cu teste assert_eq, depanare tipărire cu print și distrugere numai pentru testare cu destroy . Utilizați sui move test --coverage pentru a calcula informațiile de acoperire a codului atunci când testați și utilizați sui move coverage source --module pentru a vedea liniile descoperite evidențiate cu roșu. Dacă este fezabil, se recomandă setarea acoperirii la 100%. Aplicații Pentru performanță optimă și coerență a datelor, aplicațiile ar trebui să trimită cereri de scriere și citire pe același nod complet. În SDK-ul TS, aceasta înseamnă că aplicația ar trebui să utilizeze API-ul signTransactionBlock al portofelului și apoi să trimită tranzacția apelând execute_transactionBlock pe nodul complet al aplicației, în loc să utilizeze API-ul signAndExecuteTransactionBlock al portofelului. Acest lucru asigură consecvența scrierii înainte de citire - citirile din nodul complet al aplicației vor reflecta imediat scrierile tranzacției, mai degrabă decât să aștepte un punct de control. Pentru a reduce latența, dacă aplicația dvs. trebuie să știe că o tranzacție a fost confirmată, dar nu trebuie să vadă imediat efectele tranzacției sau să citească obiectele/evenimentele scrise de tranzacție, utilizați executeTransactionBlock cu „showEffects”: false și „ showEvents": fals . Aplicațiile ar trebui să memoreze în cache datele citite frecvent la nivel local, mai degrabă decât să le aducă frecvent din nodul complet. Ori de câte ori este posibil, utilizați blocuri de tranzacții programabile pentru a combina funcționalitățile existente în lanț, în loc să lansați un nou cod de contract inteligent. Blocurile de tranzacții programabile permit procesarea în loturi la scară largă și o compoziție eterogenă, reducând și mai mult tarifele deja mici pentru gaz. Aplicațiile ar trebui să lase bugetul de gaz, prețul gazului și selecția monedelor în seama portofelului, ceea ce va oferi portofelului o mai mare flexibilitate și este responsabilitatea portofelului să testeze tranzacția pentru a se asigura că tranzacția nu eșuează. Semnarea Nu semnați niciodată două tranzacții concurente care ating același obiect exclusiv, fie prin utilizarea separată a obiectului exclusiv, fie așteptând finalizarea unei tranzacții înainte de a trimite următoarea tranzacție. Încălcarea acestei reguli poate determina clientul să facă echivoc, blocând obiectele exclusive implicate în ambele tranzacții până la sfârșitul epocii curente. Orice comandă sui client care inițiază o tranzacție (de exemplu, sui client publish, sui client call) poate accepta indicatorul --serialize-output pentru a scoate o tranzacție base64 care urmează să fie semnată. Sui acceptă mai multe scheme de semnătură pentru semnarea tranzacțiilor, inclusiv multi-semnături native.
