Autors: Sui tīkls

Sui ir L1 publiskā ķēde, kas ir pārveidota un veidota pēc pirmajiem principiem un kuras mērķis ir nodrošināt veidotājiem un izstrādātājiem izstrādes platformu, kas spēj mitināt nākamo miljardu Web3 lietotāju. Sui lietojumprogrammas ir balstītas uz viedo līgumu valodu Move, un tās ir horizontāli mērogojamas, ļaujot izstrādātājiem ātri un par zemām izmaksām atbalstīt plašu lietojumprogrammu izstrādi. Sui galvenais tīkls tika oficiāli palaists 2023. gada 3. maijā.

Šis raksts kalpos kā ātra uzziņa izstrādātājiem par Sui tīkla paraugpraksi.

Pārvietojiet vispārējās zināšanas

Lasiet vairāk par pakotņu jauninājumiem un uzrakstiet jaunināšanai draudzīgu kodu.

Pakotnes ir nemainīgas, un ievainojamo pakotnes kodu var izsaukt uz visiem laikiem. Risinājums ir pievienot aizsardzību objekta līmenī. Ja jaunināt pakotni no P uz P', citas pakotnes un klienti, kas ir atkarīgi no P, turpinās izmantot P, nevis automātiski atjaunināt uz P'. Tāpēc kods, kas ir atkarīgs gan no pakotnes, gan klienta, ir jāatjaunina, lai skaidri norādītu uz P. Pakotnes, kuras ir paredzēts paplašināt ar atkarīgām pakotnēm, var izvairīties no iepriekšējo paplašinājumu pārtraukšanas ar katru jaunināšanu, nodrošinot (nemainīgu) saskarni, kas atbilst standartam visās versijās. Piemēram, izmantojot Wormhole tiltu, ziņojumi tiek sūtīti, izmantojot Wormhole. kodam, kas nosūta ziņojumu, ir jānodod MessageTicket uz publish_message jaunākās versijas pakotnē. Publiskās funkcijas nevar dzēst vai mainīt, bet publiskās (drauga) funkcijas var. Jūs varat brīvi izmantot publiskās (drauga) vai tikai sev redzamas funkcijas, ja vien nevēlaties tagad bibliotēkas funkciju padarīt publisku uz visiem laikiem. Jūs nevarat dzēst struktūru tipus, pievienot jaunus laukus (lai gan varat pievienot dinamiskus laukus) vai jaunināt jaunas funkcijas. Rūpīgi padomājiet, pievienojot jaunus veidus, jo pēc pievienošanas tie pastāvēs uz visiem laikiem!

Izmantojiet vektoru atbalstītas kolekcijas (piemēram, vektoru, VecSet, VecMap, PriorityQueue) ar ne vairāk kā 1000 datu vienumiem.

Kolekcijas, kurās tiek izmantots dinamiskā lauka atbalsts (piemēram, tabula, maisiņš, objekts, objekts, objekts, saite, tiek izmantota jebkurai kolekcijai, kas ļauj trešajām pusēm pievienot, lielākas kolekcijas un nezināma izmēra kolekcijas). Sui Move objektu maksimālais izmērs ir 250 KB — jebkurš mēģinājums izveidot lielāku objektu izraisīs darījuma pārtraukšanu. Lūdzu, pārliecinieties, vai objekts nepalielinās par vektora atbalstīto kolekciju.

Ja jūsu funkcijai f ir nepieciešams maksājums no zvanītāja, piemēram, izmantojot SUI , izmantojiet fun f (maksājums: monēta) funkciju fun f (maksājums: &mut Coin, summa: u64) vietā. Tas ir drošāk zvanītājam, jo ​​viņi precīzi zina, cik daudz jāmaksā, un nav jāpaļaujas uz funkciju f, lai iegūtu pareizo summu.

Nav nepieciešama neliela gāzes patēriņa optimizācija. Aprēķinot Sui izmaksas, tās tiek noapaļotas līdz tuvākajam spainim, tāpēc tikai ļoti krasas svārstības izraisīs gāzes izmaiņas. It īpaši, ja jūsu darījums jau ir zemāko izmaksu diapazonā, tas nevar kļūt lētāks. Lai iegūtu sīkāku informāciju, lūdzu, skatiet tālāk redzamo attēlu.

Ievērojiet Move kodēšanas konvencijas, lai panāktu konsekventu stilu.

Saliekamība Izmantojiet displeja standartu, lai pielāgotu to, kā jūsu objekti tiek parādīti makos, lietojumprogrammās un pārlūkprogrammās. Izvairieties no funkcijas "self-transfer" izmantošanas - jebkurā brīdī ir iespējams atgriezt obj no pašreizējās funkcijas, nevis rakstīt transfer::transfer(obj, tx_context::sender(ctx)), kas ļauj zvanītājam vai programmējamam transakciju blokam. (programmējams transakciju bloks) izmanto obj. Tests Izmantojiet sui::test_scenario`, lai simulētu testa scenāriju ar vairākiem darījumiem un vairākiem sūtītājiem. Izmantojiet sui::test_utilsmodule, lai iegūtu labākus kļūdu labošanas ziņojumus ar assert_eq testiem, atkļūdošanas drukāšanu ar print un tikai pārbaudes iznīcināšanu ar iznīcinātu. Izmantojiet sui move test --coverage, lai aprēķinātu koda pārklājuma informāciju testēšanas laikā, un izmantojiet moduli sui move coverage source --module, lai skatītu sarkanā krāsā izceltās nesegtās līnijas. Ja iespējams, ieteicams iestatīt segumu uz 100%. Lietojumprogrammas Lai nodrošinātu optimālu veiktspēju un datu konsekvenci, lietojumprogrammām jāiesniedz rakstīšanas un lasīšanas pieprasījumi tajā pašā pilnajā mezglā. TS SDK tas nozīmē, ka lietojumprogrammai ir jāizmanto maka signTransactionBlock API un pēc tam jāiesniedz darījums, izsaucot execute_transactionBlock lietojumprogrammas pilnajā mezglā, nevis jāizmanto maka signAndExecuteTransactionBlock API. Tas nodrošina rakstīšanas pirms lasīšanas konsekvenci — nolasījumi no lietojumprogrammas pilna mezgla nekavējoties atspoguļos transakcijas ierakstus, nevis gaidīs kontrolpunktu. Lai samazinātu latentumu, ja jūsu lietojumprogrammai ir jāzina, ka darījums ir apstiprināts, bet tai nav nekavējoties jāredz transakcijas sekas vai jālasa darījuma rakstītie objekti/notikumi, izmantojiet executeTransactionBlock ar "showEffects": false un " showEvents": false . Lietojumprogrammām ir jāglabā kešatmiņā bieži lasītie dati lokāli, nevis bieži jāiegūst tie no pilna mezgla. Kad vien iespējams, izmantojiet programmējamos transakciju blokus, lai apvienotu esošās ķēdes funkcionalitātes, nevis atbrīvotu jaunu viedā līguma kodu. Programmējamie darījumu bloki ļauj veikt liela mēroga pakešu apstrādi un neviendabīgu sastāvu, vēl vairāk samazinot jau tā zemās gāzes maksas. Lietojumprogrammās gāzes budžeta, gāzes cenas un monētu izvēle ir jāatstāj maciņa ziņā, kas makam nodrošinās lielāku elastību, un maka pienākums ir pārbaudīt darījumu, lai nodrošinātu, ka darījums neizdodas. Parakstīšana Nekad neparakstiet divus vienlaicīgus darījumus, kas pieskaras vienam un tam pašam ekskluzīvajam objektam, vai nu izmantojot ekskluzīvo objektu atsevišķi, vai gaidot vienas transakcijas pabeigšanu pirms nākamās transakcijas nosūtīšanas. Šī noteikuma pārkāpums var izraisīt klienta neskaidrības, bloķējot abos darījumos iesaistītos ekskluzīvos objektus līdz pašreizējā laikmeta beigām. Jebkura sui klienta komanda, kas iniciē darījumu (piemēram, sui klienta publicēšana, sui klienta izsaukums), var pieņemt karogu --serialize-output, lai izvadītu parakstāmo base64 transakciju. Sui atbalsta vairākas parakstu shēmas darījumu parakstīšanai, tostarp vietējos vairāku parakstus.