Được viết bởi: Sui Network
Sui là chuỗi công khai L1 được thiết kế lại và xây dựng từ những nguyên tắc đầu tiên, nhằm cung cấp cho người sáng tạo và nhà phát triển một nền tảng phát triển có khả năng lưu trữ hàng tỷ người dùng tiếp theo trên Web3. Các ứng dụng trên Sui dựa trên ngôn ngữ hợp đồng thông minh Move và có khả năng mở rộng theo chiều ngang, cho phép các nhà phát triển hỗ trợ nhiều hoạt động phát triển ứng dụng một cách nhanh chóng và với chi phí thấp. Mạng chính Sui được chính thức ra mắt vào ngày 3 tháng 5 năm 2023.
Bài viết này sẽ đóng vai trò là tài liệu tham khảo nhanh cho các nhà phát triển về các phương pháp hay nhất trên Sui Network.
Chuyển kiến thức tổng quát
Đọc thêm về nâng cấp gói và viết mã thân thiện với nâng cấp.
Các gói là bất biến và mã gói dễ bị tấn công có thể được gọi mãi mãi. Giải pháp là thêm tính năng bảo vệ ở cấp đối tượng. Nếu bạn nâng cấp gói từ P lên P' thì các gói và ứng dụng khách khác phụ thuộc vào P sẽ tiếp tục sử dụng P thay vì tự động cập nhật lên P'. Do đó, mã phụ thuộc vào cả gói và máy khách phải được cập nhật để trỏ tới P' một cách rõ ràng. Các gói dự kiến sẽ được mở rộng bởi các gói phụ thuộc có thể tránh làm hỏng các tiện ích mở rộng trước đó của chúng sau mỗi lần nâng cấp bằng cách cung cấp giao diện (không thay đổi) tuân thủ tiêu chuẩn trên tất cả các phiên bản. Lấy cầu nối chuỗi chéo Wormhole làm ví dụ, các tin nhắn được gửi qua Wormhole làm cầu nối. Để tạo gói mở rộng để gửi tin nhắn, bạn có thể sử dụng lệnh prepare_message trong bất kỳ phiên bản nào của gói Wormhole để tạo MessageTicket và ứng dụng khách. mã gửi tin nhắn phải chuyển MessageTicket tới Publish_message trong gói phiên bản mới nhất. Các chức năng công khai không thể bị xóa hoặc thay đổi, nhưng các chức năng công khai (bạn bè) thì có thể. Bạn có thể tự do sử dụng các chức năng công khai (bạn bè) hoặc chỉ hiển thị cho chính mình, trừ khi bạn muốn đặt chức năng thư viện hiện tại ở chế độ công khai mãi mãi. Bạn không thể xóa các loại cấu trúc, thêm trường mới (mặc dù bạn có thể thêm trường động) hoặc nâng cấp các tính năng mới. Hãy suy nghĩ cẩn thận khi thêm các loại mới, một khi đã thêm chúng sẽ ở đó mãi mãi!
Sử dụng các bộ sưu tập được vector hỗ trợ (như vector, VecSet, VecMap, PriorityQueue), với tối đa 1000 mục dữ liệu.
Các bộ sưu tập sử dụng hỗ trợ trường động (chẳng hạn như Bảng, Túi, ObjectBag, ObjectTable, LinkedTable) được sử dụng cho bất kỳ bộ sưu tập nào cho phép bên thứ ba thêm, bộ sưu tập lớn hơn và bộ sưu tập có kích thước không xác định. Các đối tượng Sui Move có kích thước tối đa là 250KB - mọi nỗ lực tạo đối tượng lớn hơn sẽ khiến giao dịch bị hủy bỏ, vui lòng đảm bảo đối tượng của bạn không phát triển lớn hơn bộ sưu tập được hỗ trợ của vectơ.
Nếu hàm f của bạn yêu cầu thanh toán từ người gọi, chẳng hạn như sử dụng SUI, hãy sử dụng hàm fun f(Payment: Coin) thay vì hàm fun f(Payment: &mut Coin, money: u64). Điều này an toàn hơn cho người gọi vì họ biết chính xác số tiền phải trả và không cần dựa vào hàm f để trích đúng số tiền.
Không cần tối ưu hóa mức tiêu thụ gas chút nào. Khi tính chi phí trên Sui sẽ được làm tròn đến thùng gần nhất nên chỉ những dao động rất mạnh mới gây ra hiện tượng thay đổi khí. Đặc biệt nếu giao dịch của bạn đã ở mức chi phí thấp nhất thì không thể nào rẻ hơn được nữa. Vui lòng tham khảo hình ảnh dưới đây để biết chi tiết.
Thực hiện theo các quy ước mã hóa Move để đạt được phong cách nhất quán.
Khả năng kết hợp Sử dụng tiêu chuẩn hiển thị để tùy chỉnh cách các đối tượng của bạn xuất hiện trong ví, ứng dụng và trình duyệt. Tránh sử dụng chức năng "tự chuyển" - có thể trả về obj từ chức năng hiện tại bất cứ lúc nào thay vì viết transfer::transfer(obj, tx_context::sender(ctx)), cho phép người gọi hoặc khối giao dịch có thể lập trình (khối giao dịch có thể lập trình) sử dụng obj. Kiểm tra Sử dụng sui::test_scenario` để mô phỏng kịch bản thử nghiệm với nhiều giao dịch và nhiều người gửi. Sử dụng sui::test_utilsmodule để có thông báo sửa lỗi tốt hơn với các bài kiểm tra khẳng định_eq, gỡ lỗi in bằng print và hủy chỉ kiểm tra bằng destroy . Sử dụng sui move cover test --coverage để tính toán thông tin phạm vi mã khi kiểm tra và sử dụng sui move cover source --module để xem các dòng không được che phủ được đánh dấu màu đỏ. Nếu khả thi, nên đặt mức độ phù hợp là 100%. Ứng dụng Để có hiệu suất tối ưu và tính nhất quán của dữ liệu, các ứng dụng nên gửi yêu cầu ghi và đọc trên cùng một nút đầy đủ. Trong TS SDK, điều này có nghĩa là ứng dụng phải sử dụng API signTransactionBlock của ví rồi gửi giao dịch bằng cách gọi exec_transactionBlock trên nút đầy đủ của ứng dụng, thay vì sử dụng API signAndExecuteTransactionBlock của ví. Điều này đảm bảo tính nhất quán của việc ghi trước khi đọc - các lần đọc từ nút đầy đủ của ứng dụng sẽ ngay lập tức phản ánh việc ghi của giao dịch, thay vì chờ điểm kiểm tra. Để giảm độ trễ, nếu ứng dụng của bạn cần biết rằng giao dịch đã được xác nhận nhưng không cần xem ngay tác động của giao dịch hoặc đọc các đối tượng/sự kiện được giao dịch ghi, hãy sử dụng execTransactionBlock với "showEffects": false và " showEvent": sai. Các ứng dụng nên lưu vào bộ nhớ đệm thường xuyên đọc dữ liệu cục bộ thay vì thường xuyên tìm nạp dữ liệu đó từ nút đầy đủ. Bất cứ khi nào có thể, hãy sử dụng các khối giao dịch có thể lập trình để kết hợp chức năng trên chuỗi hiện có thay vì phát hành mã hợp đồng thông minh mới. Các khối giao dịch có thể lập trình cho phép xử lý hàng loạt quy mô lớn và thành phần không đồng nhất, giúp giảm hơn nữa phí gas vốn đã thấp. Các ứng dụng nên để lại ngân sách gas, giá gas và lựa chọn tiền xu cho ví, điều này sẽ mang lại sự linh hoạt cao hơn cho ví và trách nhiệm của ví là chạy thử giao dịch để đảm bảo rằng giao dịch không thất bại. Ký kết Không bao giờ ký hai giao dịch đồng thời chạm vào cùng một đối tượng độc quyền, bằng cách sử dụng riêng đối tượng độc quyền đó hoặc bằng cách đợi một giao dịch hoàn tất trước khi gửi giao dịch tiếp theo. Việc vi phạm quy tắc này có thể khiến khách hàng lập lờ, khóa các đối tượng độc quyền liên quan đến cả hai giao dịch cho đến khi kết thúc kỷ nguyên hiện tại. Bất kỳ lệnh sui client nào bắt đầu một giao dịch (ví dụ: xuất bản sui client, lệnh gọi sui client) đều có thể chấp nhận cờ --serialize-output để xuất giao dịch base64 được ký. Sui hỗ trợ nhiều sơ đồ chữ ký để ký giao dịch, bao gồm cả chữ ký đa gốc.
