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

Solana部署Non-Transferable Token失败:自定义程序错误0xc求助

问题:Solana Devnet部署不可转账Token报错Invalid instruction(0xc)

我尝试在Solana Devnet上部署不可转账代币(Non-Transferable Token),按照文档使用Token Program 2022的Non-Transferable扩展编写代码,但交易执行失败,报错为自定义程序错误0xc,日志显示‘Invalid instruction’。无法定位失败原因,想问Devnet上部署的Token Program 2022是否与spl仓库中的程序存在差异?

代码示例

import {
    clusterApiUrl,
    sendAndConfirmTransaction,
    Connection,
    Keypair,
    SystemProgram,
    Transaction,
    LAMPORTS_PER_SOL,
} from '@solana/web3.js';
import {
    createInitializeNonTransferableMintInstruction,
    createInitializeMintInstruction,
    getMintLen,
    ExtensionType,
    TOKEN_2022_PROGRAM_ID,
} from '@solana/spl-token';

(async () => {
    const connection = new Connection(clusterApiUrl('devnet'), 'confirmed');

    const payer = Keypair.generate();
    const airdropSignature = await connection.requestAirdrop(payer.publicKey, 2 * LAMPORTS_PER_SOL);
    await connection.confirmTransaction({ signature: airdropSignature, ...(await connection.getLatestBlockhash()) });

    const mintAuthority = Keypair.generate();
    const decimals = 9;

    const mintKeypair = Keypair.generate();
    const mint = mintKeypair.publicKey;
    const mintLen = getMintLen([ExtensionType.NonTransferable]);
    const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);

    const transaction = new Transaction().add(
        SystemProgram.createAccount({
            fromPubkey: payer.publicKey,
            newAccountPubkey: mint,
            space: mintLen,
            lamports,
            programId: TOKEN_2022_PROGRAM_ID,
        }),
        createInitializeNonTransferableMintInstruction(mint, TOKEN_2022_PROGRAM_ID),
        createInitializeMintInstruction(mint, decimals, mintAuthority.publicKey, null, TOKEN_2022_PROGRAM_ID)
    );
    await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair], undefined);
})();

错误日志

SendTransactionError: failed to send transaction: Transaction simulation failed: Error processing Instruction 1: custom program error: 0xc
    at Connection.sendEncodedTransaction (/Users/user/Desktop/workspace/solana-nft-js-test/node_modules/@solana/web3.js/src/connection.ts:4825:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Connection.sendRawTransaction (/Users/user/Desktop/workspace/solana-nft-js-test/node_modules/@solana/web3.js/src/connection.ts:4784:20)
    at async Connection.sendTransaction (/Users/user/Desktop/workspace/solana-nft-js-test/node_modules/@solana/web3.js/src/connection.ts:4772:12)
    at async sendAndConfirmTransaction (/Users/user/Desktop/workspace/solana-nft-js-test/node_modules/@solana/web3.js/src/utils/send-and-confirm-transaction.ts:31:21)
    at async /Users/user/Desktop/workspace/solana-nft-js-test/src/example.ts:87:3 {
  logs: [
    'Program 11111111111111111111111111111111 invoke [1]',
    'Program 11111111111111111111111111111111 success',
    'Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [1]',
    'Program log: Error: Invalid instruction',
    'Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 725 of 600000 compute units',
    'Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb failed: custom program error: 0xc'
  ]
}

错误原因及解决方案

  • 指令顺序错误:当前代码先初始化Non-Transferable扩展,再初始化基础Mint账户,但Token Program 2022要求必须先执行createInitializeMintInstruction完成基础Mint初始化,再执行扩展初始化指令。
  • Devnet程序与spl仓库无差异:Devnet上的Token Program 2022与官方spl仓库代码同步部署,不存在版本差异,报错是代码逻辑问题导致。

修正后的代码:

import {
    clusterApiUrl,
    sendAndConfirmTransaction,
    Connection,
    Keypair,
    SystemProgram,
    Transaction,
    LAMPORTS_PER_SOL,
} from '@solana/web3.js';
import {
    createInitializeNonTransferableMintInstruction,
    createInitializeMintInstruction,
    getMintLen,
    ExtensionType,
    TOKEN_2022_PROGRAM_ID,
} from '@solana/spl-token';

(async () => {
    const connection = new Connection(clusterApiUrl('devnet'), 'confirmed');

    const payer = Keypair.generate();
    const airdropSignature = await connection.requestAirdrop(payer.publicKey, 2 * LAMPORTS_PER_SOL);
    await connection.confirmTransaction({ signature: airdropSignature, ...(await connection.getLatestBlockhash()) });

    const mintAuthority = Keypair.generate();
    const decimals = 9;

    const mintKeypair = Keypair.generate();
    const mint = mintKeypair.publicKey;
    const mintLen = getMintLen([ExtensionType.NonTransferable]);
    const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);

    const transaction = new Transaction().add(
        SystemProgram.createAccount({
            fromPubkey: payer.publicKey,
            newAccountPubkey: mint,
            space: mintLen,
            lamports,
            programId: TOKEN_2022_PROGRAM_ID,
        }),
        // 先初始化基础Mint账户
        createInitializeMintInstruction(mint, decimals, mintAuthority.publicKey, null, TOKEN_2022_PROGRAM_ID),
        // 再初始化Non-Transferable扩展
        createInitializeNonTransferableMintInstruction(mint, TOKEN_2022_PROGRAM_ID)
    );
    await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair], undefined);
})();

关键说明

  • Token Program 2022的扩展初始化必须建立在已完成基础Mint初始化的账户上,否则会触发Invalid instruction错误(错误码0xc对应InvalidInstruction枚举)。
  • getMintLen([ExtensionType.NonTransferable])计算的存储空间是正确的,包含了基础Mint数据和扩展数据的总长度,这部分无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:50:39