Sui.

Bài viết

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

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

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
7
13
Chia sẻ
Bình luận
.

Câu trả lời

13
SuiLover.
Jul 30 2025, 11:19

Việ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 chức năng hợp nhất trong mô-đun sui: :coin. Phải mất hai đồng tiền cùng loại: một đồng có thể thay đổi và sẽ vẫn còn, và đồng còn lại sẽ được tiêu thụ. Sau khi hợp nhất, giá trị từ đồng tiền thứ hai được thêm vào đồng tiền thứ nhất và đối tượng đồng tiền thứ hai bị phá hủy. Cả hai đối tượng đồng xu phải thuộc sở hữu của người gọi.

Dưới đây là một triển khai cơ bản trong Move:

sử dụng sui: :coin:: {Self, Coin};

công cộng vui nhộn merge_example ( coin_primary: &mut Coin, coin_secondhand: Đồng xu ) { coin: :merge (coin_primary, coin_second); }

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.

7
Câu trả lời hay nhất
Bình luận
.
Paul.
Paul4180
Jul 31 2025, 05:34

Để hợp nhất hai đối tượng đồng xu trong Move on the Sui Network, bạn có thể sử dụng Coinmô-đ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 Coinmô-đ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ả haiCoin<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.
8
Bình luận
.
Ashford.
Jul 31 2025, 06:33

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.

7
Bình luận
.
Benjamin XDV.
Jul 31 2025, 09:41

Để hợp nhất hai Coinđối tượng trong Sui Move, hãy sử dụng coin::joinchứ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.

5
Bình luận
.
theking.
Jul 30 2025, 11:11

Để 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::mergetừ 0x2::coinmô-đ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 clientlệ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:

  • TypeMismatchxảy ra nếu các loại tiền xu không khớp.
  • Object not mutablenế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 foundkhi 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.

4
Bình luận
.
Alya.
Alya-14
Jul 30 2025, 17:28

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::joinhà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_mergebị 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.

4
Bình luận
.
290697tz.
Jul 30 2025, 11:20

Ở 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), mỗi đối tượng là một đối tượng độc lập với ID riêng. Để đơn giản hóa việc sử dụng hoặc giảm khí, bạn có thể muốn hợp nhất hai hoặc nhiều đối tượng đồng xu thành một.

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 năng hợp nhất trong mô-đun sui: :coin. Đây là cách nó hoạt động trong mô-đun Move:

sử dụng sui: :coin:: {Self, Coin};

công cộng vui nhộn merge_example ( coin_primary: &mut Coin, coin_secondhand: Đồng xu ) { coin: :merge (coin_primary, coin_second); }

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.

3
Bình luận
.
Arnold.
Arnold2956
Jul 31 2025, 08:15

Sử dụng coin::jointrong 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

  1. TChỉ 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).
3
Bình luận
.
Evgeniy CRYPTOCOIN.
Jul 31 2025, 09:08

Sử dụng sui::coin::joinđể hợp nhất hai đồng xu cùng loại trong Move:

  1. use sui::coinMô-đun đồng xu nhập không-. 2.** Gọi join**- 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  
2
Bình luận
.
Jeff .
Jul 31 2025, 09:16

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 Coin, trong đó T là loại tài sản (ví dụ: SUI hoặc token tùy chỉnh). Mỗi đồng tiền có một ID đối tượng duy nhất và bạn có thể hợp nhất chúng để hợp nhất số dư và giảm chi phí gas từ việc quản lý nhiều đối tượng tiền xu.

Cách thức hoạt động:

  1. 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.

  2. 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.

  3. 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};

mục nhập công khai vui merge_my_coins ( coin_primary: &mut Coin, coin_secondhand: Tiền xu, ) { coin: :merge (coin_primary, coin_second); }

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.

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

Để hợp nhất hai đối tượng đồng xu trong Sui bằng Move, bạn sử dụng mergechức năng từ 0x2::coinmô-đ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, coin1giữ 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]

1
Bình luận
.
Tucker.
Jul 31 2025, 09:17

Trong Sui, tiền xu là đối tượng thuộc loại Coin và có thể được hợp nhất bằng cách sử dụng sui: :coin: :merge. Chức năng hợp nhất chuyển toàn bộ số dư từ đồng tiền này sang đồng tiền khác và xóa đồng tiền nguồn. Cả hai đồng tiền phải cùng loại và thuộc sở hữu của người gửi. Sử dụng cuộc gọi khách hàng sui hoặc SDK để gọi chức năng hợp nhất trong hợp đồng thông minh của bạn. Mô phỏng hợp nhất trước để tránh các lỗi như không khớp quyền sở hữu hoặc xung đột kiểu.

1
Bình luận
.
Bekky.
Bekky1752
Jul 31 2025, 10:07

###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
1
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.

638Bài viết1665Câ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