Bài viết
Chia sẻ kiến thức của bạn.
Làm cách nào để hợp nhất hai đối tượng coin trong Move?
- 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
- SDKs and Developer Tools
- NFT Ecosystem
Câu trả lời
13Việc hợp nhất hai đối tượng coin trong mô hình lập trình Sui Move là điều cần thiết vì Sui sử dụng kiến trúc dựa trên đối tượng trong đó mỗi token là một đối tượng riêng biệt với ID riêng của nó. Trong hệ thống này, sở hữu ba đồng xu trị giá 1 SUI mỗi đồng nghĩa với việc giữ ba đối tượng khác nhau, không phải một số dư của 3 SUI. Để tương tác với các giao thức hoặc thực hiện chuyển giao, thường cần phải hợp nhất chúng thành một đối tượng duy nhất.
Thư viện tiêu chuẩn Sui cung cấp
Dưới đây là một triển khai cơ bản trong Move:
sử dụng sui: :coin:: {Self, Coin};
Trên dòng lệnh, bạn có thể hợp nhất tiền xu bằng cách sử dụng Sui CLI với:
trên khách hàng merge-coin
<primary_object_id>--đồng tiền chính
<secondary_object_id>--coin-to-merge\
- ngân sách khí đốt 10000000
Điều này sẽ lưu trữ số dư kết hợp trong đồng tiền chính. Đồng tiền thứ cấp được tiêu thụ và không thể sử dụng được nữa.
Trong SDK Sui (ví dụ: với TypeScript), thao tác tương tự có thể được thực hiện theo chương trình:
chờ đợi suiclient.mergeCoin ({ người ký: MyAddress, Đồng tiền chính: coin1_id, CoinToMerge: coin2_id, Ngân sách khí đốt: 10000000, });
Từ góc độ lưu trữ, ít đối tượng tiền xu hơn làm giảm độ phức tạp và chi phí gas. Hợp nhất tiền xu là một thực hành tốt trước khi gửi, đặt cược hoặc tương tác với các hợp đồng DeFi. Tuy nhiên, một số lỗi có thể xảy ra. Chúng bao gồm sử dụng ID đối tượng sai, không đủ gas hoặc không là chủ sở hữu của cả hai đồng tiền.
Để ngăn chặn lỗi và tuân theo các phương pháp bảo mật tốt nhất, tránh sử dụng lại đồng tiền sau khi nó đã được hợp nhất, đảm bảo tính nhất quán về loại và luôn kiểm tra quyền sở hữu. Mô hình đối tượng của Sui làm cho hành vi của đồng tiền trở nên rõ ràng và có thể truy nguyên hơn so với các mô hình dựa trên tài khoản.
Trong thực tế, ví thường tự động hợp nhất các đồng tiền nhỏ để đơn giản hóa trải nghiệm người dùng. Các giao thức DeFi sử dụng điều này để hợp nhất phần thưởng hoặc quản lý các quỹ được gộp một cách hiệu quả.
Nếu bạn đang xây dựng một cái gì đó liên quan đến việc xử lý nhiều đối tượng tiền xu, bạn nên viết các chức năng tiện ích để hợp nhất trước khi gửi giao dịch hoặc đặt cược. Mô hình này có thể ngăn chặn số dư bị phân mảnh và giảm các lỗi giao dịch trên chuỗi.
Để hợp nhất hai đối tượng đồng xu trong Move on the Sui Network, bạn có thể sử dụng Coin
mô-đun để chuyển số dư của đồng tiền này sang đồng xu khác. Các đồng tiền Sui được quản lý bởi Coin
mô-đun và việc hợp nhất thường liên quan đến việc chuyển tất cả tài sản từ đối tượng coin này sang đối tượng coin khác và sau đó xóa đối tượng nguồn.
Các khái niệm chính:
Coin::merge
*** Hợp nhất đồng coin**: Bạn có thể chuyển tất cả số dư từ đồng tiền này sang đồng tiền khác bằng cách sử dụng chức năng.
*** Ví dụ về mã di chuyển**:
module MergeCoins {
use sui::coin::Coin;
public fun merge_coins(
coin1: &mut Coin<u64>,
coin2: &mut Coin<u64>
) {
Coin::merge(coin1, coin2); // Merges the balance of coin2 into coin1
}
}
*CLI: Sử dụng sui client
để tương tác với hợp đồng sau khi triển khai, như thế này:
sui client call --function merge_coins --package <package-id> --module <module-name> --args <coin1-id> <coin2-id>
Thực hành tốt nhất:
- Đảm bảo các đồng tiền cùng loại (ví dụ: cả hai
Coin<u64>
). - Xử lý đúng cách và kiểm tra quyền sở hữu tiền xu trước khi hợp nhất.
Hợp nhất hai đối tượng tiền xu trong Sui (Di chuyển)
Trong Sui, tiền xu được thể hiện dưới dạng các đối tượng di chuyển. Hợp nhất hai đối tượng đồng tiền liên quan đến việc chuyển giá trị của chúng thành một đối tượng tiền xu duy nhất. Mô hình sở hữu nghiêm ngặt của Move có nghĩa là bạn không thể kết hợp trực tiếp các đồng tiền; thay vào đó, bạn sẽ chuyển giá trị của đồng tiền này sang đồng tiền kia, “hợp nhất” chúng một cách hiệu quả.
Các khái niệm chính:
*** Di chuyển ngôn ngữ**: Các đối tượng tiền xu không thể thay đổi sau khi được tạo. Bạn không thể hợp nhất chúng trực tiếp, nhưng bạn có thể chuyển giá trị của chúng thành một đồng tiền duy nhất. *Mạng Sui: Sui sử dụng mô hình tài nguyên của ngôn ngữ Move để thực thi quyền sở hữu và kiểm soát tài nguyên (tiền xu).
Các bước để hợp nhất tiền xu:
1.** Chuyển giá trị của đồng tiền này sang đồng xu khác**. 2.** Đốt đồng tiền thứ hai**(tùy chọn, nếu bạn muốn “xóa” nó).
Mã di chuyển mẫu:
public fun merge_coins(coin1: &mut Coin, coin2: &mut Coin) {
// Transfer value from coin2 to coin1
Coin::deposit(&mut coin1, Coin::withdraw(&mut coin2));
// Optionally, burn coin2
Coin::burn(&mut coin2);
}
Ví dụ về CLI:
Hợp nhất tiền xu không phải là một hoạt động CLI trực tiếp nhưng có thể đạt được bằng cách gọi hàm trong hợp đồng:
sui client publish --gas-budget 10000 --module <module-path>
Lỗi thường gặp:
Vấn đề về quyền sở hữu: Đảm bảo bạn có các tham chiếu có thể thay đổi chính xác (&mut
) đến các đối tượng đồng xu.
*** Các loại tiền không hợp lạng*: Đảm bảo các đồng tiền bạn đang cố gắng hợp nhất có cùng loại.
Thực hành tốt nhất:
*** Tránh chi tiêu kép: Luôn đảm bảo tiền xu được chuyển đúng cách trước khi đốt. *** Kiểm tra trên Localnet/Testnet**: Xác thực logic trước khi triển khai để tránh lỗi trong các giao dịch thực.
Để hợp nhất hai Coin
đối tượng trong Sui Move, hãy sử dụng coin::join
chức năng từ khung Sui, kết hợp số dư của hai đồng xu cùng loại thành một. Đầu tiên, đảm bảo cả hai đồng tiền đều có thể thay đổi và thuộc sở hữu của người ký giao dịch, vì mô hình sở hữu của Sui yêu cầu sự cho phép rõ ràng để sửa đổi các đối tượng. Chức năng này tiêu thụ các đồng tiền đầu vào và tạo ra một đồng tiền hợp nhất mới, theo hệ thống kiểu tuyến tính của Sui nơi các đối tượng không thể được sao chép hoặc sao chép ngầm. Hoạt động này khác với chuỗi EVM nơi số dư mã thông báo được lưu trữ trong hợp đồng chứ không phải là các đối tượng riêng biệt.
Để hợp nhất hai đối tượng đồng xu trong Move on the Sui Network, bạn sử dụng chức năng coin::merge
từ 0x2::coin
mô-đun. Tiện ích này cho phép bạn kết hợp giá trị của một đối tượng tiền xu thành một đối tượng đồng xu khác cùng loại, phá hủy nguồn và bảo tồn mục tiêu. Điều này rất cần thiết khi xử lý số dư bị phân mảnh từ nhiều giao dịch, đặc biệt là đối với dApps, giao thức DeFi và thị trường.
Trong mô-đun Move tùy chỉnh của bạn, bạn cần bao gồm:
use sui::coin;
Mã ví dụ (trong Move):
public entry fun merge_coins<CoinType>(
target: &mut coin::Coin<CoinType>,
source: coin::Coin<CoinType>
) {
coin::merge(target, source);
}
Chức năng này có tham chiếu có thể thay đổi đến đồng tiền mục tiêu và giá trị cho đồng tiền nguồn. Chức năng thêm giá trị của đồng tiền nguồn vào mục tiêu và phá hủy nguồn trong quá trình này.
Thực hành tốt nhất:
- Đảm bảo cả hai đồng tiền đều thuộc cùng loại (ví dụ: cả hai đều là SUI hoặc cả hai đều là USDC).
- Tránh truyền cùng một đối tượng với cả hai đối số — nó sẽ hoảng loạn.
- Sử dụng
coin::value(&coin)
nếu bạn muốn kiểm tra số dư trước khi hợp nhất. - Tránh biến đổi giá trị đồng xu trong các đối tượng được chia sẻ trừ khi cần thiết, để giảm xung đột giao dịch.
Sử dụng Sui CLI:
Nếu bạn đang làm việc với CLI, hãy sử dụng sui client
lệnh để hợp nhất:
sui client merge-coin \
--primary-coin <coin_object_id_to_keep> \
--coin-to-merge <coin_object_id_to_destroy> \
--gas-budget 20000000
Điều này hợp nhất đồng tiền thứ hai vào đồng tiền thứ nhất. Đồng tiền thứ hai sẽ được tiêu thụ.
Trong TypeScript SDK:
import { TransactionBlock } from "@mysten/sui.js";
const tx = new TransactionBlock();
tx.mergeCoins(
tx.object(primaryCoinId),
[tx.object(secondaryCoinId)]
);
Lỗi thường gặp:
TypeMismatch
xảy ra nếu các loại tiền xu không khớp.Object not mutable
nếu bạn cố gắng hợp nhất thành một đồng tiền bất biến hoặc mượn.Object not found
khi tham chiếu các đối tượng đã xóa hoặc thu thập rác trên Testnet sau khi xóa.
Việc hợp nhất các đối tượng tiền xu là rất quan trọng để kiểm soát số dư kiểu Utxo trong Sui. Nó cũng giúp giảm mức sử dụng gas khi thực hiện nhiều giao dịch. Bạn có thể đọc thêm về quản lý tiền xu trong tài liệu Sui Move.
Hợp nhất các đối tượng tiền xu trong Sui Move
Trong mô hình đối tượng của Sui, tiền xu là các đối tượng hạng nhất phải được hợp nhất một cách rõ ràng bằng cách sử dụng Coin::join
hàm từ thư viện chuẩn (0x2::coin
). Không giống như chuỗi EVM nơi số dư mã thông báo được lưu trữ trong ánh xạ, Sui đại diện cho mỗi số dư coin như một đối tượng riêng biệt.
Thực hiện cốt lõi
use sui::coin::{Self, Coin};
use sui::transfer;
public entry fun merge_coins(
mut primary_coin: Coin,
coin_to_merge: Coin,
ctx: &mut TxContext
) {
// Validate ownership (both coins must belong to sender)
assert!(object::is_owner(&primary_coin, tx_context::sender(ctx)), 0x1);
// Join the coins (adds value of coin_to_merge to primary_coin)
Coin::join(&mut primary_coin, coin_to_merge);
// Transfer the merged coin back to sender
transfer::transfer(primary_coin, tx_context::sender(ctx));
}
Chi tiết kỹ thuật chính
1.** Yêu cầu sở hữu đối tượng**:
- Cả hai đồng tiền phải thuộc sở hữu của người gửi giao dịch
- Xác minh
object::is_owner()
trước khi hợp nhất - Không bao giờ hợp nhất các đối tượng được chia sẻ (sẽ gây ra lỗi thời gian chạy)
2.** Tối ưu hóa khí**:
- Hợp nhất rẻ hơn đáng kể so với tách (1 hợp nhất so với nhiều lần chia)
- Tránh hợp nhất không cần thiết: Ví Sui tự động hợp nhất tiền
- Mẫu lý tưởng: Hợp nhất trước khi chuyển lớn, chỉ chia khi cần
3.** Ví dụ sử dụng CLI**:
# First, get coin IDs
sui client objects --address $MY_ADDRESS
# Merge two coins (primary first, then the one to merge)
sui client call \
--package 0x2 \
--module coin \
--function join \
--args "$PRIMARY_COIN_ID" "$COIN_TO_MERGE_ID" \
--gas-budget 10000
Cân nhắc cụ thể về Sui so với EVM
-** Không theo dõi số dạng**: Mỗi đồng tiền là một đối tượng riêng biệt (EVM sử dụng lưu trữ số dư duy nhất)
-** Các loại tuyến tính**: Sau khi hợp nhất, coin_to_merge
được tiêu thụ (không thể sử dụng lại)
-** Không có rủi ro tái nhập trình**: Các đối tượng tiền xu là loại tuyến tính (tự động được thực thi bởi Move)
-** Ý nghĩa về khí**: Việc hợp nhất làm giảm số lượng đối tượng, giảm chi phí khí đốt trong tương lai
Lỗi và giải pháp phổ biến
| Lỗi | Nguyên nhân | Khắc phục |
| --------------| -----|
| InvalidArgument
| Cố gắng hợp nhất các đối tượng được chia sẻ | Đảm bảo cả hai đồng tiền đều là đối tượng thuộc sở hữu |
| ObjectNotFound
| Sử dụng ID đồng xu không hợp lệ | Xác minh các đối tượng tồn tại với sui client objects
|
| TypeMismatch
| Cố gắng hợp nhất các loại tiền khác nhau | Xác nhận cả hai đồng tiền có cùng loại (ví dụ: 0x2: :sui: :SUI) |
| LinearObjectsInUse
| Sử dụng coin sau khi hợp nhất | Remember coin_to_merge
bị tiêu thụ trong quá trình tham gia |
Mô hình thực hành tốt nhất cho các dự án DeFi/NFT
// Always validate before merging
public entry fun safe_merge(
mut target: Coin,
source: Coin,
ctx: &mut TxContext
) acquires /* any resources */ {
let sender = tx_context::sender(ctx);
assert!(object::is_owner(&target, sender), E_NOT_OWNER);
assert!(object::is_owner(&source, sender), E_NOT_OWNER);
assert!(Coin::type_url(&target) == Coin::type_url(&source), E_MISMATCHED_TYPES);
Coin::join(&mut target, source);
transfer::transfer(target, sender);
}
Hãy nhớ rằng: Trong mô hình đối tượng của Sui, việc hợp nhất đồng xu làm giảm số lượng đối tượng mà địa chỉ của bạn sở hữu, điều này ảnh hưởng trực tiếp đến chi phí gas trong tương lai (ít đối tượng hơn = phí lưu trữ thấp hơn). Không giống như EVM nơi hợp nhất số dư diễn ra tự động, Sui yêu cầu các hoạt động hợp nhất rõ ràng như một phần của logic ứng dụng của bạn.
Ở Sui, tiền xu là các đối tượng riêng lẻ chứ không phải số dư dựa trên tài khoản như trong Ethereum. Khi bạn nhận được nhiều đối tượng coin (chẳng hạn như Coin
Tại sao hợp nhất tiền xu lại quan trọng
Giảm số lượng đối tượng tiền xu, giúp giảm thiểu quy mô giao dịch và mức sử dụng gas.
Một số DApp và hợp đồng thông minh mong đợi một đối tượng coin duy nhất làm đầu vào.
Ví thường thích quản lý ít đối tượng tiền xu hơn để đạt hiệu quả.
Cách thức hoạt động của việc hợp nhất tiền xu khi di chuyển
Sui cung cấp chức
sử dụng sui: :coin:: {Self, Coin};
coin_primary là tham chiếu có thể thay đổi đến đồng tiền sẽ nhận được tiền.
coin_second là đồng tiền đang được hợp nhất và sẽ bị phá hủy sau khi hợp nhất.
Bạn phải sở hữu cả hai đối tượng tiền xu, vì Sui thực thi quyền sở hữu đối tượng nghiêm ngặt.
Sử dụng Sui CLI để hợp nhất tiền xu
Bạn cũng có thể hợp nhất tiền xu bằng cách sử dụng CLI:
trên khách hàng merge-coin
<primary_coin_object_id>--đồng tiền chính
<secondary_coin_object_id>--coin-to-merge\
- ngân sách khí đốt 10000
Lệnh này kết hợp giá trị của secondary_coin_object_id thành primary_coin_object_id.
Cân nhắc phát triển
Luôn đảm bảo cả hai đối tượng đồng xu đều cùng loại (ví dụ: cả hai Coin
Không kiểm tra quyền sở hữu hoặc các loại không khớp sẽ dẫn đến lỗi.
Việc hợp nhất là không thể đảo ngược; đồng tiền hợp nhất bị phá hủy.
Nếu làm việc trong hợp đồng thông minh, hãy xác minh các loại coin bằng cách sử dụng generics và type_of.
Thực tiễn tốt nhất
Thường xuyên hợp nhất các đồng tiền nhỏ hơn để giảm tình trạng phồng và tối ưu hóa lưu trữ.
Trong quá trình chuyển tiền, hợp nhất trước để gửi một đối tượng đồng xu duy nhất.
Kiểm tra với sui test trong localnet và sử dụng sui: :coin: :value để xác nhận tổng trước và sau khi hợp nhất.
Bằng cách hiểu cách các đối tượng tiền xu hoạt động trong Sui và hợp nhất chúng đúng cách, bạn có thể viết mã sạch hơn, giảm chi phí gas và cải thiện độ tin cậy của hợp đồng thông minh.
Sử dụng coin::join
trong Move để hợp nhất hai đồng xu cùng loại:
####Chức năng di chuyển
use sui::coin;
// Merge `coin2` into `coin1` (destroys coin2)
public entry fun merge_coins<T>(
coin1: &mut coin::Coin<T>,
coin2: coin::Coin<T>,
) {
coin::join(coin1, coin2);
}
####Ví dụ CLI
sui client call \
--function merge_coins \
--module your_module \
--package 0xYOUR_PACKAGE \
--args 0xCOIN1_ID 0xCOIN2_ID \
--gas-budget 10000000
###Ghi chú chính
T
Chỉ có cùng hình: Tiền xu phải có cùng loại (). 2.** Hiệu quả khí**: Việc hợp nhất làm giảm các đối tượng trên chuỗi. 3.** Bảo mật**: Không cần chữ ký (chuyển giá trị thuần túy).
Sử dụng sui::coin::join
để hợp nhất hai đồng xu cùng loại trong Move:
use sui::coin
Mô-đun đồng xu nhập không-. 2.** Gọijoin
**- Phá hủy một đồng tiền, thêm giá trị của nó cho đồng tiền khác.
###Ví dụ:
let coin1 = coin::withdraw(&mut treasury, 100);
let merged = coin::join(coin1, &mut coin2); // coin2 now has +100
Ghi chú chính: ✔ Chỉ những đồng tiền cùng loại mới có thể hợp nhất. ✔ Yêu cầu tham chiếu có thể thay đổi đến đồng tiền mục tiêu.
Thay thế CLI:
sui client merge-coin --primary-coin 0x123 --coin-to-merge 0x456
Trong Sui, việc hợp nhất hai đối tượng đồng tiền liên quan đến việc kết hợp số dư của đồng tiền này thành đồng tiền khác bằng cách sử dụng ngữ nghĩa giống như transfer: :merge của Move, nhưng cụ thể sử dụng hàm sui: :coin: :merge. Tiền xu trong Sui chỉ là các đối tượng thuộc loại
Cách thức hoạt động:
-
Chức năng Sui Move: Sử dụng
chức năng sui: :coin: :merge (coin1: & mut Coin, coin2: Coin) để hợp nhất hai đồng xu. -
Hành vi: Điều này chuyển toàn bộ số dư của coin2 thành coin1 và phá hủy coin2.
-
Quyền sở hữu: Cả hai đồng tiền phải thuộc sở hữu của cùng một địa chỉ/đối tượng thực hiện hợp nhất.
Mã di chuyển mẫu
sử dụng sui: :coin:: {Self, Coin}; sử dụng sui: :tx_context:: {Self, txContext};
Ví dụ về Sui CLI
Nếu bạn đang làm điều đó thông qua CLI hoặc SDK (như TypeScript):
<PACKAGE_ID>cuộc gọi khách hàng sui --package
<MODULE_NAME>--module
--hàm merge_my_coins
<PRIMARY_COIN_ID><SECONDARY_COIN_ID>--args\
- ngân sách khí đốt 50000000
Ghi chú chính:
Đảm bảo CoinType chính xác và nhất quán cho cả hai đồng tiền.
Đồng tiền thứ cấp (coin2) được tiêu thụ và xóa sau khi hợp nhất.
Luôn mô phỏng giao dịch bằng cách sử dụng sui client dry-run để phát hiện lỗi trước khi gửi.
Nếu sử dụng đồng tiền động (ví dụ: phần thưởng hoặc phí), việc hợp nhất chúng có thể làm giảm sự lộn xộn đối tượng và tiết kiệm xăng trong các hoạt động sau này.
Lỗi cần theo dõi:
Không tìm thấy đối tượng: Cho biết ID đối tượng sai hoặc thiếu.
Loại không khớp: Nếu các loại tiền khác nhau.
Chủ sở hữu không hợp lệ: Nếu đồng tiền không thuộc sở hữu của người gửi.
Bằng cách làm chủ coin: :merge, bạn duy trì quản lý đối tượng sạch hơn và tối ưu hóa quy mô giao dịch cho các hoạt động ví và DeFi trên Sui.
Để hợp nhất hai đối tượng đồng xu trong Sui bằng Move, bạn sử dụng merge
chức năng từ 0x2::coin
mô-đun. Điều này cho phép bạn kết hợp giá trị của hai đồng xu cùng loại thành một đối tượng và phá hủy đối tượng kia. Tính năng này rất hữu ích khi người dùng có nhiều đối tượng đồng xu nhỏ (thường được gọi là “bụi”) và muốn hợp nhất chúng thành ít đối tượng hơn để tiết kiệm khí và đơn giản hóa việc theo dõi.
Trong Move, cú pháp trông như thế này:
use 0x2::coin;
public entry fun merge_coins(coin1: &mut Coin<T>, coin2: Coin<T>) {
coin::merge(coin1, coin2);
}
Ở đây, coin1
giữ số dư hợp nhất, trong khi coin2
được tiêu thụ và phá hủy trong quá trình này. Bạn phải chuyển một đồng tiền làm tham chiếu có thể thay đổi và đồng tiền kia làm giá trị sở hữu.
Nếu bạn đang sử dụng Sui CLI hoặc SDK, việc hợp nhất xảy ra trong các giao dịch như sau:
sui client merge-coin --primary-coin <COIN1_ID> --coin-to-merge <COIN2_ID> --gas-budget 1000000
Hoặc nếu bạn đang xây dựng một giao dịch theo chương trình (ví dụ: sử dụng TypeScript SDK):
tx.mergeCoins(primaryCoin, [coinToMerge]);
Một chi tiết quan trọng trên Sui là mỗi đồng tiền là một đối tượng thực tế với một ID duy nhất, không giống như chuỗi EVM nơi số dư được lưu trữ dưới dạng số trong ánh xạ. Vì vậy, khi giao dịch với tiền xu trên Sui, bạn đang làm việc với các đối tượng vật lý chứ không chỉ là những con số. Đó là lý do tại sao bạn phải hợp nhất hoặc chia chúng trực tiếp thay vì cập nhật một biến số dư.
Những sai lầm phổ biến bao gồm cố gắng hợp nhất các đồng tiền thuộc các loại khác nhau (như SUI và USDC), sẽ thất bại hoặc chuyển cùng một đồng tiền hai lần, điều này sẽ gây hoảng loạn. Bạn cũng nên cẩn thận để không cho rằng các đồng tiền được hợp nhất làm thay đổi ID đối tượng — chúng không thay đổi. Đồng tiền chính vẫn giữ ID ban đầu của nó.
Bạn có thể đọc thêm về việc hợp nhất tiền xu trong tài liệu Sui: [https://docs.sui.io/concepts/cryptoeconomics#coin-objects](https://docs.sui.io/concepts/cryptoeconomics#coin-objects]
Trong Sui, tiền xu là đối tượng thuộc loại Coin
###1. Cơ chế cốt lõi
M coin
ô-đun của Sui cung cấp các chức năng gốc để hợp nhất các đồng tiền cùng loại. Không giống như ERC-20 của EVM (sử dụng cập nhật số dư), Sui hợp nhất các đối tượng tiền xu khác nhau.
####** Ưu điểm chính** -** Nguyên tử**: Hoạt động hợp nhất là tất cả hoặc không có gì -** Hiệu quả khí**: Không ghi lưu trữ trung gian -** Có thể góa**: Hoạt động với các loại tiền xu tùy chỉnh
###2. Triển khai di chuyển ####Hợp nhất cơ bản
module my_module::coin_merger {
use sui::coin;
use sui::tx_context;
// Merge two SUI coins
public entry fun merge_sui(
coin1: coin::Coin<SUI>,
coin2: coin::Coin<SUI>,
ctx: &mut tx_context::TxContext
) {
let merged_coin = coin::join(&mut coin1, coin2);
transfer::public_transfer(merged_coin, tx_context::sender(ctx));
}
}
####** Phiên bản chung (Bất kỳ loại tiền xu nào)**
public entry fun merge_coins<T>(
coin1: &mut coin::Coin<T>,
coin2: coin::Coin<T>
) {
coin::join(coin1, coin2);
}
###3. Cách sử dụng CLI ####Hợp nhất thủ công
# 1. Find coins to merge
sui client coins --coin-type 0x2::sui::SUI
# 2. Execute merge
sui client merge-coin \
--primary-coin 0x123... \
--coin-to-merge 0x456... \
--gas-budget 10000000
####** Hợp nhất lập trình (TypeScript)**
const tx = new TransactionBlock();
tx.mergeCoins(
tx.object(PRIMARY_COIN_ID),
[tx.object(SECONDARY_COIN_ID)]
);
await client.signAndExecuteTransactionBlock({
transactionBlock: tx,
signer: wallet
});
###4. Cân nhắc kiến trúc ####Tối ưu hóa khí
// Batch merging (for wallets/exchanges)
public entry fun batch_merge(
coins: vector<Coin<SUI>>,
ctx: &mut TxContext
) {
let merged = coin::zero(ctx);
while (!vector::is_empty(&coins)) {
coin::join(&mut merged, vector::pop_back(&mut coins));
}
transfer::public_transfer(merged, sender(ctx));
}
####** Mẫu bảo mật**
| Mẫu | Thực hiện | Mục đích |
| -------------------------| ---------|
|Kiểm tra quyền sở hữu| assert!(coin::owner(coin) == sender, EOWNER)
| Ngăn chặn hợp nhất trái phép |
|Zero-Coin Guard| | Tránh các hoạt động vô dụng assert!(coin::value(coin) > 0, EZERO)
|
###5. Xử lý lỗi
####** Lỗi phổ biến**
| Mã lỗi | Lý do | Giải pháp |
| --------------------| ----------|
| ECoinTypeMismatch
| Hợp nhất các loại tiền khác nhau | Xác minh coin::coin_type()
|
| ECoinBalanceExceeded
| Kết quả vượt quá u64::MAX
| Chia thành các hợp nhất nhỏ hơn |
EImmutable
| &mut
| Cố gắng hợp nhất các đồng tiền bất biến | Sử dụng tài liệu tham khảo |
####** Di chuyển trường hợp kiểm tra**
#[test]
fun test_merge_failure() {
let (coin1, coin2) = test_coins();
assert!(coin::value(&coin1) + coin::value(&coin2) > MAX, 0);
let merged = coin::join(&mut coin1, coin2); // Should abort
}
###**6. Ví dụ trong thế giới thực ####Tiền gửi hồ bơi DeFi
module defi::pool {
public entry fun deposit(
user_coin: coin::Coin<USDC>,
pool: &mut Pool,
ctx: &mut TxContext
) {
let merged = coin::join(&mut pool.vault, user_coin);
pool.vault = merged; // Update storage
}
}
####Chợ NFT
module market {
public entry fun consolidate_fees(
fees: vector<Coin<SUI>>,
ctx: &mut TxContext
) {
let total = coin::zero(ctx);
while (!vector::is_empty(&fees)) {
coin::join(&mut total, vector::pop_back(&mut fees));
}
transfer::transfer(total, treasury);
}
}
###7. Điểm chuẩn hiệu suất | Hoạt động | Chi phí khí đốt (SUI) | Ghi chú | | --------------------------| -------| | Hợp nhất 2 đồng xu | 1,500 | Chi phí cơ bản | | Hợp nhất hàng loạt (10 xu) | 3.800 | rẻ hơn 60% so với tuần tự | | Hợp nhất không thành công | 400 | Loại không khớp hủy bỏ |
###Thực hành tốt nhất 1.** Xác nhận trước khi hợp nhập**
fun safe_merge(
coin1: &mut Coin<SUI>,
coin2: Coin<SUI>
) {
assert!(coin::is_immutable(coin1) == false, EIMMUTABLE);
assert!(coin::coin_type(coin1) == coin::coin_type(coin2), ETYPE);
coin::join(coin1, coin2);
}
2.** Tích hợp ví máu**
- Hợp nhất tiền bụi định kỳ
- Kết quả hợp nhất bộ nhớ cache cho UX
3.** Chiến lược kiểm tra**
sui move test --gas-stats # Profile merge costs
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?53
- 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ự động43
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác25
- 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?05