调用无需签名者的AnchorPy函数时遇签名错误,求解决方案
解决AnchorPy无签名者指令的交易调用问题
你的问题核心是Solana交易的强制规则:任何交易必须至少有一个签名者,这个签名者同时承担交易手续费的支付责任,哪怕你的程序指令本身不需要签名账户。
具体解决步骤
- 确定一个手续费支付账户(比如你自己的钱包账户),该账户需要有足够的SOL支付手续费。
- 创建交易时明确指定该账户为
fee_payer。 - 将该账户的密钥加入签名列表,完成交易签名。
代码示例
from solders.keypair import Keypair from solders.transaction import Transaction # 导入你的timeout函数和相关类型 # 初始化手续费支付钱包(替换为你自己的钱包密钥) fee_payer = Keypair.from_base58_string("你的钱包私钥") # 构造timeout指令所需的账户 timeout_accounts = { "participant1": Pubkey.from_string("参与者1地址"), "participant2": Pubkey.from_string("参与者2地址"), "bet_info": Pubkey.from_string("Bet Info账户地址"), } timeout_ix = timeout(accounts=timeout_accounts) # 创建交易,指定手续费支付方 tx = Transaction.new_with_payer([timeout_ix], fee_payer.pubkey()) # 用手续费支付钱包签名交易 tx.sign([fee_payer])
错误原因解析
- 空签名列表报错:Solana不允许无签名的交易,必须至少有一个签名者承担手续费。
- 跳过
tx.sign()报错:未签名的交易无法被网络验证和执行。 - 随机钱包签名报错:随机钱包不是交易指定的
fee_payer,签名者的公钥必须与交易的手续费支付方公钥匹配,否则会出现密钥-公钥不匹配错误。
内容的提问来源于stack exchange,提问作者Manuel Boi
相关产品推荐
相关产品推荐

