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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:06:31