Anchor Solana初始化报错:Signature verification failed问题求助
问题分析与解决方案
核心问题:初始化新账户未包含账户签名者
你遇到的Signature verification failed错误,根源是初始化Counter账户时,没有将新生成的账户Keypair作为签名者传入交易。
在Solana中,创建新账户(init指令)需要两个必要签名:
- 支付账户创建费用的用户签名(你的代码已包含)
- 新账户自身的签名,因为新账户地址需要由其Keypair生成并签名确认
你的代码仅生成了账户的publicKey,但未将完整的Keypair加入交易签名列表,导致链上验证签名时缺失必要信息,触发报错。
修复步骤
1. 修改前端代码,添加新账户签名者
保留生成的完整Keypair,并通过.signers()方法传入交易:
const callProgram = useCallback(async () => { if (!publicKey) throw new WalletNotConnectedError(); if (!wallet) throw new WalletNotConnectedError(); const program = await getProgram(connection, wallet) // 保留完整Keypair,不要仅取publicKey const counterKeypair = Keypair.generate() const init = await program.methods .initalize() .accounts({ set: counterKeypair.publicKey, user: publicKey, systemProgram: anchor.web3.SystemProgram.programId, }) // 新增:将新账户Keypair作为签名者传入 .signers([counterKeypair]) .rpc() .catch((err) => { console.log('err', err) }) console.log('initalizeAcc called', { init, counterAddress: counterKeypair.publicKey.toString() }) // 后续操作使用刚创建的账户地址,替代硬编码的旧地址 const increase = await program.methods .increaseCounter(new BN(2, undefined, "le")) .accounts({ set: counterKeypair.publicKey, }) .rpc() console.log('increaseCounter called', { increase }) const decrease = await program.methods .decreaseCounter(new BN(6, undefined, "le")) .accounts({ set: counterKeypair.publicKey, }) .rpc() console.log('decreaseCounter called', { decrease }) }, [publicKey, sendTransaction, connection])
2. 可选优化:修正拼写一致性
你的合约和前端代码均将Initialize拼写成Initalize(缺失字母i),虽不影响功能,但建议统一修正为正确拼写:
- 合约中
Initalize结构体及函数名 →Initialize - 前端中
.initalize()调用 →.initialize()
为什么其他操作正常?
increase和decrease仅修改已存在的账户,无需创建新账户,仅需用户签名即可完成,因此能正常执行。
内容的提问来源于stack exchange,提问作者Sebastian_B
相关产品推荐
相关产品推荐

