使用Python开发Solana代币交易功能时遭遇Invalid public key input错误的排查与解决
Solana Python 代币买入功能报错:Invalid Public Key Input
我帮你拆解下这个错误的核心问题,以及对应的解决办法:
错误成因
这个ValueError完全是因为代码里把Account对象直接当成公钥传入了,同时交易签名者的选择也不符合Solana的交易规则:
- 公钥参数传错类型:在
CreateAccountParams的from_pubkey参数中,你写的keypair.public_key如果keypair是solana.account.Account实例,那public_key是一个需要调用的方法(得加括号keypair.public_key()),直接写属性名会把方法对象/Account相关实例传进去,导致公钥解析失败,也就是报错里看到的'<solana.account.Account object at ...>'。 - 交易签名者选错:
cli.send_transaction(transaction, new_account)这里你让新生成的空账户签名交易,但这笔交易是要从你的钱包扣钱创建新账户,必须由你的钱包keypair来签名——新账户还没在链上初始化,根本没有权限签这笔交易。
修正后的代码
from solana.publickey import PublicKey from solana.transaction import Transaction from solana.system_program import create_account, CreateAccountParams from solana.account import Account program_id = '9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin' def perform_buy(keypair, program_id, cli): # 确保keypair是Account对象(如果传入的是32字节私钥数组,先转成Account) if not isinstance(keypair, Account): keypair = Account(keypair[:32]) new_account = Account() print(new_account.public_key()) print(new_account.keypair()) transaction = Transaction() # 修正from_pubkey:调用public_key()获取正确的PublicKey实例 transaction.add(create_account(CreateAccountParams( from_pubkey=keypair.public_key(), new_account_pubkey=new_account.public_key(), # 替换硬编码的lamports,用链上实际需要的租金金额 lamports=cli.get_minimum_balance_for_rent_exemption(88), space=88, program_id=PublicKey(program_id), ))) # 修正签名者:用你的钱包keypair签名交易 send_tx = cli.send_transaction(transaction, keypair) print(send_tx)
额外注意事项
- 别硬编码
lamports=10000,这个金额大概率不够支付账户的租金,用cli.get_minimum_balance_for_rent_exemption(88)可以获取链上要求的最小租金,避免交易因为余额不足失败。 - 如果你是要创建代币交易用的关联账户,其实Solana的SPL Token库有专门的
create_associated_token_account指令,比手动创建普通账户更规范,后续可以考虑用这个方法来简化代币账户的创建流程。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

