使用solana-py签署Solana交易时出现签名者不足错误的求助
问题解决步骤
1. 必须设置交易的recent_blockhash
交易缺少有效区块哈希会导致签名逻辑异常,先通过Solana客户端获取最新区块哈希并设置:
# 获取最新blockhash recent_blockhash_resp = solana_client.get_latest_blockhash() txn.recent_blockhash = recent_blockhash_resp.value.blockhash
2. 确认投票账户的提款授权人
执行以下命令确认目标投票账户的授权提款人:
solana vote-account <你的vote_account_pubkey>
查看输出中的Withdrawer字段,确保代码里withdrawer参数的公钥和该值一致。如果不一致,要么修改代码中的withdrawer为正确公钥,要么先更新投票账户的提款授权人(需要原授权人签名)。
3. 只签署必要的密钥对
交易需要的签名者仅包含两个角色:
- 交易付费者(fee_payer):你的
wallet_keypair - 提款授权人:如果提款授权人和付费者是同一个账户(即
wallet_keypair是投票账户的提款人),只签wallet_keypair即可;如果是不同账户,需要同时签署提款授权人的密钥对。
修正后的完整代码示例
# 初始化交易并设置fee payer txn = txlib.Transaction(fee_payer=wallet_keypair.pubkey()) # 获取并设置最新blockhash recent_blockhash_resp = solana_client.get_latest_blockhash() txn.recent_blockhash = recent_blockhash_resp.value.blockhash # 添加提款指令 txn.add( vp.withdraw_from_vote_account( vp.WithdrawFromVoteAccountParams( vote_account_from_pubkey=vote_account_keypair.pubkey(), to_pubkey=validator_keypair.pubkey(), withdrawer=wallet_keypair.pubkey(), # 确保这个pubkey是投票账户的授权提款人 lamports=2_000_000_000, ) ) ) # 只签署必要的密钥对(这里假设wallet_keypair是提款授权人) txn.sign(wallet_keypair) # 发送交易 send_resp = solana_client.send_transaction(txn) print(send_resp.value)
额外注意事项
- 确保
vote_account_keypair对应的投票账户有足够SOL可以提取 - 检查
wallet_keypair有足够SOL支付交易手续费
内容的提问来源于stack exchange,提问作者anish
相关产品推荐
相关产品推荐

