Trang chủ
Chào mừng đến với Diễn đàn Cộng đồng Sui
Bài Viết Mới
- Cơ chế kiểm soát và nhận truy cập đối tượngBài ViếtApr 13, 2025
Đây là phần 2 của loạt “Đối tượng cha mẹ-con trong Sui Move”. Bạn có thể đọc phần 1 tại đây Chuyển giao kiểm soát truy cập đối tượng: :nhận Cơ chế Vì vậy, bạn đã đặt một đối tượngXbên trongPcha mẹ (bằng cách chuyển X sang ID của P) - làm thế nào để bạn lấy nó ra hoặc sử dụng nó? 🤔 Đó là nơi cơ chế nhận đặc biệt của Sui xuất hiện. Khi một đối tượng được chuyển đến cha mẹ, nó không tự động bật ra. Nó nằm ở đó, thuộc sở hữu củaP. Để * sử dụng* hoặc* hoặc* đối tượng con đó trong một giao dịch, bạn phảinhậnnó. Sui cung cấp một cách có cấu trúc để thực hiện việc này bằng cách sử dụng **Nhận vé và chức năng chuyển: :nhận. ##Vé nhận tiên Hãy nghĩ về Nhận như một phiếu yêu cầu cho một đối tượng con thuộc loại T. Trong một giao dịch, thay vì chuyển trực tiếp đối tượng con (mà bạn chưa sở hữu) cho một hàm, bạn chuyển một Receiving - về cơ bản là tham chiếu đến “đối tượng có ID Y thuộc sở hữu của cha mẹ X”. Nhận này là một cấu trúc Move đặc biệt mang ID, phiên bản và bản phân tích của đối tượng được nhận. Nó chỉ có khả năng thả, nghĩa là nó có thể tồn tại phù du nhưng không thể được lưu trữ liên tục. Nói cách khác, đó là một vé sử dụng một lần trong một giao dịch. Làm thế nào để bạn nhận được một nhận? Thông thường, bằng cách thực hiện chuyển nhượng. Trong khối giao dịch có thể lập trình (PTB), một bước có thể chuyển đối tượngCsangPcha mẹ, tạo ra phiếu nhận mà bước tiếp theo có thể sử dụng. Nếu đứa trẻ đã ngồi trong vai cha mẹ từ một giao dịch trước đó, bạn có thể cung cấp Thông tin nhận làm đầu vào cho một giao dịch mới (Sui SDK/CLI cho phép bạn chỉ định đối tượng con bằng ID và cha mẹ của nó để tạo vé). Quan trọng: Bản thân việc tiếp nhận không phải là đối tượng - nó chưa cho bạn quyền sở hữu. Nó chỉ báo hiệu rằng “đối tượng loại T với ID này thuộc sở hữu của cha mẹ đó, và tôi dự định lấy nó.” Để thực sự lấy đối tượng, bạn phải gọi transfer: :receiver: module example::toy_box { use sui::transfer::{Self, Receiving}; struct Toy has key { id: UID, name: vector } struct Box has key { id: UID } /// Remove a Toy child from a Box, returning the Toy to the caller. public entry fun take_toy(box: &mut Box, toy_ticket: Receiving): Toy { // Use the parent's UID and the Receiving ticket to get the Toy let toy = transfer::receive(&mut box.id, toy_ticket); // Now toy is an owned value we can return (or transfer to someone). toy } } Trong take_toy, toy_ticket: Receiving đại diện cho Toy thuộc về hộp. Bằng cách gọi transfer: :receiver (&mut box.id, toy_ticket), chúng ta gọi logic gốc của Sui để thực sự lấy đối tượng Toy ra khỏi hộp. Điều này làm một số điều quan trọng: Nó* xác nhận*khi chạy rằng toy_ticket thực sự tham chiếu đến một đối tượng hiện thuộc sở hữu của hộp (sử dụng UID của cha mẹ). Nếu một cái gì đó không khớp (nhầm cha mẹ hoặc đối tượng không thực sự ở đó), nó sẽ bị hủy bỏ. Sau đó, nó trả về đối tượng Toy thực tế dưới dạng giá trị sở hữu trong giao dịch, nghĩa là bây giờ Đồ chơi nằm trong tầm kiểm soát của hàm của chúng tôi. Lưu ý rằng chúng tôi phải chuyển qua &mut box.id. Sui thực thi rằng chúng tôi có một tham chiếu có thể thay đổi đến UID của phụ huynh**để nhận cuộc gọi. Đây là một điều khiển truy cập thông minh: chỉ mô-đun có thể tạo ra & mut UID của cha mẹ mới có thể cho phép nhận. Thông thường, mô-đun định nghĩa của kiểu cha mẹ sẽ hiển thị một hàm như take_toy mà các cuộc gọi nội bộ nhận được. Nếu mô-đun cha không hiển thị bất kỳ hàm nào cung cấp UID & mut (trực tiếp hoặc gián tiếp), thì không mã bên ngoài nào có thể lấy con của nó. Bằng cách này, mô-đun của phụ huynh kiểm soát cách thức và thời điểm trẻ em có thể được truy cập. Trong ví dụ, Box có trường id: UID. Vì take_toy nằm trong cùng một mô-đun, nó có thể mượn &mut box.id. Các mô-đun hoặc giao dịch bên ngoài có thể gọi take_toy (box_obj, ticket) nhưng chúng không thể tự gọi transfer: :receiver trên Box vì box.id là riêng tư. Mẫu này đảm bảo chỉ mã được ủy quyền mới có thể truy xuất trẻ em.✅ Còn đối tượng lồng nhau thì sao? Nếu Toy theo nghĩa đen là một cánh đồng bên trong Hộp (ví dụ Box {id, toy: Toy}), chúng tôi sẽ không cần bất kỳ nhận nào - đồ chơi sẽ có thể truy cập bất cứ khi nào bạn có & mut Box. Nhưng điều đó cũng có nghĩa là loại bỏ nó hoặc xử lý nó một cách riêng biệt khó hơn (nó giống như một phần của hộp). Với các đồ vật trẻ em, chúng tôi tách bộ lưu trữ: đồ chơi tách biệt và phải được lấy ra một cách rõ ràng. Sự rõ ràng này là lý do tại sao Sui yêu cầu vé nhận và nhận cuộc gọi - điều này khiến việc lấy trẻ trở thành một hành động được ủy quyền. Yêu cầu tham chiếu có thể thay đổi: Bạn có thể tự hỏi, tại sao &mut UID chứ không chỉ &UID? Có thể thay đổi đảm bảo cha mẹ bị khóa trong quá trình nhận, ngăn chặn sửa đổi đồng thời và đảm bảo người gọi thực sự có quyền sửa đổi cha mẹ đó (thường ngụ ý rằng họ là chủ sở hữu). Đó là một phần của kiểm tra quyền sở hữu năng động của Sui - bằng cách nhận một khoản vay có thể thay đổi từ UID của cha mẹ, Sui đảm bảo không có giao dịch hoặc hành động song song nào khác có thể can thiệp trong khi bạn rút đứa trẻ ra. Nó giống như khóa cửa của cha mẹ trước khi loại bỏ nội dung. Ví dụ sử dụng trong khối giao dịch: Giả sử một đối tượng Box thuộc sở hữu của Alice, và cô ấy có một đối tượng Toy mà cô ấy muốn đặt vào hộp và sau đó có thể xảy ra Hãy lấy nó ra sau. Đây là cách nó có thể lặn k: Đính kèm đồ chơi vào hộp:** Alice gọi chuyển: :public_transfer (toy, @); trong PTB. Điều này chuyển đồ chơi dưới hộp (chúng tôi sử dụng public_transfer ở đây vì đó là bối cảnh giao dịch - sẽ sớm biết thêm về điều đó). Bây giờ đồ chơi là một đứa trẻ của hộp. -Trong cùng một giao dịch hoặc một giao dịch khác, truy xuất đồ chơi: Alice gọi example: :toy_box: :take_toy (box_obj,) trong đó Receiving đề cập đến đồ chơi. Dưới mui xe, take_toy gọi nhận, xác minh mối quan hệ và trả về Toy. Bây giờ Toy sẽ là đầu ra của giao dịch, thường kết thúc trở lại dưới địa chỉ của Alice (vì chúng tôi trả về nó từ một hàm nhập). Những điểm rút ra chính: Các đối tượng con không thể truy cập được theo mặc định; bạn cần vé nhận và chức năng thích hợp để đưa chúng ra. Mô-đun của cha mẹ quyết định cách bạn có thể truy xuất (bằng cách cung cấp một hàm với & mut UID). transfer: :receiver được sử dụng * trong mô-đun xác định của cha đẹ* cho các đối tượng của mô-đun đó hoặc bạn bè của nó. Nếu loại của đứa trẻ được định nghĩa ở nơi khác, bạn sẽ cần một cách tiếp cận khác (nhập public_receiver...). Trước khi tiếp tục, một chi tiết nữa: nếu một đối tượng loại T chỉ có khả năng khóa (không có cửa hàng), Sui coi nó như bị hạn chế hơn một chút. Các đối tượng như đó* không thể nhận được bằng mã chung bên ngoài mô-đun của chúng. Trong thực tế, điều này có nghĩa là nếu T chỉ có khóa và trở thành con, bạn sẽ cần xử lý việc truy xuất nó trong mô-đun riêng của nó hoặc mô-đun của cha mẹ bằng một quy tắc tùy chỉnh. Nếu T cũng có cửa hàng, chúng tôi có tính linh hoạt hơn thông qua public_receiver. Chúng ta hãy khám phá điều đó tiếp theo.
2 - ✏️ Đối tượng phụ huynh-con trong Sui MoveBài ViếtApr 12, 2025
Trong Sui Move, các đối tượng có thể sở hữu các đối tượng khác giống như các đối tượng của tài khoản. Điều này mở ra các mẫu thiết kế mới (và một vài điểm) cho các nhà phát triển. Trong hướng dẫn này, tôi sẽ chia nhỏ các khái niệm đối tượng cha mẹ-con trong Sui Move thành bốn phần: 1.* Giới thiệu về khái niệm cha mẹ-con cái trong Sui Move* 2.* Cơ chế kiểm soát truy cập đối tượng* 3.* Quản lý con chênh lệch mô-đun với public_receive* 4.* Logic ràng buộc linh hồn và mô hình nhận trả lời* Cuối cùng, bạn sẽ hiểu cách tổ các đối tượng, truy xuất các đối tượng con thông qua transfer: :receiver, quản lý con trên các mô-đun với public_receiver và thậm chí tạo các đối tượng liên kết với linh hồn mà boomerang trở lại chủ sở hữu của chúng. Giới thiệu về các khái niệm cha mẹ-con cái trong Sui Move ###Đối tượng cha mẹ và con là gì? Ở Sui, mọi đối tượng đều có một ID duy nhất và một * chủ sở hữu. Thông thườngchủ sở hữu là một địa chỉ*(giống như tài khoản của người dùng), nhưng chủ sở hữu cũng có thể là một đối tượng khác. Nếu đối tượng A sở hữu đối tượng B, ta gọi A là cha mẹ và B là con. Đứa trẻ thuộc sở hữu của đối tượng chứ không phải thuộc sở hữu địa chỉ. Chuyển sang các đối tượng: Sui không thực sự phân biệt giữa địa chỉ và ID đối tượng dưới mui xe - cả hai chỉ là định danh 32 byte Điều này có nghĩa là bạn có thể chuyển một đối tượng sang ID của đối tượng khác giống như cách bạn chuyển đến địa chỉ của người dùng. Khi bạn làm điều này, bạn đang lồng một đối tượng bên trong đối tượng cha một cách hiệu quả. Thời gian chạy của Sui đặt trường chủ sở hữu của con thành ID của cha mẹ (thay vì địa chỉ) Vậy tại sao điều này lại tuyệt? Bởi vì đứa trẻ giữ ID duy nhất của riêng mình và tồn tại độc lập trong bộ nhớ, nhưng bây giờ nó được gắn với cha mẹ. Nó giống như tặng bạn của bạn một bộ sưu tập độc đáo để giữ trong tủ của họ - bộ sưu tập giữ ID của nó và có thể được theo dõi, nhưng tủ khóa của bạn bạn của bạn bây giờ được liệt kê là chủ sở hữu của nó. Điều quan trọng là phải phân biệt các đối tượng độc đáo so với đối tượng lồng nhau so với đối tượng con:** Đối tượng duy nhất (thuộc sở hữu địa chỉ) :**Một đối tượng thông thường thuộc sở hữu của một địa chỉ (ví dụ: tài khoản của người dùng). Đây là trường hợp mặc định - hãy nghĩ đến NFT, tiền xu, v.v., sống trực tiếp trong ví của người dùng. Mỗi loại có một ID duy nhất và là cấp cao nhất trong bộ nhớ. Đối tượng lồng nhau (Wrapped):* Một đối tượng được lưu trữ *bên trong dữ liệu của đối tượng khác (ví dụ, dưới dạng trường trong cấu trúc). Trong trường hợp này, đối tượng bên trong là bàn và* không*là một thực thể cấp cao nhất riêng biệt. Nó không hiển thị theo ID của nó trong bộ nhớ toàn cầu vì nó là một phần của nội dung byte của cha mẹ. Trong Tùy, nếu bạn đặt một vật như một cánh đồng trong một vật khác mà không cần xử lý đặc biệt, nó sẽ bị quấn. Đối tượng con (Đối tượng thuộc sở hữu của đối tượng) :*Một đối tượng thuộc sở hữu của đối tượng khác nhưng không được gói trực tiếp trong các trường của nó. Con vẫn là một đối tượng cấp cao nhất riêng biệt trong bộ nhớ (với ID và dữ liệu riêng) và ID của cha mẹ được ghi lại với tư cách là chủ sở hữu trong siêu dữ liệu của trẻ. Điều này có nghĩa là bạn có thể* truy vấn hoặc truy cập đứa trẻ bằng ID của nó (với các quyền phù hợp). Nó không được nhúng vào nội dung của cha mẹ, chỉ được sở hữu một cách hợp lý. Sử dụng sự tương tự của chúng tôi, nó giống như bạn đã đưa cho bạn mình bộ sưu tập của mình để giữ - nó vẫn được gắn thẻ riêng lẻ và có thể theo dõi, chỉ được lưu trữ trong tủ khóa của họ. Lợi ích của việc tạo một đối tượng con (thông qua chuyển khoản) thay vì gói nó là ID của trẻ vẫn có thể truy cập bên ngoài. Ví dụ: trình thám hiểm hoặc ví có thể liệt kê một đối tượng con theo ID, trong khi một đối tượng được gói lại không thể nhìn thấy bên ngoài đối tượng cha của nó. Các đối tượng con cũng duy trì ID ổn định ngay cả khi chúng di chuyển giữa các chủ sở hữu hoặc lồng vào các bố mẹ khác nhau. Điều này rất phù hợp với những thứ như hàng tồn kho trên chuỗi hoặc mẫu “ví bên trong ví”, nơi bạn muốn đối tượng container chứa nhiều mặt hàng mà những người khác vẫn có thể tham khảo riêng lẻ Quyền sở hữu và quyền truy cập: Nếu một đối tượng thuộc sở hữu của đối tượng khác, chỉ chủ sở hữu của cha mẹ thường có thể truy cập hoặc sử dụng con Đây là một hình thức ủy quyền động. Ví dụ, nếu Alice sở hữu một đối tượng cha mẹ P và P sở hữu con C, thì chỉ Alice (hoặc các giao dịch mà Alice ký) mới có thể thao túng C. Sui thực thi điều này để sở hữu một phụ huynh giống như giữ chìa khóa cho tất cả các con của nó 🔑. Có thể bạn biết: Tính năng chuyển sang đối tượng của Sui về cơ bản mang lại cho chúng ta* quyền sở hữu đối tượng giống như cây cốc*. Cha mẹ có thể có nhiều con (và những đứa trẻ đó có thể có con riêng, tạo thành một hệ thống phân cấp). Điều này được thực hiện bằng cách xử lý ID đối tượng như địa chỉ để chuyển. Chúng tôi có: Đối tượng thuộc sở hữu địa chỉ**(đối tượng duy nhất bình thường), Đối tượng thuộc sở hữu đối tượng**(đối tượng con, vẫn ở cấp cao nhất nhưng gắn với cha mẹ), Các đối tượng được gói cảng**(lồng bên trong dữ liệu của đối tượng khác, không phải cấp cao nhất). Trong các bài viết tiếp theo, chúng ta sẽ xem cách thực sự truy xuất hoặc tương tác với các đối tượng con (vì chúng không thể truy cập trực tiếp như các đối tượng thuộc sở hữu địa chỉ) và cách thực thi các quy tắc xung quanh chúng.
3 - Xây dựng DApp xổ số NFT thế hệ tiếp theo với Sui Move và giao diện người dùng hiện đạiBài ViếtApr 10, 2025
🧩 Xây dựng DApp xổ số NFT thế hệ tiếp theo với Sui Move & giao diện người dùng hiện đại Đây là hướng dẫn cơ bản của bạn để xây dựng DApp xổ số được chơi game hóa, hỗ trợ NFT sử dụngSui Move, với hỗ trợ nhiều vòng, hệ thống giới thiệu, quản trị DAO và hệ thống thiết kế mà Gen Z sẽ yêu thích. Từ kiến trúc hợp đồng đến quy trình giao diện người dùng — hãy cùng tham gia. 📦 Phân tích giai đoạn Giai đoạn 1 — Xổ số cốt lõi Trò chơi nhiều vòng Bán vé NFT Hệ thống phần thưởng giới thiệu Bỏ phiếu DAO cơ bản Giai đoạn 2 - Thị trường & Trò chơi hóa Tích hợp thị trường NFT Boosters (tăng cơ hội chiến thắng) Hệ thống Jackpot Airdrop ẩn Giai đoạn 3 - DAO & Multichain Khả năng tương thích chuỗi chÉO DAO với các đề xuất nâng cao Định giá năng động Phân tích trên chuỗi 🧠 Hợp đồng thông minh Tìm hiểu sâu về Sui Move Cấu trúc hợp đồng module nft_lottery_x::nft_lottery_x { use sui::object; use sui::balance::{Balance, zero}; use sui::coin::{Self, Coin}; use sui::clock::Clock; use sui::random::Random; use sui::event::emit; use sui::transfer; use sui::tx_context::TxContext; use std::option; use std::signer; const EGameNotStarted: u64 = 1000; const EGameAlreadyFinished: u64 = 1001; const EInvalidPayment: u64 = 1002; const ENoTickets: u64 = 1003; const EWinnerAlreadyChosen: u64 = 1004; const ENotWinner: u64 = 1005; public struct Game has key { id: UID, ticket_price: u64, start_time: u64, end_time: u64, total_tickets: u32, round: u32, winner: Option, balance: Balance, referral_bonus: u64, } public struct Ticket has key { id: UID, game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct GameCreated has copy, drop { game_id: ID, start_time: u64, end_time: u64, ticket_price: u64, } public struct TicketBought has copy, drop { game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct WinnerAnnounced has copy, drop { game_id: ID, winner_ticket: u32, round: u32, } public struct RewardClaimed has copy, drop { game_id: ID, ticket_number: u32, amount: u64, } public fun create_game( start_time: u64, end_time: u64, ticket_price: u64, referral_bonus: u64, ctx: &mut TxContext ) { let game = Game { id: object::new(ctx), ticket_price, start_time, end_time, total_tickets: 0, round: 1, winner: option::none(), balance: zero(), referral_bonus, }; emit(GameCreated { game_id: object::id(&game), start_time, end_time, ticket_price, }); transfer::share_object(game); } public fun buy_ticket( game: &mut Game, coin: Coin, clock: &Clock, referrer: Option, ctx: &mut TxContext ): Ticket { assert!(clock.timestamp_ms() >= game.start_time, EGameNotStarted); assert!(clock.timestamp_ms() (TicketBought { game_id: object::id(game), ticket_number: ticket.ticket_number, buyer: ticket.buyer, referrer: ticket.referrer, }); ticket } public entry fun determine_winner( game: &mut Game, rand: &Random, clock: &Clock, ctx: &mut TxContext ) { assert!(clock.timestamp_ms() >= game.end_time, EGameNotStarted); assert!(game.winner.is_none(), EWinnerAlreadyChosen); assert!(game.total_tickets > 0, ENoTickets); let mut generator = rand.new_generator(ctx); let winning_ticket = generator.generate_u32_in_range(1, game.total_tickets); game.winner = option::some(winning_ticket); emit(WinnerAnnounced { game_id: object::id(game), winner_ticket: winning_ticket, round: game.round, }); } public fun claim_reward( ticket: Ticket, game: Game, ctx: &mut TxContext ): Coin { assert!(object::id(&game) == ticket.game_id, EInvalidPayment); let ticket_num = ticket.ticket_number; assert!(game.winner.contains(&ticket_num), ENotWinner); let amount = game.balance.value(); let reward = game.balance.into_coin(ctx); emit(RewardClaimed { game_id: object::id(&game), ticket_number: ticket.ticket_number, amount, }); object::delete(object::id(&game)); reward } } Những điểm rút ra chính: ✅ Balanceđảm bảo an toàn kiểu và xử lý tiền xu thích hợp ✅ báo Optionhiệu rõ ràng nếu người chiến thắng đã được chọn ✅ Sự kiện cung cấp khả năng truy xuất nguồn gốc cho người giao diện và nhà thám hiểm 🛠 Lệnh Sui CLI sui client call --package --module nft_lottery_x --function create_game --args --gas-budget 10000000 Để mua vé, xác định người chiến thắng hoặc nhận phần thưởng, hãy làm theo các quy trình CLI tương tự. 🔮 Bổ sung trong tương lai Logic tự động đặt lại cho vòng tiếp theo claim_reward Phát ra nhiều sự kiện hơn như ReferralRewardDistributed Tái cấu trúc giải đặc biệt và giới thiệu thành các mô-đun con Hãy cho tôi biết nếu bạn muốn phần 2 để xây dựng giao diện người dùng và tích hợp trên Sui testnet!
3 - Hướng dẫn giao dịch Sui: Từ thiết lập đến thực hiện và xác minhBài ViếtApr 09, 2025
Hướng dẫn giao dịch Sui: Từ thiết lập đến thực hiện và xác minh Nếu bạn tò mò về các chi tiết của việc thực hiện các giao dịch trên blockchain Sui và muốn có một hướng dẫn chuyên sâu, thực tế hướng dẫn bạn từng bước. Trong bài viết này, chúng ta sẽ khám phá toàn bộ hành trình — từ thiết lập môi trường khách hàng của bạn, kiểm tra các đối tượng ví của bạn, tính phí gas, đến việc ký và thực hiện giao dịch và cuối cùng xác minh chi tiết của nó. Hãy chia nhỏ từng bước: Điều gì làm cho Sui trở nên đặc biệt như vậy? 🔥 Sui cung cấp một nền tảng được tối ưu hóa cao cho các ứng dụng phi tập trung (DApps) và hợp đồng thông minh. Thiết kế thanh lịch của nó trong việc quản lý phí gas và logic giao dịch làm cho nó trở thành một sân chơi thú vị cho các nhà phát triển muốn vượt qua ranh giới của công nghệ Web3. 2. Bắt đầu: Thiết lập môi trường và Cấu hình ví ⚙️ 2.1. Cấu hình môi trường khách hàng Sui của bạn Trước khi đi sâu vào các giao dịch, hãy đảm bảo khách hàng Sui của bạn được thiết lập đúng cách. Sui hỗ trợ nhiều mạng (devnet, mainnet, testnet) và bạn có thể kiểm tra mạng nào đang hoạt động bằng lệnh dưới đây: ➜ sui client envs ╭─────────┬─────────────────────────────────────┬────────╮ │ alias │ url │ active │ ├─────────┼─────────────────────────────────────┼────────┤ │ devnet │ https://fullnode.devnet.sui.io:443 │ │ │ mainnet │ https://fullnode.mainnet.sui.io:443 │ │ │ testnet │ https://fullnode.testnet.sui.io:443 │ * │ ╰─────────┴─────────────────────────────────────┴────────╯ Điều này xác nhận rằng bạn đã được kết nối với testnet. Có được mạng lưới phù hợp là bước đầu tiên hướng tới một giao dịch thành công. 2.2. Kiểm tra ví hoạt động của bạn Tiếp theo, xác minh địa chỉ ví hoạt động của bạn. Điều này rất quan trọng vì mọi giao dịch đều gắn liền với danh tính ví của bạn: ➜ sui client active-address 0x35370841d2e69b495b1e2f944a3087e4242f314e503691a00b054e0ee2a45a73 2.3. Truy vấn đối tượng thuộc sở hữu Sử dụng API Suix_GetOwnEdObjects, bạn có thể lấy thông tin chi tiết về các đối tượng (như tiền xu) bạn sở hữu trên blockchain. Lệnh này giúp bạn kiểm tra số dư tài khoản và tài sản có sẵn cho các giao dịch: { "jsonrpc": "2.0", "id": 1, "method": "suix_getOwnedObjects", "params": [ "0x35370841d2e69b495b1e2f944a3087e4242f314e503691a00b054e0ee2a45a73", { "filter": { "MatchAll": [ { "StructType": "0x2::coin::Coin" } ] }, "options": { "showType": true, "showOwner": true, "showPreviousTransaction": true } } ] } Bước này rất quan trọng để xác minh rằng ví của bạn có các đồng tiền cần thiết (trong trường hợp này là SUI coin) trước khi bạn thực hiện bất kỳ giao dịch nào. 3. Tính toán khí đốt: Lập ngân sách cho chi phí giao dịch 💸 Gas là nhiên liệu cung cấp năng lượng cho các giao dịch blockchain. Điều cần thiết là phải hiểu cả giá xăng và ngân sách gas để tránh thất bại trong giao dịch. 3.1. Lấy giá xăng Giá gas hiện tại có thể được truy xuất bằng cách sử dụng lệnh gọi API SUIX_getReferenceGasPrice: { "jsonrpc": "2.0", "id": 1, "method": "suix_getReferenceGasPrice", "params": [] } Nếu API trả về “1000", điều đó có nghĩa là mỗi đơn vị khí có giá 1000 MIST. Hãy nhớ rằng, 1 SUI bằng 10 ^ 9 MIST, vì vậy ngay cả những con số nhỏ trong MIST cũng có thể cộng lại khi lập ngân sách. 3.2. Thiết lập ngân sách gas Ngân sách xăng của bạn là lượng gas tối đa (trong MIST) mà bạn sẵn sàng chi tiêu. Ví dụ của chúng tôi, giả sử ngân sách gas của bạn là 4964000 MIST. Tổng chi phí của một giao dịch thường được tính như sau: Tổng chi phí = Chi phí tính toán + Chi phí lưu trữ - Hoàn tiền lưu trữ Ví dụ: • Chi phí tính toán: 1.000.000 MIST • Chi phí lưu trữ: 2,964.000 MIST • Giảm giá lưu trữ: 978.120 MIST Vì vậy, chi phí ròng trở thành 1.000.000 + 2.964.000 - 978.120 = 2.985.880 MIST. Thiết lập chính xác ngân sách gas của bạn đảm bảo giao dịch của bạn có đủ tiền để được thực hiện thành công. 4. Xây dựng giao dịch: Một cuộc chạy khô khan cho sự tự tin 🔧 Trước khi gửi giao dịch trực tiếp, tốt nhất bạn nên chạy “chạy khô” để phát hiện bất kỳ vấn đề tiềm ẩn nào. Điều này cho phép bạn xác thực logic giao dịch mà không tốn bất kỳ khí đốt nào. 4.1. Xây dựng giao dịch Dry-Run Dưới đây là một hàm TypeScript mẫu trình bày cách chuẩn bị và thực hiện một giao dịch chạy khô. Mã này phác thảo cách chia tiền xu và chuẩn bị các hoạt động chuyển nhượng: export const signSuiDryRunTransaction = async (requestParams: SignDryRequestParams): Promise => { const { gasPrice, privateKey, coinRefs, network, recipients } = requestParams; const keypair = Ed25519Keypair.fromSecretKey(privateKey); const tx = newTransaction(); // Configure gas payment, price, and sender tx.setGasPayment(coinRefs); tx.setGasPrice(gasPrice); tx.setSender(keypair.toSuiAddress()); // Split coins based on each recipient's amount const coins = tx.splitCoins(tx.gas, recipients.map((transfer) => transfer.amount)); recipients.forEach((transfer, index) => { tx.transferObjects([coins[index]], transfer.to); }); // Build and sign the transaction with the client const client = newSuiClient({ url: getFullnodeUrl(network) }); const bytes = await tx.build({ client }); const { signature } = await keypair.signTransaction(bytes); await verifyTransactionSignature(bytes, signature, { address: keypair.getPublicKey().toSuiAddress() }); return JSON.stringify([toBase64(bytes), signature]); }; Bước chạy khô này rất quan trọng để đảm bảo rằng mọi chi tiết đều chính xác trước khi bạn cam kết tiền thật. 5. Ký kết và thực hiện giao dịch: Kết hợp tất cả lại với nhau ✍️ Sau khi chạy nhanh thành công, bước tiếp theo là ký và gửi giao dịch của bạn trên blockchain. 5.1. Ký giao dịch Dưới đây là một chức năng ví dụ tinh chỉnh ký giao dịch với ngân sách gas được chỉ định: const signSuiTransaction = async (requestParams: SignRequestParams): Promise => { const { gasBudget, gasPrice, privateKey, coinRefs, network, recipients } = requestParams; const keypair = Ed25519Keypair.fromSecretKey(privateKey); const tx = newTransaction(); // Set up gas parameters, including the gas budget tx.setGasPayment(coinRefs); tx.setGasPrice(gasPrice); tx.setGasBudget(gasBudget); tx.setSender(keypair.toSuiAddress()); // Split coins for each recipient const coins = tx.splitCoins(tx.gas, recipients.map((transfer) => transfer.amount)); recipients.forEach((transfer, index) => { tx.transferObjects([coins[index]], transfer.to); }); // Build the transaction and sign it const client = newSuiClient({ url: getFullnodeUrl(network) }); const bytes = await tx.build({ client }); const { signature } = await keypair.signTransaction(bytes); await verifyTransactionSignature(bytes, signature, { address: keypair.getPublicKey().toSuiAddress() }); return JSON.stringify([toBase64(bytes), signature]); }; Chức năng này tích hợp tất cả các thông số cần thiết — bao gồm chi tiết gas và người nhận — đảm bảo rằng giao dịch của bạn được ký một cách an toàn và sẵn sàng để thực hiện. 5.2. Thực hiện giao dịch Sau khi ký, giao dịch được gửi đến blockchain bằng cách sử dụng điểm cuối API SUI_ExecuteTransactionBlock: curl --location 'https://fullnode.testnet.sui.io:443' \ --header 'Content-Type: application/json' \ --data '{ "jsonrpc": "2.0", "id": 1, "method": "sui_executeTransactionBlock", "params": [ "", [""], { "showInput": true, "showRawInput": true, "showEffects": true, "showEvents": true, "showObjectChanges": true, "showBalanceChanges": true }, "WaitForLocalExecution" ] }' Cuộc gọi này trả về phản hồi JSON chi tiết với thông tin như tổng hợp giao dịch, mức tiêu thụ gas, sửa đổi đối tượng và cập nhật số dư. 6. Xác minh giao dịch của bạn: Kiểm tra chÉO MỌI THỨ 🔍 Sau khi thực hiện giao dịch, điều cần thiết là phải xác minh rằng mọi thứ được thực hiện như mong đợi. 6.1. Xác minh trình duyệt Bạn có thể kiểm tra giao dịch của mình trên trình thám hiểm blockchain như Suivision Testnet Explorer. Trình khám phá hiển thị tất cả các chi tiết giao dịch ở định dạng trực quan, giúp dễ dàng phát hiện bất kỳ vấn đề nào. 6.2. Xác minh dòng lệnh Để kiểm toán chi tiết hơn, hãy sử dụng dòng lệnh: sui client tx-block -- 3FopuDy5qzKm1kLRFZCdi8Lynadym9j15NaVxzUH6nYD Lệnh này cung cấp bảng phân tích toàn diện về giao dịch, bao gồm chi tiết người gửi, thanh toán gas, thay đổi đối tượng và trạng thái thực hiện. 7. Phân tích phản hồi JSON: Hiểu các lớp của giao dịch Hãy giải nén phản hồi JSON bạn nhận được sau khi thực hiện giao dịch của mình: 7.1. Tổng quan giao dịch jsonrpc & id: Các trường tiêu chuẩn cho giao thức JSON-RPC. Digest: Mã băm giao dịch duy nhất (ví dụ: “3fOPudy5qzkm1klrfzcdi8lynadym9j15navxzuH6nyd”), được sử dụng để theo dõi. TimestampMS & checkpoint: Cung cấp ngữ cảnh về thời điểm giao dịch được thực hiện và điểm kiểm tra blockchain tại thời điểm đó. 7.2. Nội dung giao dịch Dữ liệu người gửi và khí đốt: Bao gồm địa chỉ của người gửi và tất cả các cấu hình liên quan đến khí đốt (thanh toán, giá cả, ngân sách). Hoạt động (Giao dịch): Logic giao dịch bao gồm các hoạt động như: SplitCoins: Phá vỡ một đồng xu gas thành các phần nhỏ hơn. TransferObjects: Di chuyển các phân đoạn tiền xu đến địa chỉ người nhận được chỉ định. Chữ ký: Chữ ký mật mã (mã hóa Base64) đảm bảo tính xác thực của giao dịch. 7.3. Hiệu ứng thực thi Trạng thái: Trạng thái “thành công” xác nhận rằng giao dịch đã được xử lý mà không có lỗi. Sử dụng khí đốt: Chi tiết chi phí tính toán và lưu trữ cùng với bất kỳ khoản chiết khấu áp dụng nào. Thay đổi đối tượng: Phác thảo các đối tượng đã được sửa đổi, tạo hoặc cập nhật do kết quả của giao dịch. Phụ thuộc: Liệt kê các hash giao dịch liên quan mà giao dịch này phụ thuộc vào. Sự cố chi tiết này rất cần thiết để gỡ lỗi và cải thiện hiệu suất DApp của bạn. 8. Thông tin chi tiết về nhà phát triển thực tế: Mẹo và rút ra Hiểu từng bước của quy trình này trang bị cho bạn các kỹ năng để xây dựng các ứng dụng Web3 an toàn, hiệu quả trên Sui. Những hiểu biết này không chỉ giúp bạn khắc phục sự cố mà còn giúp bạn tự tin đổi mới trong hệ sinh thái Sui.
3 - 👀 SEAL- Tôi nghĩ quyền riêng tư dữ liệu Web3 sắp thay đổiBài Viết0xduckmove135Apr 08, 2025
👀 SEAL đang phát trực tiếp trên Sui Testnet - Tôi nghĩ quyền riêng tư dữ liệu Web3 sắp thay đổi Trong Web3, người ta thường nghe các cụm từ như* “người dùng sở hữu dữ liệu của họ”* hoặc* “phi tập trung theo thiết kế”*. Nhưng khi bạn nhìn kỹ, nhiều ứng dụng vẫn dựa vào cơ sở hạ tầng tập trung để xử lý dữ liệu nhạy cảm - sử dụng các dịch vụ như AWS hoặc Google Cloud để quản lý khóa. Điều này dẫn đến một mâu thuẫn: phân cấp trên bề mặt, tập trung hóa bên dưới. Nhưng điều gì sẽ xảy ra nếu có một cách để quản lý bí mật một cách an toàn, mà không từ bỏ sự phân cấp? Giới thiệu SEAL — Quản lý bí mật phi tập trung (DSM), hiện đang hoạt động trên Sui Testnet. SEAL nhằm mục đích khắc phục một trong những đạo đức giả lớn nhất của Web3: hét lên phân quyền trong khi bí mật sử dụng AWS Bạn có thể hỏi tôi: SEAL là gì? SEAL là một giao thức cho phép bạn quản lý dữ liệu nhạy cảm một cách an toàn và** phi tập trung - được xây dựng đặc biệt cho thế giới Web3. Hãy nghĩ về nó như một lớp kiểm soát truy cập đầu tiên về quyền riêng tư được cắm vào DApp của bạn. Bạn có thể nghĩ về SEAL như một loại khóa lập trình cho dữ liệu của bạn. Bạn không chỉ khóa và mở khóa mọi thứ theo cách thủ công - bạnviết chính sách trực tiếp vào hợp đồng thông minhcủa mình**, sử dụng Move on Sui. Giả sử bạn đang xây dựng một DApp trong đó: Chỉ những người nắm giữ NFT mới có thể mở khóa hướng dẫn cao cấp Hoặc có thể DAO phải bỏ phiếu trước khi các tệp nhạy cảm được tiết lộ Hoặc bạn muốn siêu dữ liệu bị khóa thời gian và chỉ có thể truy cập sau một ngày cụ thể SEAL làm cho tất cả điều đó trở nên khả thi. Kiểm soát truy cập hoạt động * onchain*, hoàn toàn tự động, không cần quản trị viên để quản lý nó. Chỉ là logic, được nung ngay vào blockchain. SEAL làm cho tất cả điều đó trở nên khả thi. Kiểm soát truy cập hoạt động * onchain*, hoàn toàn tự động, không cần quản trị viên để quản lý nó. Chỉ là logic, được nung ngay vào blockchain. Một phần thú vị khác là cách SEAL xử lý* mã hóa. Nó sử dụng một cái gì đó được gọi là* mã hóa ngưỡng**, có nghĩa là: không một nút nào có thể giải mã dữ liệu. Cần một nhóm các máy chủ để làm việc cùng nhau - giống như multi-sig, nhưng để mở khóa bí mật. Điều này phân phối niềm tin và tránh được vấn đề một điểm thất bại thông thường. Và để giữ mọi thứ thực sự riêng tư, SEAL mã hóa và giải mã mọi thứ* ở phía máy khác*. Dữ liệu của bạn không bao giờ hiển thị cho bất kỳ phụ trợ nào. Nó nằm trong tay bạn - theo nghĩa đen - trên thiết bị của bạn. và SEAL không quan tâm bạn lưu trữ dữ liệu của mình ở đâu. Cho dù đó là IPFS, Arweave, Walrus hay một số nền tảng khác, SEAL không cố gắng kiểm soát phần đó. Nó chỉ tập trung vàoai được phép xem cái gì, chứ không phải * ở đây* mọi thứ được lưu trữ. Vì vậy, vâng, nó không chỉ là một thư viện hoặc API - nó là một lớponchain-first, được kiểm soát truy cập, bảo mật theo mặc địnhcho DApp của bạn. SEAL lấp đầy một khoảng trống khá quan trọng. Hãy chia nhỏ nó hơn một chút. Nếu bạn đang xây dựng DApp xử lý**bất kỳ dạng dữ liệu nhạy cảm nào - nội dung được kiểm soát, tài liệu người dùng, tin nhắn được mã hóa, thậm chí cả siêu dữ liệu NFT bị khóa theo thời gian - bạn sẽ gặp phải vấn đề tương tự: ➡️ Làm thế nào để bạn quản lý quyền truy cập một cách an toàn mà không cần dựa vào dịch vụ tập trung? Nếu không có một cái gì đó như SEAL, hầu hết các đội đều: Sử dụng các công cụ tập trung như AWS KMS hoặc Firebase, điều này rõ ràng đi ngược lại sự phân quyền Hoặc cố gắng tự vá các logic mã hóa nửa chừng lại với nhau, điều này thường trở nên dễ vỡ và khó kiểm tra https://x.com/EmanAbio/status/1908240279720841425?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1908240279720841425%7Ctwgr%5E697f93dc65359d0c8c7d64ddede66c0c4adeadf1%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.notion.so%2Fharryph%2FSEAL-Launches-on-Sui-Testnet-1cc4f8e09bb380969c0dcc627b96cc22 Cả hai đều không cân bằng tốt. Đặc biệt là không phải khi bạn đang cố gắng xây dựng các ứng dụng không đáng tin cậy trên nhiều chuỗi hoặc cộng đồng. SEAL làm cho toàn bộ quá trình đó trở nên mô-đun và có thể lập trình được. Bạn xác định quy tắc truy cập của mình trong hợp đồng thông minh Move và SEAL xử lý phần còn lại - tạo khóa, phê duyệt giải mã và thực thi truy cập - tất cả mà không cần bất kỳ ai cấp khóa theo cách thủ công hoặc chạy kiểm tra phụ trợ. Thậm chí tốt hơn, những quy tắc đó có thể kiểm tra và không thể thay đổi**- một khi chúng được kết nối, họ tuân theo hợp đồng, không phải là quản trị viên con người. Vì vậy, thay vì hỏi “ai nên quản lý quyền truy cập vào dữ liệu này?” bạn chỉ cần hỏi: “Logic nào nên xác định quyền truy cập?” > ... và để dây xích xử lý nó. Sạch sẽ và có thể mở rộng. Đó là những gì làm cho SEAL phù hợp với nhiều hơn là “công cụ bảo mật” - nó là lớp cơ sở cho bất kỳ DApp nào quan tâm đến quyền riêng tư, tuân thủ hoặc logic truy cập động.** Đó là một sự thay đổi nhỏ - nhưng nó thay đổi rất nhiều về cách chúng ta nghĩ về dữ liệu trong Web3. Thay vì mã hóasau triển khai hoặc dựa vào các dịch vụ bên ngoài,* bạn bắt đầu với quyền riêng tư tích hợp sẵn - và quyền truy cập được xử lý hoàn toàn bằng logic hợp đồng thông minh.* Và đó chính xác là những gì Web3 cần ngay bây giờ. SEAL thực sự hoạt động như thế nào? Chúng tôi đã đề cập đếnSEAL là gìvà* tại sao Web3 cần nó*, hãy xem nó thực sự được xây dựng như thế nào dưới mui xe. Phần này là nơi mọi thứ trở nên kỹ thuật hơn - nhưng theo một cách tốt. Kiến trúc thanh lịch khi bạn thấy tất cả các mảnh khớp với nhau như thế nào. Ở cấp độ cao, SEAL hoạt động bằng cách kết hợplogic truy cập onchainvớiquản lý khóa offchain, sử dụng một kỹ thuật gọi làMã hóa dựa trên danh tính (IBE). Điều này cho phép các nhà phát triển mã hóa dữ liệu * thành một danh tính, và sau đó dựa v��o hợp đồng thông minh để xác định *ai được phép giải mã dữ liệu đó. Bước 1: Quy tắc truy cập trong Hợp đồng thông minh (trên Sui) Mọi thứ bắt đầu với hợp đồng thông minh. Khi bạn đang sử dụng SEAL, bạn xác định một hàm gọi là seal_trong hợp đồng Move của bạn - đây là nơi bạn viết các điều kiện để giải mã. Ví dụ: đây là một quy tắc khóa thời gian đơn giản được viết trong Move: entry fun seal_approve(id: vector, c: &clock::Clock) { let mut prepared: BCS = bcs::new(id); let t = prepared.peel_u64(); let leftovers = prepared.into_remainder_bytes(); assert!((leftovers.length() == 0) && (c.timestamp_ms() >= t), ENoAccess); } Sau khi được triển khai, hợp đồng này hoạt động như người gác cổng. Bất cứ khi nào ai đó muốn giải mã dữ liệu, yêu cầu của họ sẽ được kiểm tra dựa trên logic này. Nếu nó đi qua, chìa khóa sẽ được giải phóng. Nếu không, chúng bị chặn. Không ai phải can thiệp. ##Bước 2: Mã hóa dựa trên danh tính (IBE) Đây là nơi phép thuật xảy ra. Thay vì mã hóa dữ liệu cho một địa chỉ ví cụ thể (như với PGP hoặc RSA), SEAL sử dụng* chuỗi danh tính*- nghĩa là bạn mã hóa thành một cái gì đó như: Địa chỉ 0xwalletaddress dao_bỏ phiếu: proposal_xyz PKGID_2025_05_01 (quy tắc dựa trên dấu thời gian) hoặc thậm chí game_user_nft_holder Khi dữ liệu được mã hóa, nó trông như thế này: Encrypt(mpk, identity, message) mpk = khóa công khai chính (mọi người đều biết đến) danh tính = người nhận được xác định logic tin nhắn = dữ liệu thực tế Sau đó, nếu ai đó muốn giải mã, máy chủ khóa sẽ kiểm tra xem họ có khớp với chính sách hay không (thông qua cuộc gọi seal_approbe onchain). Nếu nó được chấp thuận, nó sẽ trả về khóa riêng có nguồn gốc cho danh tính đó. Derive(msk, identity) → sk Decrypt(sk, encrypted_data) Người dùng sau đó có thể giải mã nội dung cục bộ. Vì vậy, mã hóa được thực hiện mà không cần phải biết ai sẽ giải mã trước thời hạn. Bạn chỉ cần xác định các điều kiện* và SEAL sẽ tìm ra phần còn lại sau. Nó năng động. ##Bước 3: Máy chủ chìa khóa - Offchain, nhưng không tập trung hóa Bạn có thể tự hỏi: ai đang giữ các phím chính này? Đây là nơi* Máy chủ chínhcủa SEAL*xuất hiện. Hãy nghĩ về nó như một backend mà: Giữ khóa bí mật chính (msk) Xem các hợp đồng trên chuỗi (như logic seal_approbe của bạn) Chỉ phát hành các khóa có nguồn gốc nếu các điều kiện được thỏa mãn Nhưng - và đây là chìa khóa - SEAL không chỉ dựa vào * một* máy chủ chìa khóa. Bạn có thể chạy nó ở chế độ người**, trong đó nhiều máy chủ độc lập cần phải đồng ý trước khi khóa giải mã được phát hành. Ví dụ: 3 trong 5 máy chủ chìa khóa phải chấp thuận yêu cầu. Điều này tránh các điểm thất bại trung tâm và cho phép phân cấp ở tầng quản lý chính. Thậm chí tốt hơn, trong tương lai SEAL sẽ hỗ trợMPC (tính toán đa bên) vàthiết lập dựa trên enclave(như TEE) - vì vậy bạn có thể nhận được sự đảm bảo mạnh mẽ hơn mà không ảnh hưởng đến khả năng sử dụng. ##Bước 4: Giải mã phía máy khác Khi khóa được trả lại cho người dùng, quá trình giải mã thực tế sẽ xảy ratrên thiết bị của họ. Điều này có nghĩa là: Máy chủ không bao giờ nhìn thấy dữ liệu của bạn Phần phụ trợ không bao giờ lưu trữ nội dung được giải mã Chỉ người dùng mới có thể truy cập tin nhắn cuối cùng Đó là một mô hình riêng tư vững chắc. Ngay cả khi ai đó xâm phạm lớp lưu trữ (IPFS, Arweave, v.v.), họ vẫn không thể đọc dữ liệu mà không truyền logic truy cập. Đây là mô hình tinh thần nhanh chóng: Cấu trúc này giúp dễ dàng xây dựng DApps nơi các quy tắc truy cập không được mã hóa cứng - chúng động, có thể kiểm tra và được tích hợp đầy đủ vào logic chuỗi của bạn. ##* Đội ngũ đằng sau SEAL* SEAL được dẫn dắt bởi* Samczsun*, một nhân vật nổi tiếng trong cộng đồng bảo mật blockchain. Trước đây là Đối tác Nghiên cứu tại Paradigm, ông đã kiểm toán và cứu nhiều hệ sinh thái khỏi những khai thác lớn. Giờ đây, anh ấy tập trung toàn thời gian vào việc xây dựng SEAL thành một phần cốt lõi của cơ sở hạ tầng quyền riêng tư của Web3. Với nền tảng và uy tín của mình, SEAL không chỉ là một công cụ thử nghiệm khác - đó là một nỗ lực nghiêm túc trong việc làm cho quyền riêng tư dữ liệu phi tập trung trở nên thiết thực và có thể mở rộng. Khi SEAL được phát hành trên Sui Testnet, nó mang đến một tiêu chuẩn mới về cách các ứng dụng Web3 có thể quản lý bí mật. Bằng cách kết hợp kiểm soát truy cập onchain, mã hóa ngưỡng và quyền riêng tư phía máy khách, SEAL cung cấp một nền tảng đáng tin cậy hơn cho việc xử lý dữ liệu phi tập trung. Cho dù bạn đang xây dựng DApps, DAO hay trò chơi phi tập trung - SEAL cung cấp một bộ công cụ mạnh mẽ để thực thi kiểm soát truy cập và bảo vệ dữ liệu người dùng mà không ảnh hưởng đến phân quyền. Nếu Web3 sẽ tiến về phía trước, cơ sở hạ tầng an toàn như SEAL không phải là tùy chọn - đó là điều cần thiết
4 - Step by step guide to create a Suiet walletBài ViếtLokie13Mar 16, 2025
Step by step guide to create a Suiet wallet: Download suiet extension: https://suiet.app/ After successful installation, click on the Suiet icon in your browser and select "Create New". Set a strong password to protect your wallet. Write down and save your recovery phrase in a safe place. This phrase is needed to recover your wallet if needed Done
1 - Hành trình với tư cách là nhà phát triển hợp đồng thông minh SUI MoveBài ViếtBahador85Mar 15, 2025
Trong bài viết hôm nay, tôi muốn đi sâu vào gợi ý lộ trình cho những ai thích tham gia vào cách phát triển di chuyển SUI. 1. Hiểu các nguyên tắc cơ bản về Blockchain Khái niệm cốt lõi:* Làm quen với các khái niệm blockchain chính như phân cấp, cơ chế đồng thuận, nguyên thủy mật mã và hợp đồng thông minh. Tổng quan về Blockchain SUI:* Tìm hiểu về những gì làm cho SUI trở nên độc đáo — mô hình dữ liệu lấy đối tượng làm trung tâm, mục tiêu hiệu suất và cách nó xử lý quản lý trạng thái. 2. Học ngôn ngữ di chuyển Khái niệm cơ bản về ngôn ngữ:* Bắt đầu với các nguyên tắc cơ bản của ngôn ngữ lập trình Move. Tập trung vào: Các loại tài nguyên:* Cách thức hoạt động của các nguồn lực để đảm bảo an toàn và quyền sở hữu. Mô-đun và cấu trúc:* Cách xác định mô-đun và cấu trúc dữ liệu. Chức năng nhập cảnh:* Cách thực hiện giao dịch thông qua các điểm nhập được chỉ định. Tài nguyên được đề xuất: Sử dụng các hướng dẫn ngôn ngữ Move chính thức, tài liệu và kho lưu trữ mã mẫu. 3. Thiết lập môi trường phát triển của bạn Công cụ và CLI:* Cài đặt SUI CLI và thiết lập Chuỗi công cụ Move trên máy cục bộ của bạn. Môi trường kiểm tra cục bộ:* Định cấu hình mạng phát triển SUI cục bộ hoặc sử dụng các mạng thử nghiệm có sẵn. Điều này giúp bạn thử nghiệm triển khai và thử nghiệm hợp đồng thông minh trước khi đi vào hoạt động. IDE & Gỡ lỗi:* Chọn một môi trường phát triển tích hợp (IDE) hỗ trợ Move (ví dụ: VSCode với phần mở rộng Move) và làm quen với việc gỡ lỗi và kiểm tra hợp đồng của bạn. 4. Xây dựng hợp đồng đơn giản đầu tiên của bạn Hướng dẫn thực hành:* Bắt đầu với một dự án đơn giản như hợp đồng token. Điều này sẽ cho phép bạn áp dụng các cấu trúc Move cơ bản. Khám phá các mẫu dành riêng cho SUI:* Làm việc với mô hình đối tượng của SUI và tìm hiểu cách xử lý các giao dịch trong hệ sinh thái SUI. Tài liệu & Ví dụ:* Tận dụng tài liệu dành cho nhà phát triển của SUI và các dự án mẫu để hiểu các phương pháp hay nhất. 5. Tìm hiểu sâu về các tính năng dành riêng cho SUI Mô hình lấy đối tượng làm trung tâm:* Hiểu cách SUI đối xử với các đối tượng khác với các blockchain dựa trên tài khoản như Ethereum. Mô hình giao dịch và khí đốt:* Nghiên cứu cách tính phí gas và cách quản lý việc thực hiện giao dịch trong SUI. Quản lý nhà nước:* Tìm hiểu về cách tiếp cận của SUI đối với lưu trữ trạng thái, cập nhật mô-đun và quản lý vòng đời đối tượng. 6. Kiểm tra, gỡ lỗi và triển khai Kiểm tra đơn vị và tích hợp:* Viết các bài kiểm tra để xác minh tính logic và an toàn của hợp đồng thông minh của bạn. Đảm bảo bạn che đậy các trường hợp cạnh tranh và các lỗ hổng tiềm ẩn. Triển khai cục bộ và Testnet:* Triển khai hợp đồng của bạn trong một môi trường được kiểm soát để xem chúng hoạt động như thế nào trong điều kiện thực tế. Dụng cụ:* Sử dụng các công cụ gỡ lỗi và tính năng ghi nhật ký của SUI để lặp lại và cải thiện mã của bạn. 7. Thực tiễn tốt nhất về bảo mật và kiểm toán mã Hiểu những cạm bẫy phổ biến:* Nghiên cứu các lỗ hổng bảo mật phổ biến trong hợp đồng thông minh (ví dụ: tái nhập cảnh, kiểm soát truy cập không phù hợp) và cách thiết kế của Move giảm thiểu chúng. Đánh giá mã:* Tham gia đánh giá mã cộng đồng hoặc cộng tác với các đồng nghiệp để kiểm tra và cải thiện mã của bạn. Xác minh chính thức:* Khám phá bất kỳ công cụ xác minh chính thức nào có sẵn cho Move để chứng minh tính chính xác của hợp đồng của bạn một cách toán học. 8. Tham gia Cộng đồng nhà phát triển SUI Kênh cộng đồng:* Tương tác với các nhà phát triển khác thông qua diễn đàn, kênh Discord hoặc cuộc gọi cộng đồng. Chia sẻ kinh nghiệm và thách thức là vô giá. Đóng góp nguồn mở:* Đóng góp cho các dự án mã nguồn mở hoặc kho lưu trữ dành cho nhà phát triển liên quan đến SUI và Move. Luôn cập nhật:* Theo dõi các blog SUI và Move, kho lưu trữ GitHub và các kênh truyền thông xã hội để theo dõi những phát triển mới, cập nhật và thực tiễn tốt nhất. 9. Khám phá các chủ đề nâng cao Ứng dụng phức tạp:* Khi bạn trở nên thoải mái hơn, hãy thử nghiệm các thiết kế hợp đồng thông minh tiên tiến hơn như giao thức tài chính phi tập trung (DeFi), NFT hoặc ví đa chữ ký. Khả năng tương tác và tích hợp:* Tìm hiểu cách tương tác với các hợp đồng thông minh khác và tích hợp các mô-đun SUI Move với các hệ thống ngoài chuỗi. Hiệu suất và khả năng mở rộng:* Khám phá các kỹ thuật để tối ưu hóa hợp đồng của bạn về tốc độ và hiệu quả chi phí trên blockchain SUI. 10. Xây dựng một danh mục đầu tư và tiếp tục thực hành Các dự án trưng bày:* Phát triển và ghi lại một loạt các dự án thể hiện sự hiểu biết và chuyên môn của bạn. Học liên tục:* Blockchain và Move đang phát triển nhanh chóng — biến việc học liên tục thành thói quen bằng cách xem lại tài liệu, tham dự các hội thảo và tham gia vào các hackathons. Vòng phản hồi:* Sử dụng phản hồi của cộng đồng để tinh chỉnh kỹ năng của bạn và đi trước trong việc phát triển hợp đồng thông minh. Mặc dù các mục trên là gợi ý và không phải là cách duy nhất để biến thành một nhà phát triển SUI, tôi hy vọng nó hữu ích cho các bạn. Mã hóa vui vẻ. Chúc mừng kiện!
2 - Setting Up a Project to Test the SUI Name Service (SuiNS)Bài Viết0xduckmove135Mar 12, 2025
The SUI Name Service (SuiNS) is a decentralized naming system on the SUI blockchain that allows users to map human-readable names (e.g., "0xduck.sui") to blockchain addresses or other data, enhancing usability and accessibility. For developers, testing the SuiNS SDK is an essential step to ensure applications can resolve these names correctly. In this article, we’ll walk you through the process of setting up a project to test the SuiNS SDK, from preparing your development environment to querying a name record like "0xduck.sui" and understanding the results. Introduction to SUI Name Service The SUI Name Service (SuiNS) simplifies blockchain interactions by allowing users to register memorable names instead of using complex cryptographic addresses. For example, instead of sending tokens to "0x1234...abcd", you could send them to "0xduck.sui". Testing the SuiNS SDK ensures that your application can correctly interact with this system, retrieving and interpreting name records as needed. In this project, we’ll set up a Node.js environment, connect to the SUI mainnet, and write a script to query the name record for "0xduck.sui". By the end, you’ll have a working setup to explore SuiNS further. Prerequisites Before starting, ensure you have the following: Node.js (version 14 or higher) and npm (version 6 or higher) installed. Download them from nodejs.org if needed. Basic understanding of JavaScript, particularly asynchronous programming (e.g., async/await). A code editor like Visual Studio Code (VS Code) for writing and running scripts. An internet connection to install packages and connect to the SUI. Setting Up the Development Environment Let’s create a new project directory and initialize it as a Node.js project. This will provide a clean workspace for our test. Step-by-Step Instructions: Open your terminal (e.g., Command Prompt, PowerShell, or a Unix shell). Create a new directory: mkdir suins-test-project cd suins-test-project Initialize a Node.js project: Run this command to create a package.json file with default settings: npm init -y Your project is now set up with a basic structure. Installing Dependencies Run the following in your terminal: npm install @mysten/suins @mysten/sui Verify the Installation: Check that the packages are added to package.json under dependencies. You can also confirm the installed versions by running: npm list @mysten/suins @mysten/sui This should output something like: suins-test-project@1.0.0 ├── @mysten/sui@x.x.x └── @mysten/suins@y.y.y Configuring the SUI Client The SUI client connects your project to the SUI blockchain. For testing, we’ll use the mainnet. Create a Script File: In your project directory, create a file named test-suins.js: touch test-suins.js # On Unix/macOS echo. > test-suins.js # On Windows Open test-suins.js in your editor and add the following: import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; // Create a SUI client connected to the testnet const suiClient = new SuiClient({ url: getFullnodeUrl('testnet') }); Note: If you encounter an error about ES modules (e.g., "Cannot use import statement outside a module"), add "type": "module" to your package.json: { "name": "suins-test-project", "version": "1.0.0", "type": "module", ... } Testing the Name Service Now, let’s write a script to query the name record for "0xduck.sui" and log the result. import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; import { SuinsClient } from '@mysten/suins'; // Create a SUI client connected to the testnet // const suiClient = new SuiClient({ url: getFullnodeUrl('mainnet') }); const client = new SuiClient({ url: getFullnodeUrl('mainnet') }); // Create a SuiNS client using the SUI client const suinsClient = new SuinsClient({ client, network: 'mainnet', }); // Function to test the name service async function testNameService() { try { // Query the name record for 'demo.sui' const nameRecord = await suinsClient.getNameRecord('0xduck.sui'); // Log the result console.log('Name Record for "0xduck.sui":', nameRecord); } catch (error) { console.error('Error fetching name record:', error.message); } } testNameService(); In your terminal, execute: node test-suins.js
3 - Suibase, a great tool to experience the SUIBài ViếtBahador85Mar 11, 2025
As I was checking some resources for the SUI development, I faced a tool named, suibase. In my exploration on that, I found it very helpful, especially when using localnet which a local explorer will be set up on our local system. I loved it so much. as there is stated in the official website of Suibase: Suibase makes it easy to create "workdirs", each defining a distinct development environment targeting a network. It seems like virtual env in python programming. As far as I found this tool, there are many usefull functionalities which we can take benefit of: Key functionalities of Suibase include: Workdir Management: Suibase enables the creation of isolated workdirs for each network, ensuring that configurations and dependencies are maintained separately. This isolation facilitates organized and efficient development workflows. Suibase Simplified Command-Line Interface:* The tool provides scripts such as lsui, dsui, tsui, and msui, which serve as frontends to the Mysten Labs sui binaries for localnet, devnet, testnet, and mainnet, respectively. These scripts eliminate the need to manually switch environments, as they automatically execute the appropriate sui client and keystore for the targeted network. Localnet Operations:* Suibase offers commands like localnet start, localnet stop, and localnet status to manage the local network. Additionally, the localnet regen command allows developers to reset the network to its initial state, complete with predefined addresses and aliases, which is particularly useful for testing purposes. Faucet Functionality:* The localnet faucet command enables the distribution of Sui coins to specified addresses or all addresses within the localnet, facilitating testing and development activities. Independent Installation:* Suibase operates independently of other Mysten Labs installations and keystores, ensuring that it does not interfere with existing setups. This design allows Suibase to coexist safely with standard installations on the same system. By providing these features, Suibase enhances the development experience on the Sui network, offering a structured and efficient environment for building and testing applications. I recommend testing it!
3 - How to fix the SUI installation error?Bài ViếtBahador85Mar 11, 2025
When I try to install and build the SUI binary on my local system with this command: cargo install --git https://github.com/MystenLabs/sui.git --bin sui --branch devnet I face this error: Please specify a package, e.g. cargo install --git https://github.com/MystenLabs/sui.git anemo-benchmark. After some digging, I found the solution and was able to install and build it error-free and completely using some modification in the above command: For Devnet: cargo install --locked --git https://github.com/MystenLabs/sui.git sui --branch devnet For Testnet: cargo install --locked --git https://github.com/MystenLabs/sui.git sui --branch devnet This way, you can install and build SUI on your local machine and start on your way! Best of luck.
3
Bài viết
203- Thảo LuậnRamirez118Apr 14, 2025
Rắc rối với việc không đặt cọc và hoán đổi trên ví SUI
Này mọi người, tôi đang sử dụng Ví SUI và gặp một chút kẹt xe. Tôi đã đặt cược SUI của mình vào AfSui (đặt cược lỏng), nhưng bây giờ khi tôi nhấn nút unstake, nó chỉ tiếp tục tải và không có gì xảy ra. Thay vào đó, đã thử hoán đổi trở lại SUI và gặp lỗi: 'Tính toán không thành công Không tìm thấy nhà cung cấp dịch vụ hoán đổi nào. ' Tiền của tôi dường như bị bế tắc. Đã thử cài đặt lại ứng dụng và kiểm tra số dư phí xăng của tôi, nhưng không may mắn. Có lời khuyên nào về cách khắc phục điều này?
- Sui
- Architecture
02 - Thảo Luậnfarshad129Apr 14, 2025
Làm thế nào để truy cập Sui Wallet nếu được tạo qua Google hoặc ZKLogin?
Tôi đã thiết lập Ví Sui của mình bằng Google, nhưng tôi không thể tìm thấy cụm mật khẩu hoặc khóa riêng. Làm cách nào để truy cập ví của mình và đảm bảo địa chỉ của tôi luôn giống nhau?
- Sui
02 - Thảo Luậnderiss154Apr 13, 2025
Tôi có thể xem ví Sui phần cứng của mình trong Phantom không?
Tôi đang cố gắng xem ví Sui của mình được thiết lập trên ví phần cứng bằng Phantom. Tuy nhiên, có vẻ như chỉ những ví không phải phần cứng mới xuất hiện trong Phantom. Làm cách nào để làm cho ví Sui phần cứng của mình xuất hiện trong ứng dụng Phantom nếu có thể?
- Security Protocols
01 - Bài ViếtApr 13, 2025
Cơ chế kiểm soát và nhận truy cập đối tượng
Đây là phần 2 của loạt “Đối tượng cha mẹ-con trong Sui Move”. Bạn có thể đọc phần 1 tại đây Chuyển giao kiểm soát truy cập đối tượng: :nhận Cơ chế Vì vậy, bạn đã đặt một đối tượngXbên trongPcha mẹ (bằng cách chuyển X sang ID của P) - làm thế nào để bạn lấy nó ra hoặc sử dụng nó? 🤔 Đó là nơi cơ chế nhận đặc biệt của Sui xuất hiện. Khi một đối tượng được chuyển đến cha mẹ, nó không tự động bật ra. Nó nằm ở đó, thuộc sở hữu củaP. Để * sử dụng* hoặc* hoặc* đối tượng con đó trong một giao dịch, bạn phảinhậnnó. Sui cung cấp một cách có cấu trúc để thực hiện việc này bằng cách sử dụng **Nhận vé và chức năng chuyển: :nhận. ##Vé nhận tiên Hãy nghĩ về Nhận như một phiếu yêu cầu cho một đối tượng con thuộc loại T. Trong một giao dịch, thay vì chuyển trực tiếp đối tượng con (mà bạn chưa sở hữu) cho một hàm, bạn chuyển một Receiving - về cơ bản là tham chiếu đến “đối tượng có ID Y thuộc sở hữu của cha mẹ X”. Nhận này là một cấu trúc Move đặc biệt mang ID, phiên bản và bản phân tích của đối tượng được nhận. Nó chỉ có khả năng thả, nghĩa là nó có thể tồn tại phù du nhưng không thể được lưu trữ liên tục. Nói cách khác, đó là một vé sử dụng một lần trong một giao dịch. Làm thế nào để bạn nhận được một nhận? Thông thường, bằng cách thực hiện chuyển nhượng. Trong khối giao dịch có thể lập trình (PTB), một bước có thể chuyển đối tượngCsangPcha mẹ, tạo ra phiếu nhận mà bước tiếp theo có thể sử dụng. Nếu đứa trẻ đã ngồi trong vai cha mẹ từ một giao dịch trước đó, bạn có thể cung cấp Thông tin nhận làm đầu vào cho một giao dịch mới (Sui SDK/CLI cho phép bạn chỉ định đối tượng con bằng ID và cha mẹ của nó để tạo vé). Quan trọng: Bản thân việc tiếp nhận không phải là đối tượng - nó chưa cho bạn quyền sở hữu. Nó chỉ báo hiệu rằng “đối tư��ng loại T với ID này thuộc sở hữu của cha mẹ đó, và tôi dự định lấy nó.” Để thực sự lấy đối tượng, bạn phải gọi transfer: :receiver: module example::toy_box { use sui::transfer::{Self, Receiving}; struct Toy has key { id: UID, name: vector } struct Box has key { id: UID } /// Remove a Toy child from a Box, returning the Toy to the caller. public entry fun take_toy(box: &mut Box, toy_ticket: Receiving): Toy { // Use the parent's UID and the Receiving ticket to get the Toy let toy = transfer::receive(&mut box.id, toy_ticket); // Now toy is an owned value we can return (or transfer to someone). toy } } Trong take_toy, toy_ticket: Receiving đại diện cho Toy thuộc về hộp. Bằng cách gọi transfer: :receiver (&mut box.id, toy_ticket), chúng ta gọi logic gốc của Sui để thực sự lấy đối tượng Toy ra khỏi hộp. Điều này làm một số điều quan trọng: Nó* xác nhận*khi chạy rằng toy_ticket thực sự tham chiếu đến một đối tượng hiện thuộc sở hữu của hộp (sử dụng UID của cha mẹ). Nếu một cái gì đó không khớp (nhầm cha mẹ hoặc đối tượng không thực sự ở đó), nó sẽ bị hủy bỏ. Sau đó, nó trả về đối tượng Toy thực tế dưới dạng giá trị sở hữu trong giao dịch, nghĩa là bây giờ Đồ chơi nằm trong tầm kiểm soát của hàm của chúng tôi. Lưu ý rằng chúng tôi phải chuyển qua &mut box.id. Sui thực thi rằng chúng tôi có một tham chiếu có thể thay đổi đến UID của phụ huynh**để nhận cuộc gọi. Đây là một điều khiển truy cập thông minh: chỉ mô-đun có thể tạo ra & mut UID của cha mẹ mới có thể cho phép nhận. Thông thường, mô-đun định nghĩa của kiểu cha mẹ sẽ hiển thị một hàm như take_toy mà các cuộc gọi nội bộ nhận được. Nếu mô-đun cha không hiển thị bất kỳ hàm nào cung cấp UID & mut (trực tiếp hoặc gián tiếp), thì không mã bên ngoài nào có thể lấy con của nó. Bằng cách này, mô-đun của phụ huynh kiểm soát cách thức và thời điểm trẻ em có thể được truy cập. Trong ví dụ, Box có trường id: UID. Vì take_toy nằm trong cùng một mô-đun, nó có thể mượn &mut box.id. Các mô-đun hoặc giao dịch bên ngoài có thể gọi take_toy (box_obj, ticket) nhưng chúng không thể tự gọi transfer: :receiver trên Box vì box.id là riêng tư. Mẫu này đảm bảo chỉ mã được ủy quyền mới có thể truy xuất trẻ em.✅ Còn đối tượng lồng nhau thì sao? Nếu Toy theo nghĩa đen là một cánh đồng bên trong Hộp (ví dụ Box {id, toy: Toy}), chúng tôi sẽ không cần bất kỳ nhận nào - đồ chơi sẽ có thể truy cập bất cứ khi nào bạn có & mut Box. Nhưng điều đó cũng có nghĩa là loại bỏ nó hoặc xử lý nó một cách riêng biệt khó hơn (nó giống như một phần của hộp). Với các đồ vật trẻ em, chúng tôi tách bộ lưu trữ: đồ chơi tách biệt và phải được lấy ra một cách rõ ràng. Sự rõ ràng này là lý do tại sao Sui yêu cầu vé nhận và nhận cuộc gọi - điều này khiến việc lấy trẻ trở thành một hành động được ủy quyền. Yêu cầu tham chiếu có thể thay đổi: Bạn có thể tự hỏi, tại sao &mut UID chứ không chỉ &UID? Có thể thay đổi đảm bảo cha mẹ bị khóa trong quá trình nhận, ngăn chặn sửa đổi đồng thời và đảm bảo người gọi thực sự có quyền sửa đổi cha mẹ đó (thường ngụ ý rằng họ là chủ sở hữu). Đó là một phần của kiểm tra quyền sở hữu năng động của Sui - bằng cách nhận một khoản vay có thể thay đổi từ UID của cha mẹ, Sui đảm bảo không có giao dịch hoặc hành động song song nào khác có thể can thiệp trong khi bạn rút đứa trẻ ra. Nó giống như khóa cửa của cha mẹ trước khi loại bỏ nội dung. Ví dụ sử dụng trong khối giao dịch: Giả sử một đối tượng Box thuộc sở hữu của Alice, và cô ấy có một đối tượng Toy mà cô ấy muốn đặt vào hộp và sau đó có thể xảy ra Hãy lấy nó ra sau. Đây là cách nó có thể lặn k: Đính kèm đồ chơi vào hộp:** Alice gọi chuyển: :public_transfer (toy, @); trong PTB. Điều này chuyển đồ chơi dưới hộp (chúng tôi sử dụng public_transfer ở đây vì đó là bối cảnh giao dịch - sẽ sớm biết thêm về điều đó). Bây giờ đồ chơi là một đứa trẻ của hộp. -Trong cùng một giao dịch hoặc một giao dịch khác, truy xuất đồ chơi: Alice gọi example: :toy_box: :take_toy (box_obj,) trong đó Receiving đề cập đến đồ chơi. Dưới mui xe, take_toy gọi nhận, xác minh mối quan hệ và trả về Toy. Bây giờ Toy sẽ là đầu ra của giao dịch, thường kết thúc trở lại dưới địa chỉ của Alice (vì chúng tôi trả về nó từ một hàm nhập). Những điểm rút ra chính: Các đối tượng con không thể truy cập được theo mặc định; bạn cần vé nhận và chức năng thích hợp để đưa chúng ra. Mô-đun của cha mẹ quyết định cách bạn có thể truy xuất (bằng cách cung cấp một hàm với & mut UID). transfer: :receiver được sử dụng * trong mô-đun xác định của cha đẹ* cho các đối tượng của mô-đun đó hoặc bạn bè của nó. Nếu loại của đứa trẻ được định nghĩa ở nơi khác, bạn sẽ cần một cách tiếp cận khác (nhập public_receiver...). Trước khi tiếp tục, một chi tiết nữa: nếu một đối tượng loại T chỉ có khả năng khóa (không có cửa hàng), Sui coi nó như bị hạn chế hơn một chút. Các đối tượng như đó* không thể nhận được bằng mã chung bên ngoài mô-đun của chúng. Trong thực tế, điều này có nghĩa là nếu T chỉ có khóa và trở thành con, bạn sẽ cần xử lý việc truy xuất nó trong mô-đun riêng của nó hoặc mô-đun của cha mẹ bằng một quy tắc tùy chỉnh. Nếu T cũng có cửa hàng, chúng tôi có tính linh hoạt hơn thông qua public_receiver. Chúng ta hãy khám phá điều đó tiếp theo.
- Sui
2 - Thảo Luậnhohm58Apr 12, 2025
Làm cách nào để giải quyết các vấn đề với việc giao vòi trên tác vụ X?
Tôi đang cố gắng lấy vòi, nhưng nó không hoạt động thông qua các nhiệm vụ X. Tôi thậm chí đã thử truy cập nó thông qua một liên kết được đề xuất, nhưng tôi tiếp tục được chuyển hướng trở lại tác vụ X, nơi nó tiếp tục thất bại. Có ai biết làm thế nào tôi có thể nhận vòi thành công không?
- Sui
02 - Bài ViếtApr 12, 2025
✏️ Đối tượng phụ huynh-con trong Sui Move
Trong Sui Move, các đối tượng có thể sở hữu các đối tượng khác giống như các đối tượng của tài khoản. Điều này mở ra các mẫu thiết kế mới (và một vài điểm) cho các nhà phát triển. Trong hướng dẫn này, tôi sẽ chia nhỏ các khái niệm đối tượng cha mẹ-con trong Sui Move thành bốn phần: 1.* Giới thiệu về khái niệm cha mẹ-con cái trong Sui Move* 2.* Cơ chế kiểm soát truy cập đối tượng* 3.* Quản lý con chênh lệch mô-đun với public_receive* 4.* Logic ràng buộc linh hồn và mô hình nhận trả lời* Cuối cùng, bạn sẽ hiểu cách tổ các đối tượng, truy xuất các đối tượng con thông qua transfer: :receiver, quản lý con trên các mô-đun với public_receiver và thậm chí tạo các đối tượng liên kết với linh hồn mà boomerang trở lại chủ sở hữu của chúng. Giới thiệu về các khái niệm cha mẹ-con cái trong Sui Move ###Đối tượng cha mẹ và con là gì? Ở Sui, mọi đối tượng đều có một ID duy nhất và một * chủ sở hữu. Thông thườngchủ sở hữu là một địa chỉ*(giống như tài khoản của người dùng), nhưng chủ sở hữu cũng có thể là một đối tượng khác. Nếu đối tượng A sở hữu đối tượng B, ta gọi A là cha mẹ và B là con. Đứa trẻ thuộc sở hữu của đối tượng chứ không phải thuộc sở hữu địa chỉ. Chuyển sang các đối tượng: Sui không thực sự phân biệt giữa địa chỉ và ID đối tượng dưới mui xe - cả hai chỉ là định danh 32 byte Điều này có nghĩa là bạn có thể chuyển một đối tượng sang ID của đối tượng khác giống như cách bạn chuyển đến địa chỉ của người dùng. Khi bạn làm điều này, bạn đang lồng một đối tượng bên trong đối tượng cha một cách hiệu quả. Thời gian chạy của Sui đặt trường chủ sở hữu của con thành ID của cha mẹ (thay vì địa chỉ) Vậy tại sao điều này lại tuyệt? Bởi vì đứa trẻ giữ ID duy nhất của riêng mình và tồn tại độc lập trong bộ nhớ, nhưng bây giờ nó được gắn với cha mẹ. Nó giống như tặng bạn của bạn một bộ sưu tập độc đáo để giữ trong tủ của họ - bộ sưu tập giữ ID của nó và có thể được theo dõi, nhưng tủ khóa của bạn bạn của bạn bây giờ được liệt kê là chủ sở hữu của nó. Điều quan trọng là phải phân biệt các đối tượng độc đáo so với đối tượng lồng nhau so với đối tượng con:** Đối tượng duy nhất (thuộc sở hữu địa chỉ) :**Một đối tượng thông thường thuộc sở hữu của một địa chỉ (ví dụ: tài khoản của người dùng). Đây là trường hợp mặc định - hãy nghĩ đến NFT, tiền xu, v.v., sống trực tiếp trong ví của người dùng. Mỗi loại có một ID duy nhất và là cấp cao nhất trong bộ nhớ. Đối tượng lồng nhau (Wrapped):* Một đối tượng được lưu trữ *bên trong dữ liệu của đối tượng khác (ví dụ, dưới dạng trường trong cấu trúc). Trong trường hợp này, đối tượng bên trong là bàn và* không*là một thực thể cấp cao nhất riêng biệt. Nó không hiển thị theo ID của nó trong bộ nhớ toàn cầu vì nó là một phần của nội dung byte của cha mẹ. Trong Tùy, nếu bạn đặt một vật như một cánh đồng trong một vật khác mà không cần xử lý đặc biệt, nó sẽ bị quấn. Đối tượng con (Đối tượng thuộc sở hữu của đối tượng) :*Một đối tượng thuộc sở hữu của đối tượng khác nhưng không được gói trực tiếp trong các trường của nó. Con vẫn là một đối tượng cấp cao nhất riêng biệt trong bộ nhớ (với ID và dữ liệu riêng) và ID của cha mẹ được ghi lại với tư cách là chủ sở hữu trong siêu dữ liệu của trẻ. Điều này có nghĩa là bạn có thể* truy vấn hoặc truy cập đứa trẻ bằng ID của nó (với các quyền phù hợp). Nó không được nhúng vào nội dung của cha mẹ, chỉ được sở hữu một cách hợp lý. Sử dụng sự tương tự của chúng tôi, nó giống như bạn đã đưa cho bạn mình bộ sưu tập của mình để giữ - nó vẫn được gắn thẻ riêng lẻ và có thể theo dõi, chỉ được lưu trữ trong tủ khóa của họ. Lợi ích của việc tạo một đối tượng con (thông qua chuyển khoản) thay vì gói nó là ID của trẻ vẫn có thể truy cập bên ngoài. Ví dụ: trình thám hiểm hoặc ví có thể liệt kê một đối tượng con theo ID, trong khi một đối tượng được gói lại không thể nhìn thấy bên ngoài đối tượng cha của nó. Các đối tượng con cũng duy trì ID ổn định ngay cả khi chúng di chuyển giữa các chủ sở hữu hoặc lồng vào các bố mẹ khác nhau. Điều này rất phù hợp với những thứ như hàng tồn kho trên chuỗi hoặc mẫu “ví bên trong ví”, nơi bạn muốn đối tượng container chứa nhiều mặt hàng mà những người khác vẫn có thể tham khảo riêng lẻ Quyền sở hữu và quyền truy cập: Nếu một đối tượng thuộc sở hữu của đối tượng khác, chỉ chủ sở hữu của cha mẹ thường có thể truy cập hoặc sử dụng con Đây là một hình thức ủy quyền động. Ví dụ, nếu Alice sở hữu một đối tượng cha mẹ P và P sở hữu con C, thì chỉ Alice (hoặc các giao dịch mà Alice ký) mới có thể thao túng C. Sui thực thi điều này để sở hữu một phụ huynh giống như giữ chìa khóa cho tất cả các con của nó 🔑. Có thể bạn biết: Tính năng chuyển sang đối tượng của Sui về cơ bản mang lại cho chúng ta* quyền sở hữu đối tượng giống như cây cốc*. Cha mẹ có thể có nhiều con (và những đứa trẻ đó có thể có con riêng, tạo thành một hệ thống phân cấp). Điều này được thực hiện bằng cách xử lý ID đối tượng như địa chỉ để chuyển. Chúng tôi có: Đối tượng thuộc sở hữu địa chỉ**(đối tượng duy nhất bình thường), Đối tượng thuộc sở hữu đối tượng**(đối tượng con, vẫn ở cấp cao nhất nhưng gắn với cha mẹ), Các đối tượng được gói cảng**(lồng bên trong dữ liệu của đối tượng khác, không phải cấp cao nhất). Trong các bài viết tiếp theo, chúng ta sẽ xem cách thực sự truy xuất hoặc tương tác với các đối tượng con (vì chúng không thể truy cập trực tiếp như các đối tượng thuộc sở hữu địa chỉ) và cách thực thi các quy tắc xung quanh chúng.
- Sui
- Move
3 - Hỏi đáp Chuyên Giatomek174Apr 11, 2025
Tại sao tôi bị tính phí bởi suicoins nhưng mã thông báo không được tạo?
Tôi đã sử dụng suicoins.com để tạo mã thông báo, tính phí cho tôi 2 SUI, nhưng mã thông báo không tạo ra như mong đợi. Ngoài ra, nó xuất hiện dưới một phần không được công nhận. Làm thế nào tôi có thể giải quyết vấn đề này và logo có hiển thị trên dexscreen mà không nhận dạng không?
- Sui
02 - Hỏi đáp Chuyên GiaMichelle 69Apr 10, 2025
Tại sao ví bot giao dịch của tôi lại khóa cho đến kỷ nguyên tiếp theo?
Tôi đã gặp sự cố khi ví giao dịch của tôi, sử dụng bot, thường nhận được lỗi “Không ký giao dịch bởi một số lượng người xác thực...” Điều này dẫn đến việc ví bị khóa cho đến kỷ nguyên tiếp theo, đôi khi trong nhiều giờ. Nó xuất hiện đặc biệt sau thời gian chờ RPC trong một giao dịch. Tại sao điều này xảy ra, và làm thế nào nó có thể được khắc phục để tránh những ổ khóa dài như vậy?
- Sui
01 - Thảo LuậnXavier.eth296Apr 10, 2025
Làm thế nào để chuyển SUI từ ví Standard sang ví Ledger?
Tôi đã kết nối Ledger của mình với một ví SUI mới tạo và điều đó hoạt động tốt. Bây giờ, tôi muốn chuyển SUI của mình từ ví SUI 'Standard' sang ví SUI 'Ledger' của tôi. Có lối tắt hay tôi phải gửi SUI từ địa chỉ này sang địa chỉ khác, như gửi mã thông báo đến các sàn giao dịch không? Tôi muốn đảm bảo quá trình này an toàn.
- Transaction Processing
01 - Bài ViếtApr 10, 2025
Xây dựng DApp xổ số NFT thế hệ tiếp theo với Sui Move và giao diện người dùng hiện đại
🧩 Xây dựng DApp xổ số NFT thế hệ tiếp theo với Sui Move & giao diện người dùng hiện đại Đây là hướng dẫn cơ bản của bạn để xây dựng DApp xổ số được chơi game hóa, hỗ trợ NFT sử dụngSui Move, với hỗ trợ nhiều vòng, hệ thống giới thiệu, quản trị DAO và hệ thống thiết kế mà Gen Z sẽ yêu thích. Từ kiến trúc hợp đồng đến quy trình giao diện người dùng — hãy cùng tham gia. 📦 Phân tích giai đoạn Giai đoạn 1 — Xổ số cốt lõi Trò chơi nhiều vòng Bán vé NFT Hệ thống phần thưởng giới thiệu Bỏ phiếu DAO cơ bản Giai đoạn 2 - Thị trường & Trò chơi hóa Tích hợp thị trường NFT Boosters (tăng cơ hội chiến thắng) Hệ thống Jackpot Airdrop ẩn Giai đoạn 3 - DAO & Multichain Khả năng tương thích chuỗi chÉO DAO với các đề xuất nâng cao Định giá năng động Phân tích trên chuỗi 🧠 Hợp đồng thông minh Tìm hiểu sâu về Sui Move Cấu trúc hợp đồng module nft_lottery_x::nft_lottery_x { use sui::object; use sui::balance::{Balance, zero}; use sui::coin::{Self, Coin}; use sui::clock::Clock; use sui::random::Random; use sui::event::emit; use sui::transfer; use sui::tx_context::TxContext; use std::option; use std::signer; const EGameNotStarted: u64 = 1000; const EGameAlreadyFinished: u64 = 1001; const EInvalidPayment: u64 = 1002; const ENoTickets: u64 = 1003; const EWinnerAlreadyChosen: u64 = 1004; const ENotWinner: u64 = 1005; public struct Game has key { id: UID, ticket_price: u64, start_time: u64, end_time: u64, total_tickets: u32, round: u32, winner: Option, balance: Balance, referral_bonus: u64, } public struct Ticket has key { id: UID, game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct GameCreated has copy, drop { game_id: ID, start_time: u64, end_time: u64, ticket_price: u64, } public struct TicketBought has copy, drop { game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct WinnerAnnounced has copy, drop { game_id: ID, winner_ticket: u32, round: u32, } public struct RewardClaimed has copy, drop { game_id: ID, ticket_number: u32, amount: u64, } public fun create_game( start_time: u64, end_time: u64, ticket_price: u64, referral_bonus: u64, ctx: &mut TxContext ) { let game = Game { id: object::new(ctx), ticket_price, start_time, end_time, total_tickets: 0, round: 1, winner: option::none(), balance: zero(), referral_bonus, }; emit(GameCreated { game_id: object::id(&game), start_time, end_time, ticket_price, }); transfer::share_object(game); } public fun buy_ticket( game: &mut Game, coin: Coin, clock: &Clock, referrer: Option, ctx: &mut TxContext ): Ticket { assert!(clock.timestamp_ms() >= game.start_time, EGameNotStarted); assert!(clock.timestamp_ms() (TicketBought { game_id: object::id(game), ticket_number: ticket.ticket_number, buyer: ticket.buyer, referrer: ticket.referrer, }); ticket } public entry fun determine_winner( game: &mut Game, rand: &Random, clock: &Clock, ctx: &mut TxContext ) { assert!(clock.timestamp_ms() >= game.end_time, EGameNotStarted); assert!(game.winner.is_none(), EWinnerAlreadyChosen); assert!(game.total_tickets > 0, ENoTickets); let mut generator = rand.new_generator(ctx); let winning_ticket = generator.generate_u32_in_range(1, game.total_tickets); game.winner = option::some(winning_ticket); emit(WinnerAnnounced { game_id: object::id(game), winner_ticket: winning_ticket, round: game.round, }); } public fun claim_reward( ticket: Ticket, game: Game, ctx: &mut TxContext ): Coin { assert!(object::id(&game) == ticket.game_id, EInvalidPayment); let ticket_num = ticket.ticket_number; assert!(game.winner.contains(&ticket_num), ENotWinner); let amount = game.balance.value(); let reward = game.balance.into_coin(ctx); emit(RewardClaimed { game_id: object::id(&game), ticket_number: ticket.ticket_number, amount, }); object::delete(object::id(&game)); reward } } Những điểm rút ra chính: ✅ Balanceđảm bảo an toàn kiểu và xử lý tiền xu thích hợp ✅ báo Optionhiệu rõ ràng nếu người chiến thắng đã được chọn ✅ Sự kiện cung cấp khả năng truy xuất nguồn gốc cho người giao diện và nhà thám hiểm 🛠 Lệnh Sui CLI sui client call --package --module nft_lottery_x --function create_game --args --gas-budget 10000000 Để mua vé, xác định người chiến thắng hoặc nhận phần thưởng, hãy làm theo các quy trình CLI tương tự. 🔮 Bổ sung trong tương lai Logic tự động đặt lại cho vòng tiếp theo claim_reward Phát ra nhiều sự kiện hơn như ReferralRewardDistributed Tái cấu trúc giải đặc biệt và giới thiệu thành các mô-đun con Hãy cho tôi biết nếu bạn muốn phần 2 để xây dựng giao diện người dùng và tích hợp trên Sui testnet!
- Sui
3
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Kiếm phần của bạn từ 1000 Sui
Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.
- Sui
- SDKs and Developer Tools
- Architecture
- Move
- NFT Ecosystem
- Transaction Processing
- Security Protocols