Bài viết
Chia sẻ kiến thức của bạn.

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

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- 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