Ditulis oleh: Jaringan Sui

Sui adalah rantai publik L1 yang didesain ulang dan dibangun dari prinsip pertama, yang bertujuan untuk menyediakan platform pengembangan bagi pembuat dan pengembang yang mampu menampung miliaran pengguna berikutnya di Web3. Aplikasi di Sui didasarkan pada bahasa kontrak pintar Move dan dapat diskalakan secara horizontal, memungkinkan pengembang untuk mendukung berbagai pengembangan aplikasi dengan cepat dan biaya rendah. Mainnet Sui resmi diluncurkan pada 3 Mei 2023.

Artikel ini akan menjadi referensi singkat bagi pengembang tentang praktik terbaik di Sui Network.

Pindahkan pengetahuan umum

Baca selengkapnya tentang pemutakhiran paket dan tulis kode yang ramah pemutakhiran.

Paket tidak dapat diubah dan kode paket yang rentan dapat dipanggil selamanya. Solusinya adalah dengan menambahkan perlindungan di tingkat objek. Jika Anda mengupgrade paket dari P ke P', paket dan klien lain yang bergantung pada P akan terus menggunakan P alih-alih memperbarui secara otomatis ke P'. Oleh karena itu, kode yang bergantung pada paket dan klien harus diperbarui agar menunjuk ke P' secara eksplisit. Paket yang diharapkan dapat diperluas oleh paket dependen dapat menghindari kerusakan ekstensi sebelumnya pada setiap peningkatan dengan menyediakan antarmuka (yang tidak dapat diubah) yang sesuai dengan standar di semua versi. Mengambil jembatan lintas rantai Wormhole sebagai contoh, pesan dikirim melalui Wormhole sebagai jembatan. Untuk menghasilkan paket ekstensi untuk mengirim pesan, Anda dapat menggunakan instruksi prep_message di versi mana pun dari paket Wormhole untuk menghasilkan MessageTicket, dan klien kode yang mengirimkan pesan harus meneruskan MessageTicket kepublish_message dalam paket versi terbaru. Fungsi publik tidak dapat dihapus atau diubah, tetapi fungsi publik (teman) bisa. Anda bebas menggunakan fungsi publik (teman) atau hanya fungsi yang dapat dilihat oleh Anda sendiri, kecuali Anda ingin membuat fungsi perpustakaan sekarang menjadi publik selamanya. Anda tidak dapat menghapus tipe struct, menambahkan kolom baru (meskipun Anda dapat menambahkan kolom dinamis), atau meningkatkan fitur baru. Pikirkan baik-baik saat menambahkan tipe baru, setelah ditambahkan tipe tersebut akan tetap ada selamanya!

Gunakan koleksi yang didukung vektor (seperti vector, VecSet, VecMap, PriorityQueue), dengan maksimal 1000 item data.

Koleksi yang menggunakan dukungan bidang dinamis (seperti Tabel, Tas, ObjectBag, ObjectTable, LinkedTable) digunakan untuk koleksi apa pun yang memungkinkan pihak ketiga untuk menambahkan, koleksi yang lebih besar, dan koleksi dengan ukuran yang tidak diketahui. Objek Sui Move memiliki ukuran maksimum 250KB - segala upaya untuk membuat objek yang lebih besar akan menyebabkan transaksi dibatalkan, pastikan objek Anda tidak bertambah besar dari koleksi vektor yang didukung.

Jika fungsi Anda f memerlukan pembayaran dari pemanggil, misalnya menggunakan SUI , gunakan fungsi fun f(pembayaran: Koin) alih-alih fungsi fun f(pembayaran: &mut Coin, jumlah: u64) . Ini lebih aman bagi penelepon karena mereka tahu persis berapa jumlah yang harus dibayar dan tidak perlu bergantung pada fungsi f untuk mengambil jumlah yang benar.

Optimasi kecil konsumsi gas tidak diperlukan. Saat menghitung biaya di Sui, biayanya dibulatkan ke ember terdekat, jadi hanya fluktuasi yang sangat tajam yang akan menyebabkan pergantian gas. Terutama jika kesepakatan Anda sudah berada dalam kisaran biaya terendah, tidak ada yang lebih murah lagi. Silakan lihat gambar di bawah ini untuk detailnya.

Ikuti konvensi pengkodean Pindahkan untuk mencapai gaya yang konsisten.

Komposabilitas Gunakan standar tampilan untuk menyesuaikan tampilan objek Anda di dompet, aplikasi, dan browser. Hindari penggunaan fungsi "transfer mandiri" - dimungkinkan kapan saja untuk mengembalikan obj dari fungsi saat ini alih-alih menulis transfer::transfer(obj, tx_context::sender(ctx)), yang memungkinkan pemanggil atau blok transaksi yang dapat diprogram (blok transaksi yang dapat diprogram) menggunakan obj. Pengujian Gunakan sui::test_scenario` untuk menyimulasikan skenario pengujian dengan banyak transaksi dan banyak pengirim. Gunakan sui::test_utilsmodule untuk pesan koreksi kesalahan yang lebih baik dengan pengujian tegas_eq, pencetakan debug dengan print , dan penghancuran hanya pengujian dengan destroy . Gunakan sui move test --coverage untuk menghitung informasi cakupan kode saat pengujian, dan gunakan sui move coverage source --module untuk melihat garis terbuka yang disorot dengan warna merah. Jika memungkinkan, disarankan untuk menetapkan cakupan menjadi 100%. Aplikasi Untuk performa optimal dan konsistensi data, aplikasi harus mengirimkan permintaan tulis dan baca pada node penuh yang sama. Dalam TS SDK, ini berarti bahwa aplikasi harus menggunakan API signTransactionBlock dompet dan kemudian mengirimkan transaksi dengan memanggil mengeksekusi_transactionBlock pada node penuh aplikasi, daripada menggunakan API signAndExecuteTransactionBlock dompet. Hal ini memastikan konsistensi tulis-sebelum-baca - pembacaan dari node penuh aplikasi akan segera mencerminkan transaksi yang ditulis, daripada menunggu pos pemeriksaan. Untuk mengurangi latensi, jika aplikasi Anda perlu mengetahui bahwa suatu transaksi telah dikonfirmasi, namun tidak perlu segera melihat efek transaksi atau membaca objek/peristiwa yang ditulis oleh transaksi tersebut, gunakan eksekusiTransactionBlock dengan "showEffects": false dan " showEvents": salah . Aplikasi harus sering menyimpan data dalam cache secara lokal daripada sering mengambilnya dari node penuh. Kapan pun memungkinkan, gunakan blok transaksi yang dapat diprogram untuk menggabungkan fungsionalitas on-chain yang ada daripada merilis kode kontrak pintar baru. Blok transaksi yang dapat diprogram memungkinkan pemrosesan batch berskala besar dan komposisi heterogen, sehingga semakin mengurangi biaya bahan bakar yang sudah rendah. Aplikasi harus menyerahkan anggaran bahan bakar, harga bahan bakar, dan pilihan koin ke dompet, yang akan memberikan fleksibilitas lebih besar pada dompet, dan merupakan tanggung jawab dompet untuk menguji coba transaksi untuk memastikan bahwa transaksi tidak gagal. Penandatanganan Jangan pernah menandatangani dua transaksi bersamaan yang menyentuh objek eksklusif yang sama, baik dengan menggunakan objek eksklusif secara terpisah atau dengan menunggu satu transaksi selesai sebelum mengirimkan transaksi berikutnya. Pelanggaran aturan ini dapat menyebabkan klien mengelak, mengunci objek eksklusif yang terlibat dalam kedua transaksi hingga akhir periode saat ini. Perintah klien sui apa pun yang memulai transaksi (mis. penerbitan klien sui, panggilan klien sui) dapat menerima tanda --serialize-output untuk menghasilkan transaksi base64 yang akan ditandatangani. Sui mendukung beberapa skema tanda tangan untuk penandatanganan transaksi, termasuk multi-tanda tangan asli.