Khám phá
Kết nối với cộng đồng và khám phá ý tưởng mới.
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.
Cộng Đồng
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Bài viết hàng đầuCác thành viên hàng đầu- 458
- 426
- 409
Move is an executable bytecode language used to implement custom transactions and smart contracts.
Bài viết hàng đầuCác thành viên hàng đầu- 271
- 260
- 251
Peera is a decentralized questions and answers protocol for Web3 where users can organize and store their interests and skills, creating a common community platform
Bài viết hàng đầuCác thành viên hàng đầu- 328
- 286
- 225
The InterPlanetary File System (IPFS) is a protocol, hypermedia and file sharing peer-to-peer network for storing and sharing data in a distributed file system.
Bài viết hàng đầuCác thành viên hàng đầu- 25
- 20
- 20
Walrus is a decentralized storage and data availability protocol designed specifically for large binary files, or "blobs"
Bài viết hàng đầuCác thành viên hàng đầu- 41
- 40
- 38
Tiền thưởng
- +15Xavier.eth301Dành choSuiJun 17, 2025
Làm thế nào để các ràng buộc về khả năng tương tác với các trường động trong các bộ sưu tập không đồng nhất?
Tôi đang xây dựng một thị trường cần xử lý nhiều loại tài sản với các yêu cầu về khả năng khác nhau và tôi đã gặp một số câu hỏi cơ bản về hệ thống loại hình của Move. Tôi muốn lưu trữ các loại tài sản khác nhau trong cùng một bộ sưu tập, nhưng chúng có khả năng khác nhau: NFT thông thường: key + store(có thể chuyển nhượng) Mã thông báo Soulbound: key chỉ (không thể chuyển nhượng) Tài sản tùy chỉnh với các hạn chế chuyển nhượng public struct Marketplace has key { id: UID, listings: Bag, // Want to store different asset types here } // This works for transferable assets public fun list_transferable( marketplace: &mut Marketplace, asset: T, price: u64 ) { /* ... */ } // But how to handle soulbound assets? public fun list_soulbound( // No store ability marketplace: &mut Marketplace, asset_ref: &T, // Can only take reference price: u64 ) { /* How do I store metadata about this? */ } Các câu hỏi chính: Yêu cầu về khả năng: Khi sử dụngdynamic_field::add(), Vcó luôn cần store lúc biên dịch không? Các loại bao bọc có thể giải quyết được điều này không? Lưu trữ không đồng nhất: Một Túi duy nhất có thể lưu trữ các đối tượng với các bộ khả năng khác nhau (key + store + copyvskey + store) và xử lý chúng khác nhau khi chạy không? An toàn kiểu: Vì trường động thực hiện xóa kiểu, làm thế nào để duy trì độ an toàn kiểu khi truy xuất giá trị? Mẫu để lưu trữ siêu dữ liệu loại là gì? Mẫu nhân chứng: Các ràng buộc về khả năng hoạt động như thế nào với các loại bóng ma? Tôi có thể lưu trữ Assetvà Assettrong cùng một bộ sưu tập và trích xuất thông tin loại sau này không? Xây dựng một hệ thống mà NFT, token soulbound và tài sản bị hạn chế đều cần chức năng thị trường nhưng với ngữ nghĩa chuyển khác nhau. Tôi đã thử các loại bao bọc, nhiều bộ sưu tập cho mỗi bộ khả năng, lưu trữ siêu dữ liệu loại riêng biệt. Mỗi loại đều có sự đánh đổi giữa an toàn loại, chi phí khí đốt và độ phức tạp.
03 - +10Dành choSuiMay 29, 2025
Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?
Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên? Tôi đã đi sâu vào mã hóa/giải mã BCS trong Move, đặc biệt là cho giao tiếp chuỗi chằng và xử lý dữ liệu ngoài chuỗi. Trong khi xem xét các ví dụ trong tài liệu Sui Move, tôi đã gặp một số hành vi có vẻ phản trực giác và tôi đang cố gắng hiểu các quyết định thiết kế cơ bản. Theo đặc tả của BCS, “không có cấu trúc trong BCS (vì không có kiểu); cấu trúc chỉ đơn giản xác định thứ tự mà các trường được nối tiếp.” Điều này có nghĩa là khi giải mã, chúng ta phải sử dụng peel_*các hàm theo thứ tự chính xác với định nghĩa trường struct. Câu hỏi cụ thể của tôi: Lý do thiết kế: Tại sao BCS yêu cầu khớp thứ tự trường chính xác khi cấu trúc Move có các trường được đặt tên? Sẽ không mạnh mẽ hơn nếu sắp xếp các tên trường cùng với các giá trị, tương tự như JSON hoặc các định dạng tự mô tả khác? Tương tác kiểu chung: Các tài liệu đề cập rằng “các loại chứa các trường kiểu chung có thể được phân tích thành trường kiểu chung đầu tiên.” Hãy xem xét cấu trúc này: struct ComplexObject has drop, copy { id: ID, owner: address, metadata: Metadata, generic_data: T, more_metadata: String, another_generic: U } Chính xác thì quá trình khử phân loại một phần hoạt động như thế nào ở đây? Tôi có thể giải chuỗi tối đa more_metadata và bỏ qua cả hai trường chung hay trường chung đầu tiên (generic_data) có chặn hoàn toàn quá trình giải mã hóa tiếp theo không? Tính nhất quán giữa các ngôn ngữ: Khi sử dụng thư viện JavaScript @mysten /bcs để nối tiếp dữ liệu sẽ được sử dụng bởi hợp đồng Move, điều gì sẽ xảy ra nếu: Tôi vô tình sắp xếp lại các trường trong đối tượng JavaScript? Định nghĩa cấu trúc Move thay đổi thứ tự trường trong nâng cấp hợp đồng? Tôi có cấu trúc lồng nhau với các tham số chung của riêng chúng? Ý nghĩa thực tế: Trong các hệ thống sản xuất, các nhóm xử lý sự tiến hóa lược đồ BCS như thế nào? Bạn có phiên bản lược đồ BCS của mình hay kỳ vọng rằng thứ tự trường cấu trúc là bất biến sau khi được triển khai?
53 - +10Dành choMoveMar 11, 2025
Sui Move vs Aptos Move - What is the difference?
Sui Move and Aptos Move - two prominent implementations of the Move programming language. While both are rooted in the same foundational principles, they have diverged significantly in design, execution, and ecosystem development. To better understand their differences, we need to uncover some of their key aspects: How do their runtimes differ? Both Sui and Aptos implement their own custom Move virtual machines (VMs). How does this impact performance, scalability, and developer experience? For instance: Does Sui's runtime optimize for parallel execution differently than Aptos'? Are there notable differences in transaction lifecycle management or gas models? What are the differences between their standard libraries? The Move standard library is a critical component for building smart contracts. However, Sui and Aptos have forked their implementations, leading to divergence: Are there modules or functions unique to one implementation but absent in the other? How do these differences affect common use cases like token creation, NFTs, or decentralized finance (DeFi)? How does data storage differ between them? One of the most significant distinctions lies in how Sui and Aptos handle data storage: Sui uses an object-centric model, where each object has its own ownership and permissions. Aptos, on the other hand, retains a more traditional account-based model similar to Ethereum. How does this impact state management, composability, and gas efficiency? Is it fair to say that Aptos is closer to EVM while Sui is closer to SVM? Some developers argue that Aptos' account-based architecture resembles Ethereum's EVM, while Sui's object-centric approach aligns more closely with Solana's SVM. Do you agree with this analogy? Why or why not? How does this architectural choice influence developer ergonomics and application design? Are there universal packages working for both Sui Move and Aptos Move? Given their shared origins, it would be ideal if some libraries or tools were interoperable across both ecosystems. Are there any existing universal packages or frameworks that work seamlessly on both platforms? If not, what are the main barriers to achieving compatibility? Can one of them be transpiled into another? If a project is built on Sui Move, could it theoretically be transpiled to run on Aptos Move, or vice versa? What are the technical challenges involved in such a process? Are there tools or compilers currently available to facilitate this kind of migration?
21
Mới nhất
Mất địa chỉ ví Sui của tôi, làm thế nào để khôi phục chúng?
Tôi đang sử dụng Suiscanner và tôi thấy hoạt động quen thuộc từ các địa chỉ khác nhau mà tôi từng có quyền truy cập trong ví Sui của mình, nhưng bây giờ chỉ có một hoạt động hiển thị trong ví Sluch. Làm thế nào tôi có thể khôi phục các địa chỉ bị thiếu?
01How to fix 'Cannot open wallet config file' error in Walrus?
I'm trying to use the Walrus CLI to store a file with the command walrus store --wallet. However, I'm encountering an error: Cannot open wallet config file at "~/.sui/sui_config/client.yaml". Err: Unable to load config. I've tried using relative and absolute paths in the command, but the error persists. I can open the file using a text editor, so I know it exists. How can I resolve this issue?
04- Dành choSuiJun 19, 2025
Soulbound Tài sản có thể chuyển nhượng
Bài viết tuyệt vời! Tôi muốn thêm một vài điểm thực tế để củng cố thiết kế và an toàn loại xung quanh các tài sản không đồng nhất trong Sui Move: ✅ Vì dynamic_field::add()yêu cầu storekhả năng, các tài sản như token soulbound (chỉ cókey) không thể được lưu trữ trực tiếp. IDThay vào đó, chỉ lưu trữ storesiêu dữ liệu của chúng và danh sách dữ liệu mà do có. ✅ Cách tiếp cận tốt nhất: các bộ sưu tập riêng biệt dựa trên các hạn chế về khả năng: VecMap→ đối với key + storetài sản (ví dụ: NFT có thể chuyển nhượng) VecMap→ chỉ dành cho keytài sản -only (ví dụ: token soulbound) ✅ Thêm thẻ thời gian chạy asset_type: Stringvào siêu dữ liệu. Điều này cho phép bạn xác định và xử lý an toàn logic tài sản (ví dụ: chuyển, hiển thị) ngay cả sau khi xóa loại. ✅ Các loại Phantom rất tuyệt vời để gắn thẻ kiểu trong thời gian biên dịch và ngăn chặn việc lạm dụng của nhà phát triển (như chuyển vô tình các mã thông báo không thể chuyển nhượng). Cấu trúc mô-đun này có thể mở rộng, tránh vi phạm khả năng di chuyển và cho phép thiết kế thị trường linh hoạt mà không làm mất an toàn. Làm việc tuyệt vời khi giải thích nó một cách kỹ lưỡng!
01
Chưa có câu trả lời
Làm cách nào để cập nhật khóa của người bán trong ObjectTable khi nó thay đổi trong cấu trúc?
Xin chào mọi người, tôi mới bắt đầu viết hợp đồng thông minh và tôi đang thực hiện dự án đầu tiên của mình. Tôi rất muốn được giúp đỡ với một vấn đề mà tôi gặp khó khăn. Cho đến nay, tôi đã tạo một Merchantstruct trông như thế này: -id: một định danh duy nhất (UID) -owner: địa chỉ của người bán -key: Chuỗi được sử dụng như một khóa duy nhất -balance: một u64 đại diện cho số dư của họ Tôi cũng đã tạo một MerchantRegistrycấu trúc để quản lý tất cả các thương nhân: -id: UID khác -merchant_to_address: ObjectTablelập bản đồ địa chỉ cho thương nhân -merchant_to_key: một ObjectTablebản đồ chìa khóa cho thương nhân Tôi muốn có thể tìm kiếm một thương nhân bằngđịa chỉcủa họ hoặc bằng* khóa*của họ. Khi người dùng cập nhật khóa của họ bên Merchanttrong cấu trúc, thay đổi sẽ không tự động cập nhật khóa trong merchant_to_keybảng. Điều đó có nghĩa là chìa khóa cũ vẫn chỉ vào thương gia, làm hỏng mọi thứ. Tôi đã thử xóa mục nhập khỏi bảng và chèn nó trở lại bằng khóa mới, nhưng tôi tiếp tục gặp lỗi như: “Không thể bỏ qua các giá trị mà không có khả năng giảm” Tôi khá chắc chắn đây là một sai lầm của người mới bắt đầu, nhưng tôi không thể tìm thấy lời giải thích hoặc giải pháp rõ ràng ở bất cứ đâu. Có cách nào thích hợp để xử lý việc cập nhật khóa trong cả cấu trúc và bảng tra cứu không?
20- 0xduckmove409Dành choSuiJun 06, 2025
Giao diện dễ nhất để tải lên các đốm hải mã là gì?
chỉ là một giao diện người dùng đơn giản để tải lên hải mã? (ngoài Tusky)
10 Điều gì xảy ra nếu tôi không yêu cầu ETH qua Sui bridge?
Tôi đã sử dụng cầu Sui để chuyển một số ETH nhưng chưa xác nhận nó vì phí khá cao. Điều gì sẽ xảy ra nếu tôi để nó không được xác nhận?
00
Xu hướng
- 0xduckmove409Dành choSuiApr 08, 2025
👀 SEAL- Tôi nghĩ quyền riêng tư dữ liệu Web3 sắp thay đổi
👀 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
8 AMM Bot trong hệ sinh thái Sui
Các tính năng và chức năng chính của bot AMM trong hệ sinh thái Sui là gì? Làm thế nào để họ cải thiện các cơ chế giao dịch truyền thống và chúng mang lại những lợi thế nào cho người dùng tham gia với các giao thức DeFi trên mạng Sui? Tôi có cần xây dựng một cái hay tôi có thể sử dụng Turbos Finance chẳng hạn
62- harry phan458Dành choSuiApr 24, 2025
Quản lý con đa mô-đun với public_receiver
Đây là phần 3 của loạt phim “Đối tượng cha mẹ-con trong Sui Move”. Đôi khi loại cha mẹ và con của bạn được xác định trong các mô-đun khác nhau hoặc thậm chí các gói khác nhau. Ví dụ: bạn có thể có một đối tượng Warehouse chung có thể lưu trữ bất kỳ loại đối tượng Parcel nào. Mô-đun Warehouse muốn rút ra một con Parcel, nhưng loại Parcel được định nghĩa ở nơi khác. Trong những trường hợp như vậy, chúng tôi sử dụng transfer: :public_receiver, là người anh em họ chênh lệch mô-đun của receiver. ###* nhận so với public_receive* Như chúng ta đã thấy, transfer:: receiver chỉ có thể được gọi trong mô-đun định nghĩa T (hoặc một người bạn) vì nó không yêu cầu T: store. Trình xác minh Move bytecode thực sự đảm bảo rằng trong bất kỳ cuộc gọi nào để nhận, loại T là từ mô-đun hiện tại. Đây là một hạn chế an toàn đối với các đối tượng chỉ có khóa. transfer: :public_receiver là một biến thể mà yêu cầu T: key + lưu trữ nhưng cho phép nhận bên ngoài mô-đun của T. Nói cách khác, nếu kiểu đối tượng có khả năng lưu trữ (nghĩa là nó được phép tồn tại trong bộ lưu trữ toàn cầu một cách tự do), thì bất kỳ mô-đun nào (được cho UID & mut của cha mẹ) đều có thể nhận nó bằng cách sử dụng public_receiver. Điều này hoàn hảo cho các trường hợp mô-đun của phụ huynh khác với mô-đun của trẻ em. Tại sao yêu cầu cửa hàng? Bởi vì cửa hàng đánh dấu rằng đối tượng có thể được duy trì một cách an toàn và chuyển xung quanh bên ngoài mô-đun xác định của nó. Các đối tượng chỉ có khóa có thể có bất biến tùy chỉnh mà mô-đun ban đầu muốn thực thi khi chuyển nhận/nhận; bằng cách loại trừ những đối tượng đó khỏi public_receiver, Sui buộc các nhà phát triển xử lý chúng trong mô-đun (như chúng ta sẽ thấy với các đối tượng bị ràng buộc linh hồn). Nếu một đối tượng có kho, nó dễ cho phép hơn và Sui cho phép logic chuyển nhận/nhận chung để quản lý nó bên ngoài. ###Ví dụ: Các mô-đun phụ huynh và con riêng biệt Hãy minh họa bằng một kịch bản đơn giản: Kho lưu trữ các đối tượng Parcel. Loại Bưu kiện được xác định trong mô-đun riêng của nó và Kho trong một mô-đun khác. Chúng tôi sẽ chỉ ra cách Warehouse có thể nhận được một Parcel con bằng cách sử dụng public_receiver. module demo::parcel { // Child module use sui::object::{Self, UID}; use sui::tx_context::{Self, TxContext}; /// A parcel object that can be stored in a Warehouse. /// It has both key and store, so it can be transferred across modules. struct Parcel has key, store { id: UID, contents: vector } public entry fun create_parcel(contents: vector, ctx: &mut TxContext): Parcel { Parcel { id: object::new(ctx), contents } } } module demo::warehouse { // Parent module use sui::transfer::{Self, Receiving, public_receive}; use demo::parcel::{Self, Parcel}; use sui::object::{UID}; use sui::tx_context::{Self, TxContext}; struct Warehouse has key { id: UID, location: address } public entry fun create_warehouse(location: address, ctx: &mut TxContext): Warehouse { Warehouse { id: object::new(ctx), location } } /// Receive a Parcel that was sent to this Warehouse. /// Returns the Parcel to the caller (transferred to caller's address). public entry fun withdraw_parcel( warehouse: &mut Warehouse, parcel_ticket: Receiving, ctx: &mut TxContext ): Parcel { // Using public_receive because Parcel is defined in another module and has store let parcel = public_receive(&mut warehouse.id, parcel_ticket) oai_citation_attribution:27‡docs.sui.io oai_citation_attribution:28‡github.com; // Transfer the parcel to the transaction sender (so the caller gets ownership) transfer::transfer(parcel, tx_context::sender(ctx)); // We return nothing because we've transferred the Parcel out to the caller. } } Hãy chia nhỏ những gì đang xảy ra trong _parcel: Chúng tôi gọi public_receiver (& mut warehouse.id, parcel_ticket). Bởi vì Parcel có khả năng lưu trữ, cuộc gọi này được cho phép mặc dù chúng tôi không ở trong mô-đun bưu kiện. Dưới mui xe, tính năng này thực hiện kiểm tra và trích xuất tương tự như nhận, nhưng nó được phép chênh lệch mô-đun vì cửa hàng cho biết nó an toàn để làm như vậy. https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/transfer.move#:~:text=public%20fun%20public_receive,T%3E%29%3A%20T Sau đó chúng tôi ngay lập tức chuyển Bưu kiện nhận được đến địa chỉ của người gọi (tx_context: :send (ctx)). Bước này đảm bảo bưu kiện rời khỏi kho và chuyển đến người dùng đã bắt đầu rút tiền. Chúng ta cũng có thể vừa trả lại Parcel từ hàm và Sui sẽ coi nó như một đầu ra thuộc sở hữu của địa chỉ người gọi (vì đó là đầu ra của hàm nhập). Thực hiện chuyển giao rõ ràng sẽ nhiều chi tiết hơn, nhưng làm rõ điều gì đang xảy ra (và cho phép chúng tôi thực hiện bất kỳ kiểm tra nào trước khi giải phóng đối tượng). Tại sao phải bao gồm cửa hàng trong Bưu kiện? Nếu Parcel thiếu khả năng lưu trữ (tức là chỉ có khóa), lệnh gọi public_receiver trong demo: :warehouse sẽ không biên dịch - Sui thực thi rằng T có kho lưu trữ cho public_receiver. Trong trường hợp đó, chúng tôi sẽ buộc phải lấy bưu kiện bằng cách sử dụng nhận trong chính mô-đun bưu kiện (hoặc sử dụng một số mối quan hệ bạn bè), điều này làm phức tạp thiết kế đa mô-đun. Bằng cách thêm cửa hàng vào Parcel, chúng tôi nói một cách hiệu quả “đối tượng này có thể được di chuyển và nhận tự do bởi các mô-đun bên ngoài”, đó là những gì chúng tôi muốn cho một mẫu container chung. Mẫu gọi hàm: Để sử dụng những thứ này trong giao dịch, luồng sẽ là: 1.Đặt cọc (chuyển sang đối tượng) :Gọi chuyển: :public_transfer (parcel_obj, @warehouse_id) để gửi Bưu kiện vào Kho. Điều này đánh dấu chủ sở hữu của bưu kiện là nhà kho. (Chúng tôi sử dụng public_transfer ở đây vì nó nằm bên ngoài mô-đun Parcel và Parcel có cửa hàng. Bên trong mô-đun của bưu kiện, việc chuyển tiền đơn giản cũng sẽ hoạt động.) Rút tiền (nhận lại) :Sau đó, gọi _parcel (warehouse_obj, Receiving (parcel_id,...)). Bộ nhận có thể được SDK lấy bằng cách tham khảo ID của bưu kiện và phiên bản mới nhất. Hàm sẽ gọi public_receiver và sau đó chuyển bưu kiện cho bạn. Sau cuộc gọi _parcel, chủ sở hữu của bưu kiện quay trở lại một địa chỉ (của bạn), vì vậy nó lại là một đối tượng thuộc sở hữu địa chỉ bình thường. Nhà kho không còn sở hữu nó nữa. Cân nhắc giữa các mô-đun: Lưu ý rằng mô-đun Warehouse cần biết về loại Bưu kiện (chúng tôi sử dụng demo: :parcel: :Parcel). Điều này là do chúng tôi gõ rõ ràng Nhận là Nhận. Nếu bạn muốn một vùng chứa thực sự chung chung có thể nhận bất kỳ loại đối tượng nào, bạn sẽ phải sử dụng generics hoặc một cách tiếp cận khác (có thể là trường động với kiểu xóa). Nhưng đối với hầu hết các trường hợp sử dụng, bạn sẽ biết những loại trẻ em mà bạn mong đợi. Tại sao public_receiver thay vì chỉ gọi Receive? Nếu chúng ta thử transfer: :receiver (&mut warehouse.id, parcel_ticket) trong mô-đun warehouse, trình xác minh Move sẽ từ chối vì Parcel không được định nghĩa trong demo: :warehouse. Sui cung cấp public_receiver như một cách may mắn để thực hiện việc này với một kiểm tra khả năng bổ sung (yêu cầu cửa hàng). Tương tự, Sui có transfer vs public_transfer, freeze object vs public_freeze object, v.v., theo cùng một mẫu: các phiên bản public_ được sử dụng bên ngoài mô-đun xác định và yêu cầu lưu trữ. Đừng quên sự cho phép của phụ huynh: Ngay cả với public_receiver, bạn vẫn cần &mut warehouse.id đó. Chúng tôi nhận được nó vì _parcel nằm trong mô-đun của Warehouse và chấp nhận &mut Warehouse. Do đó, chỉ ai đó có thể gọi cho người đó (chủ kho) mới có thể rút bưu kiện. Nếu mô-đun kho không cung cấp một hàm như vậy một cách công khai, thì cũng không ai có thể gọi public_receiver bên ngoài trên con của nó. Vì vậy, cross-module không bỏ qua sự kiểm soát của cha mẹ; nó chỉ cho phép mã của cha mẹ hoạt động với các kiểu con mà nó không xác định. Lưu ý về khả năng lưu trữ: Việc cung cấp một kho đối tượng làm cho nó linh hoạt hơn nhưng ít bị hạn chế hơn một chút - bất kỳ mô-đun nào có tham chiếu gốc đều có thể kéo nó ra bằng cách sử dụng public_receiver. Nếu bạn muốnhạn hạncách truy xuất một đối tượng (ví dụ: thực thi logic tùy chỉnh hoặc ngăn chặn việc trích xuất dễ dàng), bạn có thể cố tình biến nó thành chỉ có khóa. Chúng ta sẽ thấy một ví dụ về điều đó với các đối tượng bị ràng buộc với linh hồn. Trong những trường hợp đó, bạn có thể triển khai một hàm nhận tùy chỉnh thay vì dựa vào public_receiver. Tóm lại phần này: public_receiver là bạn của bạn để quản lý các đối tượng con được xác định trong các mô-đun khác, miễn là các đối tượng đó có khả năng lưu trữ. Nó cho phép bạn xây dựng các hệ thống đa mô-đun (như Kho khó/Bưu kiện của chúng tôi) trong khi vẫn tôn trọng quyền sở hữu và kiểm soát truy cập. Chỉ cần nhớ bao gồm store trên các loại con và sử dụng public_transfer khi gửi chúng cho cha mẹ từ bên ngoài mô-đun của họ.
5