You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rust solana-sdk转账自定义非SOL代币

使用Rust solana-sdk实现自定义SPL代币转账实现指南

前置依赖配置

首先在你的Cargo.toml中引入所需依赖,版本可根据你的集群兼容情况调整:

[dependencies]
solana-sdk = "1.17"
solana-client = "1.17"
spl-token = "4.0"
spl-associated-token-account = "2.0"
anyhow = "1.0" # 可选,用于简化错误处理

核心实现步骤

  • 初始化RPC客户端,连接到你部署代币的对应Solana集群
    use solana_client::rpc_client::RpcClient;
    use solana_sdk::pubkey::Pubkey;
    use solana_sdk::signature::{Keypair, Signer, read_keypair_file};
    use solana_sdk::transaction::Transaction;
    use spl_token::instruction::transfer;
    use std::str::FromStr;
    use anyhow::Result;
    
    fn main() -> Result<()> {
        // 替换为对应集群的RPC地址,devnet/testnet/mainnet-beta按需修改
        let rpc_client = RpcClient::new("https://api.devnet.solana.com");
    
  • 加载发送方钱包密钥对,生产环境请勿硬编码私钥
    // 替换为你的密钥对文件存储路径
        let sender_keypair = read_keypair_file("~/.config/solana/id.json")?;
    
  • 定义代币相关地址参数
    // 替换为你自行部署的自定义代币Mint地址
        let token_mint = Pubkey::from_str("你的自定义代币Mint地址字符串")?;
        // 替换为接收方的主钱包地址
        let receiver_wallet = Pubkey::from_str("接收方主钱包地址字符串")?;
        // 计算发送方、接收方对应代币的关联账户(ATA)地址
        let sender_ata = spl_associated_token_account::get_associated_token_address(&sender_keypair.pubkey(), &token_mint);
        let receiver_ata = spl_associated_token_account::get_associated_token_address(&receiver_wallet, &token_mint);
    
  • 可选:检查接收方ATA是否存在,不存在则先创建ATA(没有对应ATA的情况下转账会失败)
    if rpc_client.get_account(&receiver_ata).is_err() {
            let create_ata_ix = spl_associated_token_account::instruction::create_associated_token_account(
                &sender_keypair.pubkey(),
                &receiver_wallet,
                &token_mint,
                &spl_token::ID, // 如果你是自行部署的修改版代币程序,替换为你的程序ID
            );
            // 组装创建ATA的交易发送逻辑,和后续转账交易逻辑一致即可
        }
    
  • 构建转账指令并发送交易
    // 转账数量:注意乘以代币的小数位,例如代币小数位为6,转1枚则填写1_000_000
        let transfer_amount = 1_000_000;
        let transfer_ix = transfer(
            &spl_token::ID, // 自行部署的非标准自定义代币程序替换为你的程序ID
            &sender_ata,
            &receiver_ata,
            &sender_keypair.pubkey(),
            &[&sender_keypair.pubkey()],
            transfer_amount,
        )?;
    
        let recent_blockhash = rpc_client.get_latest_blockhash()?;
        let tx = Transaction::new_signed_with_payer(
            &[transfer_ix],
            Some(&sender_keypair.pubkey()),
            &[&sender_keypair],
            recent_blockhash,
        );
    
        let tx_hash = rpc_client.send_and_confirm_transaction(&tx)?;
        println!("转账成功,交易哈希:{}", tx_hash);
    
        Ok(())
    }
    

注意事项

如果你部署的自定义代币不是基于标准SPL Token协议修改的,而是完全自行开发的独立代币程序,你需要按照你程序中定义的转账指令的结构体、数据编码格式、账户顺序来自行构造Instruction实例,参数完全匹配才能触发链上程序的转账逻辑。
交易发送前可先调用rpc_client.simulate_transaction(&tx)方法模拟执行,提前排查参数错误,避免浪费交易费用。

内容的提问来源于stack exchange,提问作者Raid Lafi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:48:00