Scritto da: Sui Rete

Sui è una catena pubblica L1 riprogettata e costruita partendo dai principi primi, con l'obiettivo di fornire a creatori e sviluppatori una piattaforma di sviluppo in grado di ospitare il prossimo miliardo di utenti in Web3. Le applicazioni su Sui si basano sul linguaggio del contratto intelligente Move e sono scalabili orizzontalmente, consentendo agli sviluppatori di supportare un'ampia gamma di sviluppo di applicazioni in modo rapido e a basso costo. La rete principale Sui è stata lanciata ufficialmente il 3 maggio 2023.

Questo articolo fungerà da riferimento rapido per gli sviluppatori sulle migliori pratiche su Sui Network.

Spostare la conoscenza generale

Scopri di più sugli aggiornamenti dei pacchetti e scrivi codice di facile aggiornamento.

I pacchetti sono immutabili e il codice del pacchetto vulnerabile può essere richiamato per sempre. La soluzione è aggiungere protezione a livello di oggetto. Se aggiorni un pacchetto da P a P', gli altri pacchetti e client che dipendono da P continueranno a utilizzare P invece di aggiornarsi automaticamente a P'. Pertanto, il codice che dipende sia dal pacchetto che dal client deve essere aggiornato in modo che punti esplicitamente a P'. I pacchetti che dovrebbero essere estesi da pacchetti dipendenti possono evitare di interrompere le loro estensioni precedenti con ogni aggiornamento fornendo un'interfaccia (immutabile) conforme allo standard in tutte le versioni. Prendendo come esempio il cross-chain bridge di Wormhole, i messaggi vengono inviati tramite Wormhole come bridge. Per generare un pacchetto di estensione per l'invio di messaggi, è possibile utilizzare l'istruzione prepare_message in qualsiasi versione del pacchetto Wormhole per generare un MessageTicket e il client. il codice che invia il messaggio deve passare il MessageTicket apublic_message nel pacchetto della versione più recente. Le funzioni pubbliche non possono essere cancellate o modificate, ma le funzioni pubbliche (amico) sì. Sei libero di utilizzare le funzioni pubbliche (amico) o solo visibili a te stesso, a meno che tu non voglia rendere pubblica per sempre la funzione della libreria attuale. Non è possibile eliminare tipi di struttura, aggiungere nuovi campi (sebbene sia possibile aggiungere campi dinamici) o aggiornare nuove funzionalità. Pensa attentamente quando aggiungi nuovi tipi, una volta aggiunti saranno lì per sempre!

Utilizza raccolte supportate da vettori (come vector, VecSet, VecMap, PriorityQueue), con un massimo di 1000 elementi di dati.

Le raccolte che utilizzano il supporto dei campi dinamici (come Table, Bag, ObjectBag, ObjectTable, LinkedTable) vengono utilizzate per qualsiasi raccolta che consente a terze parti di aggiungere raccolte più grandi e raccolte di dimensioni sconosciute. Gli oggetti Sui Move hanno una dimensione massima di 250 KB: qualsiasi tentativo di creare un oggetto più grande causerà l'interruzione della transazione, assicurati che il tuo oggetto non diventi più grande della raccolta supportata dal vettore.

Se la tua funzione f richiede un pagamento da parte del chiamante, ad esempio utilizzando SUI , utilizza la funzione fun f(payment: Coin) invece della funzione fun f(payment: &mut Coin, amount: u64). Questo è più sicuro per il chiamante perché sa esattamente quanto pagare e non ha bisogno di fare affidamento sulla funzione f per estrarre l'importo corretto.

Non è necessaria alcuna piccola ottimizzazione del consumo di gas. Quando si calcola il costo su Sui, viene arrotondato al secchio più vicino, quindi solo fluttuazioni molto brusche causeranno cambiamenti di gas. Soprattutto se il tuo affare è già nella fascia di costo più bassa, non può essere più economico. Si prega di fare riferimento all'immagine qui sotto per i dettagli.

Segui le convenzioni di codifica di Move per ottenere uno stile coerente.

Componibilità Utilizza lo standard di visualizzazione per personalizzare il modo in cui i tuoi oggetti appaiono nei portafogli, nelle applicazioni e nei browser. Evitare di utilizzare la funzione "autotrasferimento": è possibile in qualsiasi momento restituire obj dalla funzione corrente invece di scrivere transfer::transfer(obj, tx_context::sender(ctx)), che consente al chiamante o al blocco della transazione programmabile (blocco di transazione programmabile) utilizza obj. Test Utilizzare sui::test_scenario` per simulare uno scenario di test con più transazioni e più mittenti. Utilizzare sui::test_utilsmodule per migliorare i messaggi di correzione degli errori con i test assert_eq, eseguire il debug della stampa con print e la distruzione dei soli test con destroy . Utilizzare sui move test --coverage per calcolare le informazioni sulla copertura del codice durante il test e utilizzare sui move cover source --module per visualizzare le linee scoperte evidenziate in rosso. Se possibile, si consiglia di impostare la copertura al 100%. Applicazioni Per prestazioni ottimali e coerenza dei dati, le applicazioni devono inviare richieste di scrittura e lettura sullo stesso nodo completo. Nell'SDK di TS, ciò significa che l'applicazione deve utilizzare l'API signTransactionBlock del portafoglio e quindi inviare la transazione chiamandoexecute_transactionBlock sul nodo completo dell'applicazione, anziché utilizzare l'API signAndExecuteTransactionBlock del portafoglio. Ciò garantisce la coerenza della scrittura prima della lettura: le letture dal nodo completo dell'applicazione rifletteranno immediatamente le scritture della transazione, anziché attendere un checkpoint. Per ridurre la latenza, se la tua applicazione ha bisogno di sapere che una transazione è stata confermata, ma non ha bisogno di vedere immediatamente gli effetti della transazione o leggere gli oggetti/eventi scritti dalla transazione, usaexecuteTransactionBlock con "showEffects": false e " showEvents": falso . Le applicazioni dovrebbero memorizzare nella cache i dati letti frequentemente localmente anziché recuperarli frequentemente dal nodo completo. Quando possibile, utilizza blocchi di transazioni programmabili per combinare le funzionalità on-chain esistenti anziché rilasciare un nuovo codice di contratto intelligente. I blocchi di transazioni programmabili consentono l'elaborazione batch su larga scala e una composizione eterogenea, riducendo ulteriormente le già basse tariffe del gas. Le applicazioni dovrebbero lasciare il budget del gas, il prezzo del gas e la selezione delle monete al portafoglio, il che fornirà al portafoglio maggiore flessibilità, ed è responsabilità del portafoglio testare la transazione per garantire che la transazione non fallisca. Firma Non firmare mai due transazioni simultanee che toccano lo stesso oggetto esclusivo, né utilizzando l'oggetto esclusivo separatamente né aspettando il completamento di una transazione prima di inviare la transazione successiva. La violazione di questa regola può portare il cliente a equivocare, bloccando gli oggetti esclusivi coinvolti in entrambe le transazioni fino alla fine dell'epoca corrente. Qualsiasi comando del client sui che avvia una transazione (ad esempio pubblicazione del client sui, chiamata del client sui) può accettare il flag --serialize-output per generare una transazione base64 da firmare. Sui supporta più schemi di firma per la firma delle transazioni, incluse le firme multiple native.