能否用Solana的spltoken CLI批量发送SPL-Tokens?CSV尝试失败求助
用Solana工具批量发送SPL代币的方案
一、CLI工具直接实现(solana-tokens)
你尝试的solana-tokens是官方推荐的批量发币工具,先排查CSV格式和命令问题:
- CSV必须严格遵循格式:第一行表头为
address,amount,每行对应一个接收地址和代币最小单位数量(比如代币有6位小数,发1个代币需写1000000) - 正确执行命令:
solana-tokens distribute-tokens --from <你的钱包地址> --token <SPL代币地址> --input-csv <你的CSV文件路径> - 常见错误排查:
- 确保钱包有足够SOL支付手续费(单转账约0.000005 SOL,批量需提前算好总量)
- CSV内地址无空格/换行,数量必须为整数
- 先执行
solana-tokens validate-csv <你的CSV文件路径>检查格式合法性
solana-tokens默认会将多个转账打包进单笔交易(不超过Solana单笔交易指令上限,约100条),无需额外参数。
二、代码实现(新手友好的Python版本)
如果CLI方案仍有问题,用Python实现更灵活,以下是带详细注释的学习代码:
前置准备
- 安装依赖:
pip install solana spl-token pycryptodome python-dotenv - 创建
.env文件存储敏感信息:SOLANA_RPC_URL=https://api.devnet.solana.com # 主网替换为https://api.mainnet-beta.solana.com WALLET_PRIVATE_KEY=<你的钱包私钥字符串> TOKEN_MINT_ADDRESS=<你的SPL代币地址>
代码示例
from solana.rpc.api import Client from solana.keypair import Keypair from spl.token.instructions import transfer, TransferParams from spl.token.core import Token from dotenv import load_dotenv import os import csv # 加载环境变量,避免硬编码敏感信息 load_dotenv() # 初始化Solana网络客户端 client = Client(os.getenv("SOLANA_RPC_URL")) # 加载发送方钱包 sender = Keypair.from_secret_key(bytes.fromhex(os.getenv("WALLET_PRIVATE_KEY"))) # 初始化SPL代币操作对象 token = Token(client, os.getenv("TOKEN_MINT_ADDRESS"), sender.public_key, sender.secret_key) # 读取CSV中的接收方信息 def read_recipients(csv_path): recipients = [] with open(csv_path, mode='r') as file: # 按表头解析CSV内容 reader = csv.DictReader(file) for row in reader: # 数量转整数(必须是代币最小单位) recipients.append((row['address'], int(row['amount']))) return recipients # 批量发送函数,支持分批次打包交易 def batch_transfer(recipients, batch_size=50): # 分批次处理,避免单笔交易指令过多触发限制 for i in range(0, len(recipients), batch_size): batch = recipients[i:i+batch_size] transaction_instructions = [] for addr, amount in batch: # 查询接收方是否已有对应代币账户 recipient_token_account = token.get_account_info(addr) if not recipient_token_account: # 若没有,自动创建关联代币账户(需额外支付少量SOL手续费) create_account_ix = token.create_associated_token_account(addr) transaction_instructions.append(create_account_ix) # 添加转账指令 transfer_ix = transfer(TransferParams( token=token.pubkey, source=token.get_account_info(sender.public_key)['address'], dest=recipient_token_account['address'] if recipient_token_account else token.get_associated_token_account_address(addr), owner=sender.public_key, amount=amount )) transaction_instructions.append(transfer_ix) # 发送打包后的交易 txn_result = client.send_transaction(sender, transaction_instructions) print(f"批次{i//batch_size + 1}发送完成,交易签名:{txn_result.value}") if __name__ == "__main__": # 替换为你的CSV文件路径 recipient_list = read_recipients("recipients.csv") batch_transfer(recipient_list)
代码关键解释
- 环境变量:私钥、RPC地址等敏感信息单独存储,避免代码泄露风险
- 代币账户处理:自动检测接收方是否有对应代币账户,无则创建,无需手动操作
- 分批次打包:控制单笔交易内的指令数量,避免触发Solana网络限制
- 交易签名输出:方便在Solana浏览器查询交易状态
三、核心注意事项
- 先在Devnet测试网练手,使用测试SOL和测试代币,避免主网资产损失
- 手续费预估:每笔转账(含账户创建)约0.000005 SOL,批量交易手续费随指令数量略有增加
- 私钥安全:绝对不要将私钥上传至任何平台,仅本地存储
内容的提问来源于stack exchange,提问作者7captain
相关产品推荐
相关产品推荐

