Python编写Solana交易代码报invalid public key错误如何解决
报错原因
核心原因是代码中某一处需要传入PublicKey类型参数的位置,被误传入了Account类的实例,程序无法将Account对象解析为合法公钥值,因此抛出类型校验错误。
结合你的代码分析,有两处高发的错误触发点:
send_transaction方法的签名者参数配置错误,或者部分版本库要求签名者传入公钥而非Account对象- 你调用的
create_account指令的参数中,某一个公钥参数实际传入了Account实例,比如a_public_key变量格式错误,或者public_key()方法返回值不符合预期
修复方案
- 首先校验所有公钥参数的类型
在构造交易前添加打印逻辑,确认所有公钥入参都是PublicKey类实例,而非字符串或Account对象:
如果# 依次验证三个公钥参数的类型和值 print(type(account.public_key()), account.public_key()) print(type(new_account.public_key()), new_account.public_key()) print(type(PublicKey(a_public_key)), PublicKey(a_public_key))public_key()方法返回的是字符串而非PublicKey实例,手动用PublicKey(返回值)做一层转换即可。 - 修正交易签名者配置
create_account指令需要两个账户签名:出资创建账户的from_pubkey(即你的Phantom账户account)、新账户所有者new_account,你当前只传入了new_account作为签名者,缺少出资方签名,需要修改为:send_tx = cli.send_transaction(transaction, account, new_account) - 确认业务逻辑是否匹配指令
如果你只是要在两个已经存在的钱包(Phantom和Solflare都是已经初始化过的钱包)之间转账,不需要使用create_account指令,该指令是用来给链上未初始化的新地址分配空间的,已经存在的账户重复调用会报错。转账可以直接使用transfer指令:transaction.add(sp.transfer(sp.TransferParams( from_pubkey=account.public_key(), to_pubkey=new_account.public_key(), lamports=1000000 # 按实际需求填写金额,1 SOL = 10^9 lamports ))) # 转账仅需要转出方签名即可 send_tx = cli.send_transaction(transaction, account) - 确认Account初始化逻辑
如果你使用的是旧版solana-py库,Account接收32字节私钥初始化的逻辑是正确的;如果是新版solders库,需要用Keypair.from_bytes方法传入私钥,不要混用不同库的API。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

