调用SystemProgram.createAccount时签名验证失败问题求助
解决Solana创建代币铸币账户时的「Signature verification failed」错误
你的问题出在创建铸币账户的交易缺少了新生成的mint密钥对签名。
问题原因
SystemProgram.createAccount指令要求新账户的密钥对(也就是你代码里的mint = Keypair.generate())必须对交易签名,但你当前只让钱包账户(feePayer)完成签名,导致交易序列化时签名验证不通过。而转账交易(SystemProgram.transfer)只需要发起者(钱包账户)签名,所以能正常执行。
修复步骤及代码
- 先让mint密钥对对交易做部分签名
- 告诉钱包适配器需要这个额外的签名者
- 补充初始化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
相关产品推荐
相关产品推荐

