Napsal: Sui Network

Sui je veřejný řetězec L1 přepracovaný a vytvořený podle prvních principů, jehož cílem je poskytnout tvůrcům a vývojářům vývojovou platformu schopnou hostit další miliardu uživatelů ve Web3. Aplikace na Sui jsou založeny na jazyce Move smart contract language a jsou horizontálně škálovatelné, což umožňuje vývojářům podporovat širokou škálu vývoje aplikací rychle a za nízkou cenu. Mainnet Sui byl oficiálně spuštěn 3. května 2023.

Tento článek poslouží jako rychlý odkaz pro vývojáře na osvědčené postupy na Sui Network.

Posunout všeobecné znalosti

Přečtěte si více o aktualizacích balíčků a napište kód vhodný pro upgrade.

Balíčky jsou neměnné a zranitelný kód balíku lze volat navždy. Řešením je přidat ochranu na úrovni objektu. Pokud upgradujete balíček z P na P', ostatní balíčky a klienti, kteří závisí na P, budou nadále používat P namísto automatické aktualizace na P'. Proto musí být kód, který závisí na balíčku i na klientovi, aktualizován tak, aby explicitně ukazoval na P'. Balíčky, u kterých se očekává, že budou rozšířeny o závislé balíčky, se mohou při každém upgradu vyhnout porušení svých předchozích rozšíření tím, že poskytují (neměnné) rozhraní, které odpovídá standardu ve všech verzích. Vezmeme-li jako příklad křížový most Wormhole, zprávy se odesílají přes Wormhole jako most Chcete-li vygenerovat rozšiřující balíček pro odesílání zpráv, můžete pomocí instrukce Prepare_message v jakékoli verzi balíčku Wormhole vygenerovat MessageTicket a klienta. kód, který zprávu odešle, musí předat MessageTicket do publish_message v balíčku nejnovější verze. Veřejné funkce nelze smazat ani změnit, ale veřejné (přátelské) funkce ano. Můžete volně používat veřejné (přítel) nebo pouze viditelné funkce pro sebe, pokud nechcete, aby byla funkce knihovny nyní veřejná navždy. Nemůžete odstraňovat typy struktur, přidávat nová pole (ačkoli můžete přidávat dynamická pole) ani upgradovat nové funkce. Při přidávání nových typů pečlivě přemýšlejte, jakmile jsou přidány, jsou tam navždy!

Používejte kolekce podporované vektory (jako je vector, VecSet, VecMap, PriorityQueue) s maximálně 1000 datovými položkami.

Kolekce, které využívají podporu dynamických polí (například Table, Bag, ObjectBag, ObjectTable, LinkedTable), se používají pro jakoukoli kolekci, která umožňuje třetím stranám přidávat, větší kolekce a kolekce neznámé velikosti. Objekty Sui Move mají maximální velikost 250 kB – jakýkoli pokus o vytvoření většího objektu způsobí přerušení transakce. Ujistěte se prosím, že se váš objekt nezvětší než kolekce podporovaná vektorem.

Pokud vaše funkce f vyžaduje platbu od volajícího, například pomocí SUI , použijte funkci fun f(platba: Coin) místo funkce fun f(platba: &mut Coin, částka: u64). To je pro volajícího bezpečnější, protože přesně ví, kolik má zaplatit, a nemusí se spoléhat na funkci f, aby vybrala správnou částku.

Není potřeba žádná malá optimalizace spotřeby plynu. Při výpočtu nákladů na Sui se zaokrouhlí na nejbližší vědro, takže pouze velmi prudké výkyvy způsobí změny plynu. Zvláště pokud je vaše nabídka již v nejnižší cenové kategorii, nemůže být levnější. Podrobnosti naleznete na obrázku níže.

Dodržujte konvence kódování Move, abyste dosáhli konzistentního stylu.

Složitost Použijte standard zobrazení k přizpůsobení vzhledu vašich objektů v peněženkách, aplikacích a prohlížečích. Vyhněte se použití funkce "samopřenos" - je možné kdykoli vrátit obj z aktuální funkce místo zápisu transfer::transfer(obj, tx_context::sender(ctx)), což umožňuje blokování volajícího nebo programovatelné transakce (programovatelný transakční blok) využívá obj. Test Použijte sui::test_scenario` k simulaci testovacího scénáře s více transakcemi a více odesílateli. Použijte sui::test_utilsmodule pro lepší zprávy s opravou chyb s testy sustain_eq, ladění tisku pomocí print a zničení pouze na zkoušku pomocí cancel . Použijte sui move test --coverage pro výpočet informací o pokrytí kódu při testování a použijte sui move pokrytí source --module pro zobrazení nekrytých řádků zvýrazněných červeně. Pokud je to možné, doporučuje se nastavit pokrytí na 100 %. Aplikace Pro optimální výkon a konzistenci dat by aplikace měly odesílat požadavky na zápis a čtení na stejném úplném uzlu. V sadě TS SDK to znamená, že aplikace by měla použít rozhraní API signTransactionBlock peněženky a poté odeslat transakci voláním execute_transactionBlock na úplném uzlu aplikace, nikoli pomocí rozhraní API signAndExecuteTransactionBlock peněženky. To zajišťuje konzistenci zápisu před čtením – čtení z úplného uzlu aplikace bude okamžitě odrážet zápisy transakce, spíše než čekání na kontrolní bod. Chcete-li snížit latenci, pokud vaše aplikace potřebuje vědět, že transakce byla potvrzena, ale nepotřebuje okamžitě vidět účinky transakce nebo číst objekty/události zapsané transakcí, použijte příkaz executeTransactionBlock s "showEffects": false a " showEvents": false . Aplikace by měly často čtená data lokálně ukládat do mezipaměti, spíše než je často načítat z celého uzlu. Kdykoli je to možné, používejte programovatelné transakční bloky ke zkombinování stávajících on-chain funkcí namísto vydávání nového kódu inteligentní smlouvy. Programovatelné transakční bloky umožňují rozsáhlé dávkové zpracování a heterogenní složení, což dále snižuje již tak nízké poplatky za plyn. Aplikace by měly ponechat rozpočet na plyn, cenu plynu a výběr mincí na peněžence, což peněžence poskytne větší flexibilitu, a je na peněžence, aby transakci otestovala, aby se ujistila, že transakce nezklame. Podepisování Nikdy nepodepisujte dvě souběžné transakce, které se dotýkají stejného exkluzivního objektu, buď samostatným použitím výhradního objektu, nebo čekáním na dokončení jedné transakce před odesláním další transakce. Porušení tohoto pravidla může způsobit nejednoznačnost klienta a zablokování exkluzivních objektů zapojených do obou transakcí až do konce aktuální epochy. Jakýkoli příkaz klienta sui, který iniciuje transakci (např. publikování klienta sui, volání klienta sui), může přijmout příznak --serialize-output pro výstup transakce base64, která má být podepsána. Sui podporuje více podpisových schémat pro podepisování transakcí, včetně nativních více podpisů.