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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:36:03