Sui.

Bài viết

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

article banner.
Sergey Ilin.
Jun 04, 2025
Bài Viết

Cách chuyển một số lượng token SUI cụ thể: Xử lý các đối tượng tiền xu

Cách chuyển một số lượng token SUI cụ thể: Xử lý các đối tượng tiền xu

Thách thức

Không giống như các blockchain truyền thống nơi số dư token là những con số đơn giản, SUI lưu trữ token dưới dạngđối tượng coinriêng lẻ. Điều này có nghĩa là nếu bạn có 3 mã thông báo SUI, chúng tồn tại dưới dạng ba đối tượng riêng biệt (ví dụ: 1 SUI + 1 SUI + 1 SUI = tổng cộng 3), không phải là số dư duy nhất của “3 SUI”.

Khi bạn muốn chuyển một số tiền cụ thể (như 2.5 SUI), bạn cần: 1.** Hợp nhấtnhiều đối tượng tiền xu nếu cần 2. Chia tắttiền xu để có được số tiền chính xác 3. Chuyển nhận**đối tượng đồng xu thu được

Ví dụ về mã: Chuyển 2.5 SUI

Dưới đây là một ví dụ TypeScript hoàn chỉnh cho thấy cách xử lý điều này:

import { SuiClient, getFullnodeUrl } from '@mysten/sui.js/client';
import { TransactionBlock } from '@mysten/sui.js/transactions';
import { Ed25519Keypair } from '@mysten/sui.js/keypairs/ed25519';

// Initialize client and keypair
const client = new SuiClient({ url: getFullnodeUrl('testnet') });
const keypair = Ed25519Keypair.fromSecretKey(YOUR_SECRET_KEY);
const senderAddress = keypair.getPublicKey().toSuiAddress();

async function transferSUI(recipientAddress: string, amountInSUI: number) {
  try {
    // Convert SUI to MIST (1 SUI = 1,000,000,000 MIST)
    const amountInMist = Math.floor(amountInSUI * 1_000_000_000);
    
    // Step 1: Get all SUI coin objects owned by sender
    const coinObjects = await client.getCoins({
      owner: senderAddress,
      coinType: '0x2::sui::SUI'
    });
    
    if (coinObjects.data.length === 0) {
      throw new Error('No SUI coins found');
    }
    
    console.log(`Found ${coinObjects.data.length} SUI coin objects`);
    coinObjects.data.forEach((coin, index) => {
      console.log(`Coin ${index + 1}: ${coin.balance} MIST`);
    });
    
    // Step 2: Create transaction block
    const txb = new TransactionBlock();
    
    // Step 3: Handle coin merging and splitting
    let primaryCoin;
    
    if (coinObjects.data.length === 1) {
      // Single coin - just split it
      primaryCoin = coinObjects.data[0].coinObjectId;
    } else {
      // Multiple coins - merge them first
      primaryCoin = coinObjects.data[0].coinObjectId;
      const coinsToMerge = coinObjects.data.slice(1).map(coin => coin.coinObjectId);
      
      if (coinsToMerge.length > 0) {
        txb.mergeCoins(primaryCoin, coinsToMerge);
        console.log(`Merging ${coinsToMerge.length} coins into primary coin`);
      }
    }
    
    // Step 4: Split the exact amount needed
    const [transferCoin] = txb.splitCoins(primaryCoin, [amountInMist]);
    
    // Step 5: Transfer the split coin
    txb.transferObjects([transferCoin], recipientAddress);
    
    // Step 6: Set gas budget and execute
    txb.setGasBudget(10000000); // 0.01 SUI in MIST
    
    const result = await client.signAndExecuteTransactionBlock({
      signer: keypair,
      transactionBlock: txb,
      options: {
        showEffects: true,
        showObjectChanges: true,
      },
    });
    
    console.log('Transaction successful!');
    console.log('Digest:', result.digest);
    console.log('Gas used:', result.effects?.gasUsed);
    
    return result;
    
  } catch (error) {
    console.error('Transfer failed:', error);
    throw error;
  }
}

// Usage example
async function main() {
  const recipientAddress = '0x742d35cc6db7e3b6c7e4c46e7f8c7e6f1234567890abcdef';
  const amountToTransfer = 2.5; // SUI
  
  await transferSUI(recipientAddress, amountToTransfer);
}

// Run the transfer
main().catch(console.error);

Phân tích từng bước

1.** Tìm kiếm các đối tượng tiền tử**

const coinObjects = await client.getCoins({
  owner: senderAddress,
  coinType: '0x2::sui::SUI'
});

Thao tác này sẽ truy xuất tất cả các đối tượng đồng xu SUI thuộc sở hữu của địa chỉ của bạn.

2.** Hợp nhất nhiều tiền xu (nếu cần)**

if (coinObjects.data.length > 1) {
  const primaryCoin = coinObjects.data[0].coinObjectId;
  const coinsToMerge = coinObjects.data.slice(1).map(coin => coin.coinObjectId);
  txb.mergeCoins(primaryCoin, coinsToMerge);
}

Nếu bạn có nhiều đối tượng tiền xu, hãy hợp nhất chúng thành một đồng tiền lớn hơn.

3.** Chia số tiền chính xác**

const [transferCoin] = txb.splitCoins(primaryCoin, [amountInMist]);

Chia số tiền chính xác bạn muốn chuyển từ đồng tiền đã hợp nhất.

4.** Chuyển tiền xẻ tắt**

txb.transferObjects([transferCoin], recipientAddress);

Chuyển đối tượng tiền xu mới được tạo cho người nhận.

Những điểm chính cần nhớ

-MIST vs SUI: Luôn chuyển đổi SUI sang MIST (nhân với 1.000.000.000) khi làm việc với các giao dịch -Ngân sách khí động: Đặt ngân sách khí đốt phù hợp (thường là 0,01 SUI là đủ) -** ID đối tượng**: Mỗi đồng tiền có một ID đối tượng duy nhất mà bạn tham chiếu trong các giao dịch -** Hoạt động nguyên tử**: Tất cả các hoạt động hợp nhất, tách và chuyển giao diễn ra trong một giao dịch duy nhất

Mẹo xử lý lỗi

// Check if you have enough balance
const totalBalance = coinObjects.data.reduce((sum, coin) => 
  sum + parseInt(coin.balance), 0
);

if (totalBalance < amountInMist) {
  throw new Error(`Insufficient balance. Have: ${totalBalance/1e9} SUI, Need: ${amountInSUI} SUI`);
}

Thay thế: Sử dụng phương pháp tích hợp của SUI SDK

Đối với các trường hợp sử dụng đơn giản hơn, bạn có thể sử dụng phương pháp tiện lợi của SDK:

const txb = new TransactionBlock();
const [coin] = txb.splitCoins(txb.gas, [amountInMist]);
txb.transferObjects([coin], recipientAddress);

Điều này sử dụng đồng xu gas để chuyển tiền, hoạt động tốt với số lượng nhỏ hơn. Tuy nhiên, nếu đồng xu gas không có số lượng SUI cần thiết thì phương pháp trên là bắt buộc/

  • Sui
  • Transaction Processing
  • Move
1
Chia sẻ
Bình luận
.
harry phan.
Jun 5 2025, 04:31

Xử lý các đối tượng đồng xu trong SUI giống như chế tạo trong trò chơi

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

610Bài viết1335Câ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 Bảy