Skip to main content

transfer

solana上发送原生代币和非原生代币有什么区别

在Solana区块链上,发送原生代币(SOL)与发送非原生代币(例如SPL Tokens)有一些关键的区别。以下是详细的解释:

发送原生代币(SOL)

SOL是Solana区块链的原生代币,用于支付交易费用和执行智能合约。发送SOL的过程相对简单,因为它是Solana的基础代币。

步骤

  1. 创建转账指令

    const transferInstruction = SystemProgram.transfer({
    fromPubkey: sender.publicKey,
    toPubkey: receiver.publicKey,
    lamports: amountInLamports, // 1 SOL = 1,000,000,000 lamports
    });
    • 使用 SystemProgram.transfer 创建一个转账指令。
  2. 创建交易并添加指令

    const transaction = new Transaction().add(transferInstruction);
  3. 发送并确认交易

    const signature = await sendAndConfirmTransaction(
    connection,
    transaction,
    [sender]
    );

发送非原生代币(SPL Tokens)

SPL Tokens是Solana上的标准代币,可以代表各种资产,如稳定币、治理代币等。发送SPL Tokens需要更多的步骤,因为涉及到代币账户的管理。

步骤

  1. 确保接收者有代币账户

    • 在发送SPL Token之前,接收者必须有一个与该Token Mint关联的代币账户。如果没有,需要创建一个。
    const receiverTokenAccount = await getOrCreateAssociatedTokenAccount(
    connection,
    sender,
    tokenMintAddress,
    receiver.publicKey
    );
  2. 创建转账指令

    const transferInstruction = createTransferInstruction(
    senderTokenAccount.address, // 发送者的代币账户地址
    receiverTokenAccount.address, // 接收者的代币账户地址
    sender.publicKey, // 发送者的公钥(签名者)
    amountInTokens, // 转账的代币数量
    [],
    TOKEN_PROGRAM_ID
    );
  3. 创建交易并添加指令

    const transaction = new Transaction().add(transferInstruction);
  4. 发送并确认交易

    const signature = await sendAndConfirmTransaction(
    connection,
    transaction,
    [sender]
    );

主要区别

  1. 指令类型

    • 发送SOL使用的是 SystemProgram.transfer 指令。
    • 发送SPL Tokens使用的是 createTransferInstruction 指令。
  2. 账户管理

    • 发送SOL不需要额外的账户管理。
    • 发送SPL Tokens需要确保接收者有一个关联的代币账户,如果没有,需要创建一个。
  3. 程序ID

    • 发送SOL使用的是系统程序ID。
    • 发送SPL Tokens使用的是SPL Token程序ID(通常是 TOKEN_PROGRAM_ID)。
  4. 单位

    • 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)。