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

调用SystemProgram.createAccount时签名验证失败问题求助

解决Solana创建代币铸币账户时的「Signature verification failed」错误

你的问题出在创建铸币账户的交易缺少了新生成的mint密钥对签名。

问题原因

SystemProgram.createAccount指令要求新账户的密钥对(也就是你代码里的mint = Keypair.generate())必须对交易签名,但你当前只让钱包账户(feePayer)完成签名,导致交易序列化时签名验证不通过。而转账交易(SystemProgram.transfer)只需要发起者(钱包账户)签名,所以能正常执行。

修复步骤及代码

  1. 先让mint密钥对对交易做部分签名
  2. 告诉钱包适配器需要这个额外的签名者
  3. 补充初始化mint的指令(你原代码漏掉了这一步,否则创建的账户不是有效代币铸币账户)

修改后的完整代码:

import { createInitializeMintInstruction, MINT_SIZE, TOKEN_PROGRAM_ID, getMinimumBalanceForRentExemptMint } from "@solana/spl-token";
import { Transaction, SystemProgram } from "@solana/web3.js";
import { useCallback } from "react";

const onClickCreate = useCallback(async () => {
    if (!publicKey) return; // 确保钱包已连接

    const lamports = await getMinimumBalanceForRentExemptMint(connection);
    const mint = Keypair.generate();

    console.log("Mint地址:", mint.publicKey.toBase58());

    const transaction = new Transaction({ feePayer: publicKey });
    transaction.add(
        // 创建铸币账户空间
        SystemProgram.createAccount({
            fromPubkey: publicKey,
            newAccountPubkey: mint.publicKey,
            space: MINT_SIZE,
            lamports,
            programId: TOKEN_PROGRAM_ID
        }),
        // 初始化铸币账户(必须添加,否则账户无效)
        createInitializeMintInstruction(
            mint.publicKey,
            9, // 代币小数位数,根据需求调整
            publicKey, // 拥有铸币权限的账户
            publicKey // 拥有冻结权限的账户(可选,可设为null)
        )
    );

    // 用mint密钥对完成部分签名
    transaction.partialSign(mint);

    // 发送交易时传入额外签名者,让钱包适配器处理完整签名
    const signature = await sendTransaction(transaction, connection, {
        signers: [mint]
    });
    await connection.confirmTransaction(signature, 'processed');

    console.log("交易完成,签名:", signature);
}, [publicKey, sendTransaction, connection]);

关键说明

  • transaction.partialSign(mint):让新生成的mint密钥对先对交易签名,因为这个账户的创建需要它的授权
  • sendTransaction的signers参数:告诉钱包适配器需要把这个额外的签名者加入签名流程,确保交易包含所有必要的签名
  • 必须添加createInitializeMintInstruction:仅创建账户空间不足以生成有效的代币铸币账户,必须通过该指令初始化账户的代币相关参数

内容的提问来源于stack exchange,提问作者Procuste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:27:13