transfer
solana上发送原生代币和非原生代币有什么区别
在Solana区块链上,发送原生代币(SOL)与发送非原生代币(例如SPL Tokens)有一些关键的区别。以下是详细的解释:
发送原生代币(SOL)
SOL是Solana区块链的原生代币,用于支付交易费用和执行智能合约。发送SOL的过程相对简单,因为它是Solana的基础代币。
步骤:
-
创建转账指令:
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: amountInLamports, // 1 SOL = 1,000,000,000 lamports
});- 使用
SystemProgram.transfer创建一个转账指令。
- 使用
-
创建交易并添加指令:
const transaction = new Transaction().add(transferInstruction); -
发送并确认交易:
const signature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);
发送非原生代币(SPL Tokens)
SPL Tokens是Solana上的标准代币,可以代表各种资产,如稳定币、治理代币等。发送SPL Tokens需要更多的步骤,因为涉及到代币账户的管理。
步骤:
-
确保接收者有代币账户:
- 在发送SPL Token之前,接收者必须有一个与该Token Mint关联的代币账户。如果没有,需要创建一个。
const receiverTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
sender,
tokenMintAddress,
receiver.publicKey
); -
创建转账指令:
const transferInstruction = createTransferInstruction(
senderTokenAccount.address, // 发送者的代币账户地址
receiverTokenAccount.address, // 接收者的代币账户地址
sender.publicKey, // 发送者的公钥(签名者)
amountInTokens, // 转账的代币数量
[],
TOKEN_PROGRAM_ID
); -
创建交易并添加指令:
const transaction = new Transaction().add(transferInstruction); -
发送并确认交易:
const signature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);
主要区别
-
指令类型:
- 发送SOL使用的是
SystemProgram.transfer指令。 - 发送SPL Tokens使用的是
createTransferInstruction指令。
- 发送SOL使用的是
-
账户管理:
- 发送SOL不需要额外的账户管理。
- 发送SPL Tokens需要确保接收者有一个关联的代币账户,如果没有,需要创建一个。
-
程序ID:
- 发送SOL使用的是系统程序ID。
- 发送SPL Tokens使用的是SPL Token程序ID(通常是
TOKEN_PROGRAM_ID)。
-
单位:
- SOL的单位是lamports(1 SOL = 1,000,000,000 lamports)。
- SPL Tokens的单位取决于代币的精度(decimals),通常在创建Token Mint时定义。
示例代码
发送SOL:
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL,
});
const transaction = new Transaction().add(transferInstruction);
const signature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);
发送SPL Token:
const receiverTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
sender,
tokenMintAddress,
receiver.publicKey
);
const transferInstruction = createTransferInstruction(
senderTokenAccount.address,
receiverTokenAccount.address,
sender.publicKey,
amountInTokens,
[],
TOKEN_PROGRAM_ID
);
const transaction = new Transaction().add(transferInstruction);
const signature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);
通过这些步骤,你可以在Solana区块链上发送原生代币(SOL)和非原生代币(SPL Tokens)。