如何使用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
相关产品推荐
相关产品推荐

