Sui.

Bài viết

Chia sẻ kiến thức của bạn.

shamueely.
Jul 30, 2025
Hỏi đáp Chuyên Gia

Mẫu thiết kế và quản lý đồng thời cho các đối tượng được chia sẻ trong Sui Move

Tôi đang cố gắng xoay quanh mô hình kiến trúc phù hợp khi làm việc với đối tượng được chia sẻ trong Sui Move, đặc biệt là khi nhiều người dùng cần tương tác với chúng đồng thời (ví dụ: trong đấu trường trò chơi, theo dõi phiếu bầu DAO hoặc kho cho mượn).

Tôi đã đọc rằng các đối tượng được chia sẻ có thể gây ra các vấn đề đồng bộ hóa, nhưng tôi vẫn không rõ ràng về:

  • Chính xác khi nào tôi nên sử dụng một sharedđối tượng vs.owned?
  • Làm thế nào để Sui xử lý các lần thử giao dịch đồng thời trên cùng một đối tượng được chia sẻ - tôi có cần xếp đền/khóa mọi thứ theo cách thủ công không?
  • Thực hành tốt nhất để thiết kế các mô-đun hỗ trợ đồng thời cao nhưng tránh ConflictTransactionlỗi thường xuyên là gì?
  • Tôi có nên làm bất cứ điều gì đặc biệt (như chia các trường có thể thay đổi thành các đối tượng phụ) để giảm sự tranh chấp không?
  • Sui
  • Architecture
  • NFT Ecosystem
  • Move
2
13
Chia sẻ
Bình luận
.

Câu trả lời

13
theking.
Jul 30 2025, 10:21

Khi bạn đang xây dựng DApp trên Sui nơi nhiều người dùng cần tương tác với cùng một trạng thái, như trong đấu trường trò chơi, giao thức cho mượn hoặc DAO, bạn nên sử dụngđối tượng được chia sẻthay vì các đối tượng thuộc sở hữu. Các đối tượng được chia sẻ có thể truy cập công khai và có thể thay đổi, có nghĩa là bất kỳ ai cũng có thể gọi các hàm nhập trên chúng miễn là chúng nằm trong biểu đồ đối tượng toàn cục. Ngược lại, các đối tượng sở hữu là riêng tư đối với người dùng và lý tưởng cho các tài sản cá nhân như ví hoặc hàng tồn kho. Vì vậy, bạn nên sử dụng một đối tượng được chia sẻ khi cập nhật trạng thái phải hiển thị và sử dụng bởi nhiều người dùng cùng một lúc.

Sui xử lý các giao dịch đồng thời trên các đối tượng được chia sẻ thông qua một cơ chế được gọi là** xác thực thứ tự nhân quả**, yêu cầu bạn cung cấp một cách rõ ràng phiên bản mới nhất đã biết của đối tượng được chia sẻ. Nếu hai người dùng cố gắng sửa đổi cùng một đối tượng chia sẻ cùng một lúc với các phiên bản lỗi thời, một người sẽ thành công trong khi những người khác thất bại với ConflictTransactionlỗi. Sui không xếp hàng hoặc khóa các đối tượng được chia sẻ một cách nguyên bản, vì vậy bạn cần thiết kế các mô-đun Move của mình để giảm thiểu số ghi chồng chèn. Một trong những cách tốt nhất để giảm xung đột là** thiết kế cho sự song lịch**. Ví dụ: thay vì lưu trữ tất cả các trạng thái có thể thay đổi trong đối tượng chia sẻ gốc, bạn có thể** chia các trường có độ cạnh tranh cao thành các đối tượng con riêng rộng**. Mỗi đứa trẻ đó sau đó có thể được viết độc lập, giảm khả năng xung đột giao dịch.

Một thực hành tuyệt vời là giữ đối tượng chia sẻ chính dưới dạng thư mục và di chuyển trạng thái chi tiết, thường xuyên cập nhật — như điểm số người chơi, phiếu bầu hoặc số dư cho vay — vào các trường động hoặc các đối tượng phụ nhỏ hơn. Bằng cách này, người dùng chỉ cập nhật phần cụ thể mà họ cần chứ không phải toàn bộ đối tượng được chia sẻ. Nó cũng thông minh khi tách các thành phần đọc nặng và nhiều ghi. Hơn nữa, bạn nên xây dựng các luồng giao dịch rõ ràng và xác định, luôn sử dụng phiên bản mới nhất của các đối tượng được chia sẻ và logic thử lại cho khách hàng để xử lý các giao dịch thất bại.

Bạn có thể tìm hiểu thêm về thiết kế đối tượng được chia sẻ và giảm thiểu xung đột trong tài liệu Sui tại đây: https://docs.sui.io/concepts/objects#shared-objects.

Nếu bạn đang quản lý một cái gì đó như trình theo dõi phiếu bầu, đây là ví dụ về khối giao dịch đơn giản để giảm xung đột:

const tx = new TransactionBlock();
tx.moveCall({
  target: `$ {packageID} ::vote_tracker: :cast_vote`,
 lập luận: [
 tx.SharedObject (voteTrackerId),//tham chiếu đối tượng được chia sẻ
 tx.pure (voterId),//đối tượng sở hữu hoặc khóa công khai
 tx.pure (ProposalId),//dữ liệu thuần túy
 tx.pure (VoteChoice)
 ]
});
1
Câu trả lời hay nhất
Bình luận
.
Benjamin XDV.
Jul 31 2025, 09:52

Trong Sui Move,** đối tượng được chia sẻ**(được đánh dấu bằngkey + store) rất cần thiết cho tương tác nhiều người dùng nhưng yêu cầu thiết kế đồng thời cẩn thận. Sử dụng chúng khi trạng thái phải có thể thay đổi toàn cầu (ví dụ: trò chơi, DAO), trong khi các đối tượng sở hữu/bất biến phù hợp với các tình huống người dùng đơn. Sui tự động hóa các giao dịch trên mỗi đối tượng được chia sẻ, nhưng ghi thường xuyên có thể gây ra lỗi ConflictTransaction— giảm thiểu điều này bằng cáchchia các trường nóng thành các đối tượng con riêng biệt (ví dụ: một đối tượng cho mỗi người dùng) hoặc cập nhật hàng loạt. Để có thông lượng cao, hãy áp dụngcác mẫu tìm nguồn cung ứng sự kiện**: lưu trữ các hành động dưới dạng các sự kiện bất biến và tổng hợp trạng thái theo định kỳ. Luôn giảm thiểu các trường chia sẻ có thể thay đổi và thích hoán đổi nguyên tử thông qua đột biến transfer::share_objecthơn đột biến trực tiếp.

8
Bình luận
.
Paul.
Paul4300
Jul 31 2025, 05:46

Trong Sui Move, việc xử lý các đối tượng được chia sẻ và đồng thời một cách hiệu quả đòi hỏi phải thiết kế cẩn thận để tránh điều kiện chủng tộc và tranh chấp cao. Dưới đây là bảng phân tích các thực tiễn tốt nhất và các mẫu kiến trúc:

1.** Khi nào sử dụng Đối tượng được chia sẻ so với đối tượng sở hữu:**

*** Đối tượng được chia sẻ**: Sử dụng khi nhiều người dùng cần tương tác với cùng một đối tượng đồng thời (ví dụ: trạng thái trò chơi được chia sẻ, trình theo dõi phiếu bầu DAO). *** Đối tượng thuộc sở hữu**: Sử dụng khi đối tượng dành riêng cho một người dùng hoặc tài khoản duy nhất, tránh trạng thái được chia sẻ và giảm các vấn đề đồng thời.

2.Xử lý giao dịch đồng thời tại Sui:

  • Sui tự động xử lý đồng thời bằng cách sử dụngKhóa giao dịchđể ngăn chặn các sửa đổi đồng thời của cùng một đối tượng.
  • Bạnkhôngcần phải xếp hàng theo cách thủ công hoặc khóa các đối tượng được chia sẻ, vì Sui thực thi khóa ở cấp đối tượng. Tuy nhiên,** bạn có thể gặp lỗi ConflictTransaction**nếu nhiều giao dịch xung đột trên cùng một đối tượng.

3.** Các phương pháp hay nhất cho tính đồng thời cao:**

*** Giảm thiểu Nội độ**: Chia các trường có thể thay đổi thành các đối tượng phụ riêng biệt để cho phép cập nhật song song cho các phần khác nhau của đối tượng. *Tránh Hotspots: Phân phối trạng thái được sửa đổi thường xuyên trên nhiều đối tượng (ví dụ: thay vì có một sổ cái chia sẻ duy nhất, hãy chia nó thành nhiều ngăn hoặc tài khoản). *Phiên bản: Sử dụng các đối tượng có phiên bản hoặc tạo các đối tượng mới để theo dõi các bản cập nhật thay vì biến đổi cùng một đối tượng nhiều lần.

4.** Quản lý tranh chấp:**

  • Cân nhắcchia các trường có thể thay đổi thành các đối tượng nhỏ hơnđể giảm sự tranh cãi. Điều này cho phép các phần khác nhau của đối tượng được cập nhật đồng thời, giảm khả năng xung đột.
  • Sử dụnggiao dịch nguyên tửđể nhóm các hành động liên quan thành một, đảm bảo tính nhất quán giữa các đối tượng liên quan.

Ví dụ:

Nếu bạn cóbộ theo dõi phiếu bốcho DAO:

  • Thay vì lưu trữ tất cả phiếu bầu trong một đối tượng được chia sẻ duy nhất, hãy chia chúng thành nhiều đối tượng (ví dụ: một đối tượng cho mỗi đề xuất), cho phép cập nhật song song cho mỗi đề xuất trong khi giảm sự tranh chấp.

Kết luận:

Đối với tính đồng thời cao, giảm thiểu sự tranh chấp bằng cách phân phối trạng thái, sử dụng các đối tượng phụ và tận dụng xử lý giao dịch tự động của Sui. Đảm bảo bạn hiểu các mẫu truy cập của mình và cấu trúc các đối tượng để giảm thiểu các điểm xung đột.

7
Bình luận
.
Ashford.
Jul 31 2025, 07:37

Hiểu các mẫu thiết kế và quản lý đồng thời cho các đối tượng được chia sẻ trong Sui Move

Khi xử lýđối tượng được chia sẻtrongSui Move, việc quản lý đồng thời trở nên quan trọng, vì nhiều người dùng có thể cần tương tác với cùng một đối tượng cùng một lúc. Điều này đặc biệt đúng đối với các trường hợp sử dụng nhưđấu trường trò chơi,Trình theo dõi phiếu bầu DAOkho cho mượng, nơi dự kiến tính đồng thời cao. Mạng Sui cung cấp một số tính năng để giúp quản lý đồng thời, nhưng nó vẫn yêu cầu thiết kế cẩn thận để tránh những cạm bẫy phổ biến, nhưConflictTransaction errors.

1.** Khi nào nên sử dụng đối tượng được chia sẻ so với đối tượng sở hữu**

*** Đối tượng thuộc sở hữu**:

  • Một đối tượng đượcsở hữunếu nó được quản lý bởi một địa chỉ duy nhất, có thể chuyển hoặc sửa đổi nó. *** Sử dụng các đối tượng thuộc sở hữukhi bạn mong đợi một thực thể duy nhất kiểm soát và tương tác với một đối tượng. Ví dụ: nếu bạn có một ví có tiền xu, mỗi ví có quyền sở hữu đối với các đồng tiền của riêng nó. *** Đối tượng được chia sẻ:

  • Các đối tượng được chia sẻ có thể được truy cập và sửa đổi bởi nhiều địa chỉ cùng một lúc. Sui cho phép bạn xác định các đối tượng làđược chia sẻbằng cách làm cho chúng có thể thay đổi và cung cấp quyền truy cập cho nhiều bên. *** Sử dụng đối tượng được chia sẻ**cho các tình huống mà nhiều người dùng hoặc địa chỉ cần tương tác với cùng một đối tượng, chẳng hạn như:

Trình theo dõi phiếu bầu DAO: Nhiều người dùng có thể bỏ phiếu cho cùng một đối tượng. *** Kho cho mượn*: Nhiều người dùng có thể cho mượn và mượn từ cùng một kho tiền. *** Đấu trường trò chơi**: Nhiều người dùng tương tác với trạng thái trò chơi cùng một lúc.

Cân nhắc chính: Các đối tượng được chia sẻ nên được sử dụng cẩn thận, vì chúng có thể giới thiệutranh cực- tình huống mà nhiều giao dịch đang cố gắng truy cập và sửa đổi cùng một đối tượng cùng một lúc.

2.** Đồng thời và nỗ lực giao dịch trên các đối tượng được chia sẻ**

Sui đảm bảo rằng các giao dịchđồng thời trên cùng một đối tượng được chia sẻđược xử lý chính xác bằng cách thực thicách ly giao dịch. Nếu nhiều giao dịch cố gắng đột biến cùng một đối tượng được chia sẻ cùng một lúc, một trong số chúng sẽthất bảndotranh giả.

Khi một giao dịch cố gắng sửa đổi một đối tượng được chia sẻ đã được sửa đổi bởi một giao dịch khác, Sui sẽ trả về lỗiConflictTransaction. Tuy nhiên,Sui xử lý hầu hết việc quản lý đồng thời nội bộvà bạnkhông cần phải xếp hàng hoặc khóacác đối tượng theo cách thủ công. Thay vào đó, bạn cần thiết kế hợp đồng của mình để giảm thiểu sự tranh chấp và tránh các tình huống mà hai giao dịch thường xuyên xung đột.

3.** Các phương pháp hay nhất cho đồng thời cao và giảm xung đột Lỗi giao dịch**

Đểthiết kế các mô-đuncó thể xử lý tính đồng thời cao và tránh các lỗiConflictTransactionthường xuyên, hãy làm theo các phương pháp hay nhất sau:

a.** Giảm thiểu các điểm tranh giác**:

*** Giới hạn quyền truy cập có thể thay đổi**: Giữ số trường có thể thay đổi trong các đối tượng được chia sẻ càng nhỏ càng tốt. Mỗi trường có thể thay đổi giới thiệu một điểm tranh cãi tiềm ẩn. *** Sử dụng các đối tượng sở hữu cho dữ liệu độc lập**: Thay vì chia sẻ mọi thứ, hãy lưu trữ dữ liệu độc lập trong các đối tượng sở hữu. Ví dụ: nếu bạn có dữ liệu dành riêng cho người dùng (như số dư), hãy lưu trữ nó trong một đối tượng sở hữu thay vì một đối tượng được chia sẻ.

b.** Sử dụng mẫu “Phân vùng trạng thái”**:

  • Chia đối tượng được chia sẻ của bạn thành** nhiều đối tượng phụ để giảm sự tranh cãi. Ví dụ: thay vì có một đối tượng được chia sẻ theo dõi toàn bộ trạng thái trò chơi, bạn có thể chia nó thành nhiều đối tượng phụ:

  • Một cho mỗi trạng thái củangười chơi.

  • Một cho** cài đặt trò chơi**.

  • Một cho** dữ liệu bảng xếp hạng**.

  • Bằng cách này, các giao dịch liên quan đến các phần khác nhau của hệ thống có thể xảy ra đồng thời mà không chặn lẫn nhau.

c.** Hoạt động hàng loại**:

  • Khi làm việc với các đối tượng được chia sẻ, hãy cập nhật hàng loạt để giảm số lượng giao dịch cần tương tác với đối tượng. Điều này có thể giúp tránh xung đột thường xuyên. *** Sử dụng bộ sưu tập**như vectơ hoặc bộ để quản lý nhiều bản cập nhật trong một giao dịch duy nhất.

d.** Sử dụng các hoạt động nguyên tử**:

  • Bất cứ khi nào có thể, hãy thiết kế các mô-đun của bạn để sử dụng các hoạt động nguyên tử nếu có thể. Ví dụ: thay vì có các giao dịch riêng biệt để kiểm tra một điều kiện và sau đó cập nhật một trường, hãy gói các kiểm tra và cập nhật thành một hoạt động nguyên tử duy nhất.

e.** Logic thử lại**:

  • Trong khi Sui xử lý các lần thử lại trong nội bộ, bạn có thể triển khai logic thử lại ở cấp ứng dụng để xử lý các lỗi tranh chấp không thường xuyên. Ví dụ, nếu ConflictTransactionxảy ra lỗi, bạn chỉ cần thử lại giao dịch hoặc xếp hàng để thực hiện sau.

4.** Giảm tranh chấp bằng cách chia các trường có thể thay đổi thành các đối tượng phụ**

Đây là một thực hành rất được khuyến khích. Khi xử lý các đối tượng được chia sẻ,** bạn có càng nhiều trường trong một đối tượng được chia sẻcó thể thay đổi, thì khả năng hai giao dịch sẽ cố gắng biến đổi cùng một trường cùng một lúc càng cao.

*Ví dụ 1: Nếu bạn có một đối tượng được chia sẻ đại diện chokho cho mượn, hãy chia nó thành các đối tượng phụ:

  • Một cho** tiền gửi**: Theo dõi các khoản tiền gửi cá nhân một cách riêng biệt.
  • Một chocho vay mượng: Theo dõi các khoản vay cá nhân một cách riêng biệt.
  • Một chotrạng thái cao: Theo dõi thông tin trạng thái chung (ví dụ: tổng giá trị, lãi suất).

Bằng cách này, một giao dịch sửa đổi một đối tượng phụ (ví dụ: đối tượng concho mượn) không xung đột với một giao dịch sửa đổi đối tượng khác (ví dụ: đối tượng phụ**tiền gửi).

*** Ví dụ 2**: Trong mộtđấu trường trò chơi:

  • Chia trạng thái trò chơi thành các đối tượng phụ cho mỗi người chơi, trạng thái trò chơi và thống kê trận chiến. Điều này làm giảm nguy cơ xung đột khi những người chơi khác nhau tương tác với các trạng thái trò chơi riêng của họ.

Bằng cách chia các trường có thể thay đổi thành**đối tượng con, bạn giảm khả năng nhiều người dùng sẽ cố gắng sửa đổi cùng một đối tượng cùng một lúc.

5.** Các kỹ thuật khác để quản lý đồng thời trong Sui**

*Khóa (Khóa rõ ràng): Mặc dù Sui không yêu cầu bạn xử lý khóa theo cách thủ công, nhưng trong một số trường hợp, bạn có thể muốn thực thikhóa khóabằng cách sử dụngcác đối tượng khóa(các đối tượng riêng biệt đảm bảo chỉ một giao dịch có thể truy cập vào một tài nguyên cụ thể tại một thời điểm).

*** Cách ly theo thời gian**: Nếu các đối tượng của bạn chỉ thỉnh thoảng thay đổi, hãy cân nhắc giới thiệucách ly dựa trên thời gian. Ví dụ: nếu bạn đang quản lý kho tiền hoặc hệ thống bỏ phiếu, hãy đặtthời gian bỏ phiếu hoặchoặccửa sổ giao dịchđể hạn chế tương tác trong một số thời gian nhất định.

6.** Mã ví dụ để quản lý đồng thời với các đối tượng phụ**

Dưới đây là một ví dụ minh họa cách giảm sự tranh chấp bằng cách chiakho cho mượnthành các đối tượng phụ nhỏ hơn:

module LendingVault {

    struct Deposit has store {
        amount: u64,
        depositor: address,
    }

    struct Loan has store {
        amount: u64,
        borrower: address,
    }

    struct VaultState has store {
        total_value: u64,
        interest_rate: u64,
    }

    struct LendingVault has store {
        deposits: vector<Deposit>,
        loans: vector<Loan>,
        vault_state: VaultState,
    }

    // Function to add a deposit
    public fun add_deposit(vault: &mut LendingVault, depositor: address, amount: u64) {
        let deposit = Deposit { amount, depositor };
        Vector::push_back(&mut vault.deposits, deposit);
        vault.vault_state.total_value = vault.vault_state.total_value + amount;
    }

    // Function to add a loan
    public fun add_loan(vault: &mut LendingVault, borrower: address, amount: u64) {
        let loan = Loan { amount, borrower };
        Vector::push_back(&mut vault.loans, loan);
        vault.vault_state.total_value = vault.vault_state.total_value - amount;
    }
}

Tóm tắt

*** Sử dụng các đối tượng được chia sẻkhi nhiều người dùng cần tương tác với cùng một đối tượng đồng thời (ví dụ: phiếu bầu DAO, trạng thái trò chơi, kho cho vay). *** Giảm thiểu tranh cựcbằng cách chia các đối tượng chia sẻ lớn thành các đối tượng phụ nhỏ hơn và giảm số lượng trường có thể thay đổi. *** Tránh thường xuyên xảy ra các lỗi ConflictTransactionbằng cách làm theo các phương pháp hay nhất như phân vùng trạng thái, hoạt động theo lô và sử dụng các hoạt động nguyên tử. *** Logic thử lạivà** kiểm soát đồng thời lạc quan có thể được sử dụng để xử lý xung đột một cách duyên dáng. *** Mô hình giao dịch giải quyết xung độngcủa Sui rất mạnh mẽ, nhưng thiết kế**của các đối tượng được chia sẻ của bạn là chìa khóa để đảm bảo truy cập đồng thời hiệu quả.

Bằng cách tuân theo các nguyên tắc thiết kế này, bạn sẽ có thể quản lý tính đồng thời cao trong các mô-đun dựa trên Move của mình trong khi tránh các cạm bẫy điển hình như** xung động lỗi giao dịch**.

7
Bình luận
.
Evgeniy CRYPTOCOIN.
Jul 31 2025, 09:29

Sử dụngđối tượng được chia sẻđể truy cập nhiều người viết (ví dụ: trò chơi, DAO). Các mẫu chính:

1.** Sở hữu so với Cổ phần**

  • Sở hữu: Người viết đơn (nhanh hơn).
  • Chia sẻ: Ghi đồng thời (gas cao hơn).

2.** Xử lý đồng lịch**

  • Sui tự động sắp xếp các ��ối tượng chia sẻ TX (không có khóa thủ công).
  • Chia dữ liệu nóng thành các đối tượng phụ (ví dụ: 1 cho mỗi người chơi) để giảm xung đột.

3.** Giảm thiểu xung động**

  • Cô lập các trường lưu lượng truy cập cao (ví dụ:Table<ID, PlayerData>).
  • Sử dụng PTB cho các hoạt động đa đối tượng nguyên tử.

Theo dõi: -ConflictTransaction: Chia dữ liệu hoặc cập nhật hàng loạt.

  • Gas gai trên các đối tượng được chia sẻ.
  • (Thời gian chạy của Sui xử lý xung đột — tối ưu hóa thông qua chia dữ liệu. ) *
6
Bình luận
.
Alya.
Alya-14
Jul 30 2025, 17:38

Sử dụngđối tượng được chia sẻ(transfer::share_object) khi nhiều người dùng phải biến đổi cùng một đối tượng (ví dụ: vault, DAO, trạng thái trò chơi). Sử dụngsở hữunếu không.

TransactionLockConflictSui xử lý đồng thời thông quaNarwhal & Tusk consensus: các giao dịch xung đột trên một đối tượng được chia sẻ được nối tiếp — chỉ có một giao dịch thành công cho mỗi vòng; những giao dịch khác thất bại với. Không cần khóa thủ công, nhưng** bạn phải thiết kế để truy xu**.

Các phương pháp hay nhất:

  • Giảm thiểu trạng thái có thể thay đổi trên các đối tượng được chia sẻ; chia các điểm truy cập thành các đối tượng phụ riêng biệt (ví dụ: chia sẻ vault cho mỗi người dùng).
  • Sử dụng VecMaphoặc Tablecho ánh xạ có thể mở rộng.
  • Tránh tính toán chạy dài trong các chức năng được chia sẻ.
  • Phát ra các sự kiện thay vì lưu trữ trạng thái phù du.
  • Đối với các hệ thống có tính cạnh tranh cao, hãy sử dụng các kế hoạchtheo mộthoặccam kết tiết lạiđể giảm xung đột.

Các đối tượng được chia sẻ có thể truy cập trên toàn cầu nhưng có tính khí và sự tranh cãi cao hơn — tối ưu hóa cho idempotence và logic thử lại trong mã máy khách.

5
Bình luận
.
Arnold.
Arnold3036
Jul 31 2025, 08:34

Đối vớiđối tượng được chia sẻtrong Sui Move, hãy sử dụng các mẫu sau để quản lý đồng thời:

####1. Được chia sẻ so với sở hữu? -Đối tượng được chia sẻ (key + store):

  • Sử dụng chotrạng thái toàn cầu(ví dụ: trò chơi, DAO).
  • Cho phép** ghi song bản**(không giống như TX được nối tiếp của EVM).
 struct GameArena has key, store { id: UID, players: vector<address> }

-** Đối tượng sở hữu**:

  • Sử dụng chodữ liệu dành riêng cho người dùng(ví dụ: NFT, ví).
 struct PlayerInventory has key { id: UID, items: vector<Item> }

####2. Xử lý đồng động -** Không có khóa thủ công**: Sui** giải quyết xung đột tự động**(không giống như EVM). -Chia nội dung: Chia các đối tượng được chia sẻ thànhđối tượng phụ nhỏ hơn**(ví dụ: cho mỗi người chơi hoặc mỗi mảnh).

 struct PlayerScore has key, store { id: UID, points: u64 } // Less contention

####3. Giảm l ConflictTransactionỗi -** Isolate Writes**: Cập nhậtcác trường kháctrong các TX riêng biệt. -Sử dụng &mutkhôn ngoan: Tránh các đột biến rộng.

 public entry fun update_score(
     arena: &mut GameArena,
     player: address,
     points: u64
 ) { /* ... */ } // Only touches 1 player’s data

####4. Thực hành tốt nhất -Cập nhật hàng loại: Nhóm các hoạt động không mâu thuẫn (ví dụ: phiếu bầu trong DAO). -Event-Driven: Phát ra các sự kiện thay vì đột biến trạng thái nếu có thể.

 struct VoteEvent has copy, drop { voter: address, choice: u8 }
5
Bình luận
.
JK spike.
Aug 15 2025, 12:39

Sử dụng các đối tượng được chia sẻ để truy cập nhiều người viết (ví dụ: trò chơi, DAO). Các mẫu chính:

Sở hữu vs Chia sẻ

Sở hữu: Người viết đơn (nhanh hơn). Chia sẻ: Ghi đồng thời (khí cao hơn). Xử lý đồng thời

Sui tự động sắp xếp các đối tượng chia sẻ TX (không có khóa thủ công). Chia dữ liệu nóng thành các đối tượng phụ (ví dụ: 1 đối tượng cho mỗi người chơi) để giảm xung đột. Giảm thiểu xung đột

Cô lập các trường lưu lượng truy cập cao (ví dụ: Bảng<ID, PlayerData>). Sử dụng PTB cho các hoạt động đa đối tượng nguyên tử. Theo dõi:

ConflictTransaction: Chia dữ liệu hoặc cập nhật hàng loạt. Gas gai trên các đối tượng được chia sẻ. (Thời gian chạy của Sui xử lý xung đột — tối ưu hóa thông qua chia dữ liệu.)

3
Bình luận
.
Jeff.
Jeff1911
Aug 23 2025, 06:03

In Sui Move, shared objects (marked with key + store) are essential for multi-user interaction but require careful concurrency design. Use them when state must be globally mutable (e.g., games, DAOs), while owned/immutable objects suit single-user scenarios. Sui serializes transactions per shared object automatically, but frequent writes may trigger ConflictTransaction errors—mitigate this by splitting hot fields into separate child objects (e.g., one per user) or batching updates. For high throughput, adopt event-sourcing patterns: store actions as immutable events and aggregate state periodically. Always minimize mutable shared fields and prefer atomic swaps via transfer::share_object over direct mutations

3
Bình luận
.
Bekky.
Bekky1762
Jul 31 2025, 12:26

Đối tượng được chia sẻ so với đối tượng sở hữu: Khi nào nên sử dụng từng đối tượng

Sử dụng các đối tượng được chia sẻ khi:

  • Nhiều người dùng cần phải đột biến cùng một trạng thái
  • Đối tượng đại diện cho một tài nguyên công cộng (như đấu trường trò chơi hoặc DAO)
  • Bạn cần các mẫu truy cập không cấp phép

Sử dụng các đối tượng thuộc sở hữu khi:

  • Chỉ một địa chỉ nên kiểm soát đối tượng
  • Bạn muốn tận dụng hoàn toàn khả năng thực hiện song song của Sui
  • Đối tượng đại diện cho tài sản dành riêng cho người dùng

Chiến lược quản lý đồng thời

1. Mẫu đối tượng phụ (Giảm tranh chấp)

Chia các trường được cập nhật thường xuyên thành các đối tượng riêng biệt:

struct GameArena has key {
    id: UID,
    // Immutable or rarely changed fields
    config: ArenaConfig,
    // Split mutable state
    player_state: Table<address, PlayerState>,
    leaderboard: Leaderboard
}

struct PlayerState has key, store {
    id: UID,
    health: u8,
    score: u64
}

2. Cập nhật hàng loạt với Vector/Bảng

struct DAOVault has key {
    id: UID,
    // Store multiple pending actions
    pending_votes: Table<ID, Vote>,
    pending_deposits: Table<address, Deposit>
}

public entry fun batch_process(
    vault: &mut DAOVault,
    ctx: &mut TxContext
) {
    // Process all pending items at once
    let votes = table::remove_all(&mut vault.pending_votes);
    process_votes(votes);
}

3. Xử lý dựa trên thời đại

struct LendingPool has key {
    id: UID,
    current_epoch: u64,
    next_epoch_data: EpochData,
    current_epoch_data: EpochData
}

public entry fun advance_epoch(pool: &mut LendingPool) {
    let finished = pool.current_epoch_data;
    pool.current_epoch_data = pool.next_epoch_data;
    pool.next_epoch_data = new_epoch_data();
    process_finished_epoch(finished);
}

Kỹ thuật tránh xung đột

1.** Phân vùng cấp trường**:

  struct HighTrafficObject has key {
      id: UID,
      // Split into separate objects per "hot" field
      stats_by_category: Table<u8, CategoryStats>
  }

2.** Hàng đợi thực hiện trễ hạn**:

  struct ActionQueue has key {
      id: UID,
      pending: VecMap<u64, Action>
  }
  
  public entry fun execute_ready_actions(
      queue: &mut ActionQueue,
      ready_up_to: u64
  ) {
      // Processes actions in batches
  }

3.** Đồng thời lạc quan với phiên bản**:

  struct Versioned has key {
      id: UID,
      version: u64,
      data: vector<u8>
  }
  
  public entry fun update(
      obj: &mut Versioned,
      new_data: vector<u8>,
      expected_version: u64
  ) {
      assert!(obj.version == expected_version, EBAD_VERSION);
      obj.data = new_data;
      obj.version = expected_version + 1;
  }

Ví dụ CLI thực tế

Kiểm tra phụ thuộc đối tượng trước khi gửi:

sui client inspect-transaction --serialize-unsigned <TX_BYTES>

Mô phỏng các kịch bản tranh chấp:

sui move test --path <YOUR_PACKAGE> --gas-budget 10000

Tóm tắt các phương pháp hay nhất

1.** Giảm thiểu đột biến đối tượng được chia sẻ**: Thiết kế ghi không thường xuyên vào các đối tượng được chia sẻ 2.** Sử dụng đối tượng nhân**: Phân hủy trạng thái để giảm điểm tranh chấp 3.** Hoạt động hàng loại**: Nhóm các thay đổi liên quan thành các giao dịch đơn lẻ 4.** Xem xét các mô hình hỗn hợp**: Kết hợp các đối tượng sở hữu với sự phối hợp chia sẻ không thường xuyên 5. sui-tool replayMàn hình Hotspots: Sử dụng để phân tích tranh chấp

Hãy nhớ rằng thời gian chạy của Sui tự động xử lý một số đồng thời thông qua mô hình đối tượng của nó, nhưng bạn vẫn cần kiến trúc cấu trúc dữ liệu của mình để giảm thiểu xung đột logic.

2
Bình luận
.
24p30p.
24p30p2038
Jul 31 2025, 05:25

Bạn nên sử dụngđối tượng được chia sẻtrong Sui Move khi nhiều người dùng cần tương tác với cùng một phần trạng thái và những người dùng đó không thuộc cùng một chủ sở hữu. Ví dụ bao gồm đấu trường trò chơi mở cho tất cả người chơi, trình theo dõi phiếu bầu DAO thu thập phiếu bầu từ các địa chỉ khác nhau hoặc một nhóm cho vay mà bất kỳ ai cũng có thể gửi tiền vào. Các đối tượng được chia sẻ có thể truy cập trên toàn cầu và có thể cập nhật thông qua sự đồng thuận, không giống như các đối tượng thuộc sở hữu**, được gắn với một địa chỉ duy nhất và được sửa đổi mà không có sự đồng thuận đầy đủ.

Sui xử lý đồng thời trên các đối tượng được chia sẻ bằng cách yêu cầu sự đồng thuận đầy đủ cho bất kỳ giao dịch nào làm biến đổi chúng. ConflictTransactionKhi hai người dùng cố gắng đột biến cùng một đối tượng chia sẻ cùng một lúc, chỉ có một giao dịch thành công — những giao dịch khác bị từ chối với một lỗi. Điều này làm cho các đối tượng được chia sẻ trở nên mạnh mẽ nhưng cũng gây ra các vấn đề tranh cãi khi không được thiết kế cẩn thận.

Để hỗ trợ tính đồng thời cao mà không gặp phải ConflictTransactionlỗi thường xuyên, bạn nên sử dụngcác mẫu thiết kế cách ly trạng thái có thể thay đổi. Thay vì lưu trữ tất cả dữ liệu có thể thay đổi trong một đối tượng được chia sẻ duy nhất, hãy chia nó thành nhiều đối tượng con — mỗi đối tượng có quyền sở hữu hoặc trạng thái chia sẻ riêng. Ví dụ: trong một đấu trường trò chơi:

struct Arena has key, store {
    game_id: u64,
    players: vector<address>,
}

struct PlayerState has key, store {
    hp: u64,
    energy: u64,
}

Tạo Arenachia sẻ, nhưng cung cấp cho mỗi PlayerStateđối tượng được chia sẻ của riêng mình. Bằng cách đó, những người chơi khác nhau có thể cập nhật trạng thái của họ một cách độc lập mà không mâu thuẫn.

Một mô hình khác là chiến lược** “index + bucket”**: giữ một đối tượng chỉ mục được chia sẻ trỏ đến các nhóm hoặc mục nhập riêng lẻ. Chỉ truy cập vào chỉ mục để lấy đúng mục nhập, sau đó vận hành trên chính mục nhập đó. Điều này làm giảm số lượng trùng lặp giữa các giao dịch của người dùng.

Nếu bạn cần sắp xếp nghiêm ngặt (ví dụ: đối với đấu giá), hãy thực hiệnxếp hàng thủ côngbằng cách sử dụng vectơ hoặc bản đồ bên trong đối tượng được chia sẻ—nhưng hãy biết rằng mỗi đột biến vẫn cần sự đồng thuận và có thể thất bại khi tải. Trong những trường hợp đó, hãy xem xét việc dỡ thứ tự xuống giao diện người dùng hoặc viết theo lô.

Tóm lại:

  • Sử dụng các đối tượng được chia sẻ khi trạng thái phải được truy cập bởi nhiều người dùng độc lập.
  • Tránh đặt tất cả các trường có thể thay đổi vào một đối tượng được chia sẻ duy nhất - chia chúng thành các đối tượng phụ.
  • Sử dụng các đối tượng con động được chia sẻ+để giảm tỷ lệ xung đột.
  • Mong đợi ConflictTransactionlỗi trong trường hợp tranh chấp cao và thử lại trên giao diện người dùng.
  • Thích cập nhật chỉ bổ sung nếu có thể, thay vì đột biến tại chỗ.
0
Bình luận
.
yungrazac.
Aug 22 2025, 10:03

Khi bạn thiết kế với các đối tượng được chia sẻ trong Sui Move, về cơ bản bạn đang lựa chọn giữasự tiện lợi cho quyền truy cập nhiều người dùngnguy cơ tranh động. Vì Sui sử dụng mô hình hướng đối tượng và hướng tài nguyên, mô hình phù hợp phụ thuộc vào việc trường hợp sử dụng của bạn yêu cầu truy cập hợp tác hay kiểm soát cô lập. Dưới đây là một cách có cấu trúc để suy nghĩ về nó:


###Khi nào nên sử dụng đối tượng được chia sẻ so với đối tượng sở hữu

*** Các đối tượng thuộc sở hữulà tốt nhất khi một người dùng cần toàn quyền kiểm soát tài sản (ví dụ: tiền của ví, hàng tồn kho của người chơi hoặc NFT duy nhất). Các giao dịch liên quan đến chúng sẽ không xung đột trừ khi cùng một đối tượng đó được sử dụng lại. *** Đối tượng được chia sẻcó ý nghĩa khi nhiều người dùng cần đọc hoặc ghi vào cùng một trạng thái (ví dụ: bản ghi quản trị DAO, bảng xếp hạng đấu trường trò chơi, kho tiền cho vay). Chúng cho phép truy cập toàn cầu mà không cần chuyển khoản được cấp phép, nhưng chúng đi kèm với những thách thức về đồng thời.


###** Quản lý đồng thời trong Sui**

ConflictTransactionThời gian chạy của Sui tự động nối tiếp các giao dịch chạm vào cùng mộtđối tượng chia sẻ có thể thay đổi, nghĩa là nếu hai người dùng cố gắng cập nhật cùng một đối tượng chia sẻ, một đối tượng sẽ thành công và người kia sẽ gặp lỗi. Bạn không cần phải mã hóa các khóa hoặc hàng đợi theo cách thủ công — giải quyết xung đột được xử lý ở lớp thực thi. Tuy nhiên, xung đột thường xuyên có thể làm giảm thông lượng, vì vậy công việc của bạn làthiết kế bố cục trạng thái giảm thiểu sự chồng chấp.


###** Các phương pháp hay nhất để tránh xung đột thường thường**

*** Chia trạng thái có thể thay đổi**: Thay vì một “đối tượng lớn” duy nhất, hãy chia nó thành các đối tượng con nhỏ hơn. Ví dụ, trong kho cho vay, hãy tách vị trí của mỗi người dùng thành đối tượng thuộc sở hữu của riêng họ hoặc được chia sẻ một phần, để lại bản thân kho chủ yếu là tĩnh. Điều này làm giảm sự tranh chấp viết. Sử dụng các trường bất biến nếu có thể: Lưu trữ siêu dữ liệu hoặc dữ liệu tham chiếu trong các đối tượng phụ bất biến để các giao dịch chỉ đọc không va chạm với các đối tượng ghi. Hoạt động hàng loạt cẩn thích: Nếu thiết kế hợp đồng của bạn yêu cầu nhiều lần ghi vào cùng một đối tượng được chia sẻ, hãy cân nhắc việc phân nhóm chúng vào một khối giao dịch duy nhất để tránh nhiều xung đột. *** Các mẫu chia sẻ: Đối với những thứ như bảng xếp hạng hoặc DAO, hãy chia nhỏ trạng thái theo nhóm, vòng hoặc định danh để không phải tất cả các giao dịch đều đạt cùng một đường dẫn đối tượng.


###Những cạm bẫy cần chú ý

*** Các đối tượng được chia sẻ nguyên động**: Đặt mọi thứ vào một đối tượng được chia sẻ gây ra tranh chấp cao và xung đột liên tục khi tải. Lạm dụng các đối tượng được chia sẻ: Nếu dữ liệu có thể được mô hình hóa như thuộc sở hữu, hãy chọn tuyến đường đó hơn — nó rẻ hơn và ít có khả năng tắc nghẽn hơn. *** Bỏ qua các mẫu truy cập*: Nếu hầu hết các tương tác được đọc với ít lần ghi, hãy thiết kế xung quanh ảnh chụp nhanh bất biến thay vì một trạng thái chia sẻ có thể thay đổi.


###Ví dụ thực tực

Hãy tưởng tượng việc xây dựng một trình theo dõi bỏ phiếu DAO:

*** Mẫu xấu: Một đối tượng được chia sẻ duy nhất lưu trữ mọi phiếu bầu, được cập nhật bởi tất cả những người tham gia. *** Mẫu tốt hơn**: Mỗi cử tri tạo một Voteđối tượng thuộc sở hữu tham chiếu đề xuất, trong khi đối tượng DAO được chia sẻ chỉ tổng hợp kết quả theo định kỳ. Bằng cách này, bỏ phiếu song song không va chạm.


###Khối giao dịch

Đầu vào → Người dùng gửi giao dịch đối với các đối tượng được chia sẻ hoặc sở hữu. Quá trình → Thời gian chạy của Sui tuần tự hóa các giao dịch trên cùng một đối tượng chia sẻ có thể thay đổi. Kết quả → Việc viết thành công được thực hiện, những người khác gặp lỗi xung đột; việc tách các đối tượng làm giảm khả năng xảy ra xung đột.


0
Bình luận
.
Sato$hii.
Aug 23 2025, 00:02

Great questions—this is exactly the crux of building “high-fanout” apps on Sui. Here’s a practical playbook you can follow.

🧭 When to use a shared object (vs owned)

Use a shared object only when multiple independent parties must mutate the same piece of state and you need one canonical result (e.g., AMM pool reserves, an arena’s match registry, a DAO proposal’s tally). Prefer owned objects when the state is per-user, per-position, or per-item and can evolve independently (inventories, user balances, open positions).

Rule of thumb: put the coordination surface in a shared object, and everything else in owned objects that can run in parallel.


⚙️ What Sui does with concurrent access

  • Any tx that mutates a shared object goes through consensus and is totally ordered. Conflicting writes to the same fields are serialized; others proceed in parallel.
  • You don’t manually lock; you design to avoid hotspots. Conflicts show up as ConflictTransaction when many txs try to bump the same version.

🏗️ High-concurrency design patterns (with Move tips)

1) Root-manager + owned positions

Keep a minimal shared root; put user/position state in owned objects so deposits/claims mostly touch owned data.

module example::vault {
    use sui::tx_context::TxContext;

    struct Vault has key { /* config only; no growing vectors */ }
    struct Position has key { owner: address, /* state */ }

    /// Shared root only needed to mint/close positions or checkpoint.
    public entry fun open_position(v: &mut Vault, ctx: &mut TxContext): Position { /* ... */ }

    /// Hot path touches owned Position only → parallel.
    public entry fun deposit(pos: &mut Position, amount: u64) { /* ... */ }
}

Why it scales: most traffic avoids the shared root altogether.


2) Shard by key (dynamic fields / tables)

Instead of one big shared map, create N shard objects (shared) under a registry and route by hash(key) % N. Each shard is a separate contention domain.

/// registry is shared; it stores IDs of shard objects
struct Registry has key { shards: vector<ID> }

/// choose shard once and keep it stable for that key
fun shard_for(reg: &Registry, key: &vector<u8>): ID { /* hash(key) % len */ }

Tip: don’t update the registry on every user op; mutate only the target shard.


3) Dynamic fields on a shared “anchor”, not growing vectors

Avoid vector.push on a shared object (resizes = conflicts). Use dynamic fields (key → value) so each entry mutates independently.

SharedAnchor
  └─ df[key=user] = tiny record (or pointer to owned object)

Move APIs: sui::dynamic_field::{add, borrow_mut, remove}.


4) Two-phase “ticket” pattern

Have the shared object mint a ticket/capability (owned) that authorizes a later operation done off the hot path.

  1. Light touch on shared root → mint Ticket.
  2. User completes heavy work by presenting the Ticket and mutating only owned/child objects.

Reduces churn on the shared root, and gives you idempotency (ticket can be one-time-use).


5) Append-only events, deferred aggregation

If you’re tempted to keep a total_* counter on the shared root (a hotspot), emit events on each action and aggregate off-chain or in a periodic checkpoint entry that rolls up per-shard totals.


6) Split mutable fields into sub-objects

If one field changes much more frequently (e.g., queue head), peel it into its own child object (owned or shared as needed). Then updates don’t bump the root’s version.


🧪 Avoiding ConflictTransaction in practice

  • Keep the cut set small: Each entry function should touch as few objects as possible.
  • No growing vectors on shared roots; use dynamic fields or sharded children.
  • Stable routing: Deterministic key→shard mapping; never rehash live keys.
  • Idempotency: Use tickets/nonces so retries don’t double-apply.
  • Batch carefully: If you must touch multiple entries atomically, use a PTB—but keep it within a single shard when possible.
  • Backoff & retry: On the client, exponential backoff for known conflict aborts.

🔍 Minimal conflict checklist

  • Shared root is configuration + pointers only.
  • Hot paths mutate owned positions or sharded children.
  • Per-user/per-item state is not inside the root.
  • No vector.push on shared; use dynamic fields.
  • Periodic checkpoint function consolidates, not every tx.

🛡️ Security & correctness notes

  • Gate privileged ops with capabilities (e.g., AdminCap, MintCap); store caps in owned objects, not globals.
  • Validate invariants in shared entry points (sum of shard totals, proposal status transitions, etc.).
  • Emit events for auditability; they are cheap and conflict-free.

Quick templates by use case

  • Game arena: Shared Arena (config/match index) + owned Player / Loadout. Match joins go to Shard[hash(match_id)].
  • DAO voting: Shared Proposal (immutable metadata) + dynamic fields per voter or owned Ballot tickets. Tally via periodic checkpoint.
  • Lending vault: Shared Registry + owned Positions; price/oracle reads are immutable; rebalances via sharded pools.

0
Bình luận
.

Bạn có biết câu trả lời không?

Hãy đăng nhập và chia sẻ nó.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

1166Bài viết3581Câu trả lời
Sui.X.Peera.

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.

Chiến dịch phần thưởngTháng Tám