Bài viết
Chia sẻ kiến thức của bạn.
Một hợp đồng thông minh có thể sở hữu và biến đổi trạng thái đối tượng của chính nó trong Sui không?
Tôi đang cố gắng hiểu khía cạnh này của Mạng Sui bởi vì tôi đang xây dựng, gỡ lỗi hoặc triển khai thứ gì đó chạm vào khu vực này. Tôi muốn giải thích chi tiết về cách cơ chế hoặc tính năng này hoạt động, cùng với cách sử dụng CLI có liên quan, cấu trúc mã di chuyển hoặc các khái niệm kiến trúc. Mục tiêu của tôi là đạt được đủ sự rõ ràng để áp dụng kiến thức này vào một dự án thực tế — cho dù đó là hợp đồng thông minh tùy chỉnh, hệ thống NFT, tích hợp ví hay công cụ DeFi. Mạng Sui có những tính năng độc đáo so với chuỗi EVM, vì vậy tôi đặc biệt quan tâm đến điều gì khiến nó khác biệt và điều đó ảnh hưởng như thế nào đến các thực tiễn phát triển tốt nhất. Sẽ rất hữu ích nếu có mã mẫu, ví dụ dòng lệnh hoặc các lỗi điển hình để theo dõi, đặc biệt là khi sử dụng Sui CLI, SDK hoặc triển khai trên localnet/testnet. Cuối cùng, tôi muốn tránh những sai lầm phổ biến, tuân theo các nguyên tắc bảo mật tốt nhất và đảm bảo rằng chức năng tôi đang làm việc hoạt động như mong đợi trong các điều kiện thực tế.
- Sui
- Architecture
- Move
Câu trả lời
15Trong Sui, một hợp đồng thông minh không thể trực tiếp sở hữu hoặc biến đổi trạng thái đối tượng của chính nó. Thay vào đó, hợp đồng tương tác với các đối tượng thông qua mô hình sở hữu, trong đó các đối tượng được sở hữu bởi các địa chỉ cụ thể (ví dụ: ví của người dùng hoặc tài khoản). Hợp đồng thông minh trong Sui có thể xác định và sửa đổi trạng thái của các đối tượng thuộc sở hữu của các bên khác (ví dụ: người dùng), nhưng họ không thể tự sở hữu đối tượng.
Các khái niệm chính:
*Quyền sở hữu đối tượng: Các đối tượng được sở hữu bởi địa chỉ, không phải hợp đồng. *Tương tác với đối tượng: Hợp đồng có thể thao tác trạng thái của một đối tượng, nhưng chỉ khi nó có quyền truy cập vào đối tượng đó thông qua quyền sở hữu hoặc tham chiếu có thể thay đổi.
Mã ví dụ:
module MyModule {
use sui::object::{Object, move_to};
public fun update_object_state(obj: &mut Object) {
// Modify the state of the object owned by someone else
obj.some_field = 42;
}
}
Cách sử dụng CLI:
Khi triển khai, hợp đồng chỉ có thể thao tác các đối tượng thuộc sở hữu của một địa chỉ, không phải chính nó.
Thực hành tốt nhất:
- Đảm bảo hợp đồng tôn trọng mô hình sở hữu của Sui, chuyển đối tượng giữa hợp đồng và tài khoản người dùng.
- Luôn quản lý quyền một cách an toàn để tránh truy cập trái phép vào trạng thái đối tượng.
Hợp đồng thông minh có thể sở hữu và biến đổi trạng thái đối tượng của chính nó trong Sui không?
Không, ở Sui,hợp đồng thông minh không thể trực tiếp sở hữu hoặc biến đổi trạng thái của chính mình. Quyền sở hữu và đột biến tài nguyên (như các đối tượng tiền xu hoặc các đối tượng tùy chỉnh) được điều chỉnh bởi tài khoản người dùng hoặc địa chỉ được ủy quyền, không phải bản thân hợp đồng.
Điểm chính:
*Quyền sở hữu: Các hợp đồng thông minh trong Sui không có quốc tịch; chúng định nghĩa logic nhưng không sở hữu hoặc lưu trữ trạng thái. *Quyền sở hữu tài lượng: Tài nguyên (như tiền xu hoặc các đối tượng tùy chỉnh) phải thuộc sở hữu của một địa chỉ hoặc một tổ chức, không phải bởi hợp đồng.
Lưu lượng điển hình:
1.Quyền sở hữu tài khoản: Một địa chỉ hoặc người dùng sở hữu đối tượng (ví dụ: một đồng xu). 2.** Thực thi hợp đồng thông minh**: Hợp đồng có thể sửa đổi trạng thái của các đối tượng được chủ sở hữu chuyển cho nó.
Lưu lượng ví dụ:
1.** Người dùng tạo một đối tượng**(ví dụ: một đồng xu). 2.** Người dùng chuyển đối tượng**vào hợp đồng đột biến. 3. Hợp đồng sửa đổi đối tượng nhưng không sở hữu nó.
Mã di chuyển mẫu:
public fun mutate_object(owner: &mut Address, coin: &mut Coin) {
Coin::transfer(coin, &mut owner);
}
Ví dụ về CLI:
Triển khai một hợp đồng và gọi một hàm để biến đổi trạng thái của một đối tượng:
sui client publish --gas-budget 10000 --module <module-path>
Những sai lầm phổ biến:
*** Lầm lẫn về quyền sở hữu**: Cố gắng sửa đổi hoặc truy cập trạng thái không thuộc sở hữu của hợp đồng sẽ dẫn đến lỗi.
&mut
*** Khả năng thay đổi không chính xót**: Đảm bảo đối tượng được chuyển đến hợp đồng là có thể thay đổi ().
Thực hành tốt nhất:
Đảm bảo quyền sở hữu thích hợp: Đảm bảo địa chỉ chính xác sở hữu các đối tượng được chuyển vào hợp đồng. *** Kiểm tra với Localnet/Testnet*: Luôn xác minh logic hợp đồng và thay đổi trạng thái trước khi triển khai lên mainnet.
Trong Sui, các hợp đồng thông minh (Move package)** không thể trực tiếp sở hữu hoặc tự biến đổi các đối tượng do mô hình sở hữu lấy đối tượng làm trung tâm của Sui. Các đối tượng phải thuộc sở hữu của mộtđịa chỉ,đối tượng khác, hoặc được đánh dấu làshared/immutable- các gói chỉ chứa logic mã. Đối với đột biến tự trị, bạn thường sử dụngđối tượng được chia sẻ(với sự đồng thuận) hoặc** trường độngtrong đó các đối tượng cha mẹ kiểm soát các đối tượng con. Điều này khác về cơ bản với việc lưu trữ hợp đồng của EVM, yêu cầu chuyển quyền sở hữu rõ ràng thông qua các giao dịch thay vì hành động hợp đồng nội bộ. Các mẫu phổ biến liên quan đến việcgói các đối tượngtrong các thùng chứa do quản trị viên kiểm soát hoặc sử dụngthiết kế dựa trên khả năng**để quản lý các đột biến trạng thái một cách an toàn.
Vâng, ở Sui, một hợp đồng thông minhcó thể biến đổi trạng thái đối tượng của chính nó, nhưng** nó không thể sở hữu các đối tượng một cách độc lập**. Trong mô hình tập trung đối tượng của Sui,** mọi đối tượng phải thuộc sở hữu của một địa chỉ, một đối tượng khác hoặc được đánh dấu là chia sẻ**. Hợp đồng thông minh không có địa chỉ như trong chuỗi EVM (ví dụ: Ethereum), vì vậy bạn phải dựa vào các mô hình sở hữu đối tượng* nhưcấu trúc dữ liệu bọc đối tượnghoặc** đối tượng được chia sẻ**để tồn tại và đột biến trạng thái trên các giao dịch.
Để cập nhật trạng thái nội bộ của hợp đồng, bạn thường thiết kế struct
(với key
khả năng) để lưu trữ dữ liệu trạng thái, chuyển nó cho entry
chức năng của bạn và thực hiện cập nhật thông qua các tài liệu tham khảo. Quyền sở hữu cấu trúc này thuộc về người dùng hoặc được đánh dấu là chia sẻ để cho phép truy cập rộng hơn.
Ví dụ - Thay đổi trạng thái nội bộ thông qua Đối tượng thuộc sở hữu
module example::counter {
use sui::object::{Self, UID};
use sui::tx_context::{Self, TxContext};
struct Counter has key {
id: UID,
value: u64,
}
public entry fun create(ctx: &mut TxContext): Counter {
Counter { id: object::new(ctx), value: 0 }
}
public entry fun increment(counter: &mut Counter) {
counter.value = counter.value + 1;
}
}
create
Trong ví dụ này, Counter
khởi tạo một đối tượng. increment
chỉ có thể được gọi bằng cách truyền một tham chiếu có thể thay đổi đến đối tượng đó. Quyền sở hữu thuộc về người dùng hoặc đối tượng khác, không phải bản thân hợp đồng.
Đối tượng được chia sẻ để truy cập toàn cầu
shared
Nếu hợp đồng của bạn cầnnhiều người dùng tương tác với cùng một đối tượng, hãy đánh dấu nó là. Ví dụ các trường hợp sử dụng: DAO, bộ đếm toàn cầu, trò chơi trên chuỗi.
public entry fun increment_shared(counter: &mut Counter) {
counter.value = counter.value + 1;
}
Khi triển khai hoặc thông qua một hàm rõ ràng, bạn phải chia sẻ đối tượng:
sui client call \
--function share_object \
--module counter \
--package <package_id> \
--args <counter_id>
Mẹo CLI:
- Để xem quyền sở hữu:
sui client object <object_id>
- Để đột biến: sử dụng
--mut
cờ hoặc xác định&mut
trong chức năng nhập - Đối với đột biến được chia sẻ: đảm bảo đối tượng được công bố như
shared
trước đột biến
Tích hợp SDK (TS):
tx.moveCall({
target: `${packageId}::counter::increment`,
arguments: [tx.object(counterId)]
});
Thực hành tốt nhất:
- Tránh cố gắng lưu trữ tham chiếu đối tượng bên trong các đối tượng khác trừ khi cần thiết.
- Nếu bạn cần khả năng thay đổi toàn cầu,** đối tượng được chia sẻ**là cách tiếp cận chính xác.
- Sử dụng
UID
vàkey
khả năng đảm bảo các đối tượng có thể tồn tại trên các giao dịch. - Luôn xác nhận rằng người gọi có quyền đột biến, đặc biệt là đối với các đối tượng được chia sẻ.
Lỗi thường gặp:
Cannot find mutable reference
- Bạn đang truyền một đối tượng bất biến trong đó yêu cầu có thể thay đổi.Object is not shared
- Bạn đang cố gắng đột biến một đối tượng chưa được chia sẻ.Type mismatch
— Thường gây ra bởi các thuốc generic không chính xác hoặc lạm dụng tài liệu tham khảo.
Bạn có thể đọc thêm về quyền sở hữu và các đối tượng được chia sẻ trong tài liệu nhà phát triển của Sui.
Trong mạng Sui, các hợp đồng thông minh không thể “sở hữu” các đối tượng theo nghĩa EVM truyền thống vì quyền sở hữu luôn gắn liền với một địa chỉ hoặc một đối tượng khác. Tuy nhiên, các hợp đồng thông minh được viết trong Move có thể xác định và biến đổi các đối tượng trạng thái tùy chỉnh của riêng chúng — đây thường là các đối tượng được chia sẻ hoặc các đối tượng thuộc sở hữu được truyền bởi người dùng.
Khái niệm chính
- Quyền sở hữu đối tượng tại Sui: Mọi đối tượng đều thuộc sở hữu của:
Địa chỉ người dùng (địa chỉ),
Một đối tượng khác (quyền sở hữu lồng nhau),
Được chia sẻ (có thể truy cập cho tất cả),
Không thể thay đổi (không thể thay đổi sau khi xuất bản).
-
Trạng thái hợp đồng thông minh: Để tạo trạng thái hợp đồng, các nhà phát triển xác định cấu trúc trong Move module và xuất bản các phiên bản của các cấu trúc này dưới dạng đối tượng. Các đối tượng này sau đó được chuyển đến các hàm nhập nơi trạng thái của chúng có thể được đọc hoặc sửa đổi.
-
Trạng thái đột biến: Để thay đổi trạng thái đối tượng của hợp đồng thông minh, bạn phải:
Chuyển đối tượng vào hàm dưới dạng &mut.
Đảm bảo nó có thể thay đổi và sở hữu/chia sẻ theo yêu cầu.
Có quyền truy cập chính xác.
- Đối tượng được chia sẻ cho trạng thái toàn cầu: Nếu bạn muốn trạng thái toàn cầu, toàn hợp đồng, bạn sử dụng các đối tượng được chia sẻ:
struct Counter có khóa, lưu trữ, sao chép { giá trị: u64, }
gia tăng vui chơi cho mục nhập công khai (bộ đếm: & mut Counter) { đường.giá trị = bộ đến.giá trị + 1; }
- Xuất bản đối tượng được chia sẻ:
Các đối tượng được chia sẻ phải được tạo và chia sẻ một cách rõ ràng khi khởi tạo.
Sử dụng move call hoặc Sui CLI --gas-budget và --shared-object-input để tương tác với chúng.
- Quy trình triển khai ví dụ:
Triển khai mô-đun với sui move publish.
Gọi một hàm mục nhập để tạo một đối tượng được chia sẻ:
cuộc gọi khách hàng sui
<PACKAGE_ID>--gói\
- bộ đếm mô-đun
--hàm create_counter
--args 0\ - ngân sách khí đốt 10000
Sau đó gọi increment với ID đối tượng của đối tượng được chia sẻ.
- Hạn chế:
Hợp đồng thông minh không lưu trữ trạng thái nội bộ như trong Solidity.
Chúng hoạt động trên các đối tượng được truyền cho họ một cách rõ ràng.
Không có “lưu trữ hợp đồng” liên tục tồn tại bên trong mô-đun.
- Bảo mật và quyền sở hữu:
Bạn phải xác thực quyền sở hữu theo cách thủ công hoặc thông qua các khả năng.
Việc sử dụng các mẫu kiểm soát truy cập như AdminCap hoặc Whitelist để chuyển đổi đột biến là điều phổ biến.
- Thực tiễn tốt nhất:
Tránh chia sẻ đồ vật không cần thiết để hạn chế sử dụng khí đốt và tranh chấp.
Tận dụng các khả năng hoặc kiểm tra địa chỉ để quản lý quyền truy cập một cách an toàn.
Sử dụng có khóa và lưu trữ đúng cách để kích hoạt tính bền vững và khả năng thay đổi của đối tượng.
- Các lệnh CLI cần xem:
cuộc gọi máy khách sui cho các cuộc gọi chức năng.
đối tượng khách hàng sui
kiểm tra sui move cho logic trạng thái kiểm tra đơn vị.
Trong Sui, một hợp đồng thông minh được viết bằng Move không thể thực sự sở hữu* đối tượng của chính nó theo nghĩa tương tự như một hợp đồng EVM tự tham chiếu có thể giữ và biến đổi trạng thái nội bộ một cách tự chủ. Kiến trúc tập trung vào đối tượng của Sui có nghĩa là tất cả các đối tượng phải được chuyển rõ ràng vào bối cảnh giao dịch và quyền sở hữu của chúng là dựa trên tài khoản hoặc chia sẻ. Bản thân các hợp đồng thông minh không có trạng thái — chúng chỉ xác định logic. Trạng thái thực tế tồn tại trong các đối tượng Move, phải được truyền đến các hàm để đọc hoặc đột biến.
Để biến đổi đối tượng trạng thái của hợp đồng, bạn cần cấu trúc mô-đun của mình sao cho dữ liệu của nó (thường được lưu trữ trong một has key
cấu trúc) là:
*** Được sở hữu bởi địa chỉ người dùng**(hữu ích cho logic theo phạm vi tài khoản),
*** Chia sẻ thông qua share_object()
**(để hỗ trợ nhiều diễn viên như trong DeFi, DAO, trò chơi, v.v.).
Khi sử dụng các đối tượng được chia sẻ, bạn phải đánh dấu các hàm của entry
mình với và chuyển đối tượng được chia sẻ làm &mut
tham chiếu.
Dưới đây là một ví dụ về trạng thái chia sẻ có thể bị đột biến:
module my_app::vault {
use sui::object::{UID, ID};
use sui::tx_context::TxContext;
struct Vault has key {
id: UID,
balance: u64,
}
public fun init(ctx: &mut TxContext): Vault {
Vault { id: object::new(ctx), balance: 0 }
}
public entry fun deposit(vault: &mut Vault, amount: u64) {
vault.balance = vault.balance + amount;
}
}
Trong ví dụ này, Vault
phải là một đối tượng được chia sẻ nếu bạn muốn nó có thể truy cập bởi nhiều người dùng thông qua entry
các hàm. Khi triển khai, bạn chia sẻ đối tượng như sau:
sui client call --function share_object --args <vault_id>
Sau khi chia sẻ, bất kỳ entry
hàm nào cũng có thể biến đổi đối tượng — miễn là nó nhận nó dưới dạng đầu vào. Sui đảm bảo an toàn thông qua các quy tắc sở hữu và phiên bản để ngăn chặn các điều kiện đua.
Để tìm hiểu thêm về cách các hợp đồng thông minh trong Sui tương tác với trạng thái đối tượng, quyền truy cập chia sẻ và quyền sở hữu, hãy truy cập: [https://docs.sui.io/build/programming-model/object-basics](https://docs.sui.io/build/programming-model/object-basics]
Cách tiếp cận này là điều khiến Sui khác biệt với chuỗi EVM. Bạn không thay đổi trực tiếp bộ nhớ hợp đồng nội bộ. Thay vào đó, bạn biến đổi các đối tượng Move được truyền rõ ràng vào các hàm logic của bạn, điều này giúp tăng cường tính đồng thời và khả năng xác minh.
Không, một hợp đồng thông minh (Move module) không thể trực tiếp sở hữu hoặc biến đổi trạng thái đối tượng của chính nó trong Sui.
Đối tượng là các thực thể hạng nhất thuộc sở hữu của địa chỉ, các đối tượng khác hoặc được chia sẻ —** không**bởi các mô-đun. Đột biến trạng thái xảy ra thông qua các hàm lấy các đối tượng làm tham số có thể thay đổi, với các quy tắc sở hữu được thực thi ở cấp giao dịch.
Ví dụ:
struct Counter has key { id: UID, value: u64 }
public entry fun increment(counter: &mut Counter) { counter.value = counter.value + 1 }
H increment
àm Counter
chỉ có thể đột biến khi giao dịch chuyển một tham chiếu có thể thay đổi đến một đối tượng thuộc sở hữu của người gửi. Bản thân mô-đun không giữ trạng thái.
Sử dụng shared
object (transfer::share_object
) cho trạng thái liên tục, có thể truy cập toàn cầu. Luôn xác thực quyền sở hữu object::is_owner()
và tuân theo các quy tắc kiểu tuyến tính.
Có, hợp đồng thông minh Sui (gói Move) có thể sở hữu và biến đổi trạng thái của chính nó thông qua** đối tượng được chia sẻhoặc trường đối tượng động động**, không giống như thiết kế không trạng thái của EVM.
####Cơ chế chính 1.** Đối tượng được chia sẻ**:
- Bất cứ ai có thể thay đổi toàn cầu (có quy tắc).
- Được xác định với
key + store
và sở hữu bởi0x0
(địa chỉ gói).
struct ContractState has key, store {
id: UID,
value: u64,
}
2.** Trường đối tượng động động**:
- Gói có thể “sở hữu” các đối tượng bằng cách lưu trữ ID của chúng.
fun add_state(ctx: &mut TxContext) {
let state = ContractState { id: object::new(ctx), value: 42 };
transfer::share_object(state); // Make it globally mutable
}
###Tại sao Sui lại độc đánh -Không có “msg.sender": Kiểm soát truy cập thông qua hệ thống loại Move, không phải EOAs. -** Đột biến song biển**: Các đối tượng được chia sẻ cho phép ghi đồng thời (không giống như TX được nối tiếp của EVM).
###Ví dụ CLI
# Call a function that mutates shared state
sui client call \
--function update_state \
--module your_module \
--package 0xYOUR_PACKAGE \
--args 0xSHARED_OBJECT_ID 100 \ # New value
--gas-budget 10000000
###Cạm bẫy phổ biến
1.** Chia sẻ quá đó**: Tránh share_object
trừ khi thực sự cần thiết (sử dụng transfer::transfer
cho quyền sở hữu tư nhân).
2. sui::lock
Điều kiện cuộc đội: Thiết kế để truy cập song song (ví dụ: sử dụng).
Đúng vậy, một hợp đồng thông minh trong Sui có thể biến đổi trạng thái đối tượng của chính nó, nhưng nó phải làm như vậy thông qua các đối tượng được truyền rõ ràng vào các chức năng của nó. Trong mô hình đối tượng của Sui, không có lưu trữ hợp đồng nội bộ như trong Ethereum; thay vào đó, trạng thái được duy trì thông qua các đối tượng có thể thay đổi. Các đối tượng này có thể được sở hữu bởi người dùng hoặc được chia sẻ trên mạng. Để biến đổi trạng thái, bạn xác định một cấu trúc với khả năng has key, sau đó viết các hàm mục nhập chấp nhận tham chiếu &mut đến đối tượng. Các đối tượng được chia sẻ cho phép truy cập toàn cầu và được yêu cầu khi nhiều người dùng cần tương tác với cùng một trạng thái. Đổi các đối tượng được chia sẻ yêu cầu đánh dấu chức năng là mục nhập công khai và truyền ID đối tượng chính xác trong khi gọi. Các hợp đồng không “sở hữu” trạng thái trực tiếp; thay vào đó, chúng hoạt động trên dữ liệu được truyền cho họ thông qua các đối số. Bạn có thể thực thi kiểm soát truy cập bằng cách sử dụng các khả năng hoặc bằng cách kiểm tra địa chỉ người gửi. Thiết kế này hỗ trợ tính song song cao, khả năng mở rộng tốt hơn và cho phép hạt mịn. Nhìn chung, các hợp đồng thông minh trong trạng thái Sui đột biến bằng cách sửa đổi các đối tượng do chuyển động xác định theo các quy tắc quyền sở hữu và truy cập nghiêm ngặt.
Có, hợp đồng thông minh Sui (Move module) có thể sở hữu và biến đổi các đối tượng của chính nó thông qua:
1.** Đối tượng sở hữu**- Được tạo trong quá trình khởi động mô-đun (được lưu trữ dưới ID gói).
2.** Đối tượng được chia sẻ**- Được đánh dấu shared
để truy cập nhiều người viết.
###** Sự khác biệt chính so với EVM:** ✔** Không có chủ sở hữu bên ngoài**- Các đối tượng có thể thuộc về chính gói. ✔** Đột biến trực tiếp**- Không cần hệ thống phê duyệt (không giống như ERC-20).
Mẫu ví dụ:
struct MyState has key { id: UID, value: u64 }
// Module can mutate its own object
public fun update(self: &mut MyState) { self.value += 1 }
Theo dõi:
- Chi phí lưu trữ đối với các đối tượng sở hữu.
- Sử dụng
shared
cho trạng thái toàn cầu.
- (Mô hình đối tượng của Sui cho phép hợp đồng tự động — không yêu cầu ví proxy. ) *
###1. Khái niệm cốt lõi: Quyền sở hữu lấy đối tượng làm trung tâm Không giống như các biến lưu trữ của EVM, hợp đồng thông minh Sui hoạt động thông qua các đối tượng sở hữu**có thể bị đột biến dựa trên các quy tắc sở hữu nghiêm ngặt.
####** Các tính năng chính**
| Tính năng | Sui | EVM |
| --------------| -----|
| Biểu diễn trạng thái | Đối tượng có UID | Biến lưu trữ |
| Quyền sở hữu | key
Khả năng rõ ràng | Ngụ ý hợp đồng |
| Tính thay đổi | tài &mut
liệu tham khảo | Sửa đổi trực tiếp |
###2. Di chuyển các mẫu thực hiện
####Hợp đồng tự sở hữu
module my_contract::state {
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context;
// Contract's state object
struct ContractState has key, store {
id: UID,
counter: u64
}
// Initialize and own the state
public fun init(ctx: &mut tx_context::TxContext) {
let state = ContractState {
id: object::new(ctx),
counter: 0
};
transfer::share_object(state); // Make shared for mutability
}
// Mutate owned state
public entry fun increment(state: &mut ContractState) {
state.counter = state.counter + 1;
}
}
####Mô hình sở hữu
| Mô hình | Mẫu mã | Trường hợp sử dụng |
| --------------------| ----------|
|Chia sẻ| | Trạng thái biến đổi transfer::share_object
toàn cầu |
transfer::freeze_object
|** Không thể thay đổi**| | Cấu hình |
|Đã sở hữu| | Tài sản người transfer::transfer
dùng |
###3. Tương tác CLI
####Triển khai hợp đồng trạng thức
sui client publish --gas-budget 1000000000
# Output:
# - Package ID: 0x123...
# - Shared Object ID: 0x456...
####Trạng thái đột động
sui client call \
--package 0x123 \
--module state \
--function increment \
--args 0x456 \ # Shared object ID
--gas-budget 100000000
###4. Cân nhắc kiến trúc
####Kiểm soát đồng thời
// Use `version` field for optimistic concurrency
struct ConcurrentState has key {
id: UID,
value: u64,
version: u64
}
public fun update(
state: &mut ConcurrentState,
new_value: u64,
expected_version: u64
) {
assert!(state.version == expected_version, EVERSION);
state.value = new_value;
state.version = state.version + 1;
}
####Di chuyển tiểu bang (Nâng cấp)
module my_contract::v2 {
use my_contract::state::ContractState;
// Migrate V1 state to V2
public entry fun upgrade_state(
old_state: ContractState,
ctx: &mut tx_context::TxContext
) {
let new_state = V2State {
id: object::new(ctx),
counter: old_state.counter,
new_field: 0
};
transfer::share_object(new_state);
}
}
###5. Các mẫu bảo mật
####Truy cập dựa trên khả năng
struct AdminCap has key, store {
id: UID
}
public entry fun secure_update(
state: &mut ContractState,
_cap: &AdminCap
) {
// Only callable with capability
state.counter += 1;
}
####Bảo vệ tái nhập
struct Lock has key {
id: UID,
locked: bool
}
public entry fun guarded_update(
state: &mut ContractState,
lock: &mut Lock
) {
assert!(!lock.locked, ELOCKED);
lock.locked = true;
state.counter += 1;
lock.locked = false;
}
###6. Cạm bẫy và giải pháp phổ biến
| Lỗi | Nguyên nhân | Khắc phục |
| --------------| -----|
| EInvalidSharedObjectUse
| Khả năng thay đổi không chính xác | Sử dụng tài liệu &mut
tham khảo |
| EMissingOwner
| Đối tượng không thuộc sở hữu của gói | transfer::transfer
đến địa chỉ gói |
EImmutable
| share_object
| Cố gắng sửa đổi đối tượng bị đóng băng | Khởi tạo thành |
###7. Tối ưu hóa hiệu suất
####** Đột biến theo một**
public entry fun batch_update(
states: vector<&mut ContractState>,
delta: u64
) {
let i = 0;
while (i < vector::length(&states)) {
let state = vector::borrow_mut(states, i);
state.counter = state.counter + delta;
i = i + 1;
}
}
####So sánh chi phí xăng khí
Hoạt động | Khí (SUI) |
---|---|
Cập nhật duy nhất | 2.500 |
Cập nhật hàng loạt (10 mục) | 3,800 |
###** Các yếu tố khác biệt chính từ EVM**
1.** Quyền sở hữu rõ ràng**: Các đối tượng phải được chuyển nhượng một cách có chủ ý
2. key + store``copy + drop
Khả năng biến đổi hạt mắt: so với khả năng
3.** Xử lý song biển**: Các đối tượng độc lập đột biến đồng thời
Để sử dụng sản xuất:
- Lưu trữ trạng thái quan trọng dưới dạng** đối tượng được chia sẻ**
- Sử dụngkhả năngcho các hoạt động đặc quyền
- Thực hiện các đường dẫndi chuyển trạng thướctrước
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.
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.
- 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?65
- Cách tối đa hóa lợi nhuận nắm giữ SUI: Sui Staking vs Liquid Staking514
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động55
- Lỗi Sui Move - Không thể xử lý giao dịch Không tìm thấy đồng xu gas hợp lệ cho giao dịch416
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác49