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

使用solana-web3 SDK的splToken.Token.createMint如何为NFT设置名称、符号、URI和精度?

Solana NFT铸造添加元数据解决方案

你当前的代码仅实现了基础SPL Token的创建、铸造和转账逻辑,未对接Metaplex Token Metadata标准,因此无法写入NFT的名称、符号、图片URI等元数据信息。你此前提交的交易签名2wkwUKo3RradgsT56PQKpV7V1P72WLvuC6ThN5Q78FZBuwV6BbNoSRcgZ17fKwiro5p6rQcYxy4NJoZMJCdTvfgx仅为普通SPL Token转账记录,不含元数据属性。

前置依赖安装

需先安装Metaplex元数据操作工具包:

npm install @metaplex-foundation/mpl-token-metadata @solana/web3.js @solana/spl-token

核心调整规则

  • NFT的SPL Token小数位必须设为0(NFT不可分割,不能使用原有代码的9位小数配置)
  • NFT总铸造量固定为1,符合单份资产属性
  • 计算Metaplex元数据账户的PDA地址,将元数据写入链上

调整后完整代码

const web3 = require('@solana/web3.js');
const splToken = require('@solana/spl-token');
const { Metadata, PROGRAM_ID: METADATA_PROGRAM_ID } = require('@metaplex-foundation/mpl-token-metadata');

(async () => {
  // 连接devnet集群
  const connection = new web3.Connection(
    web3.clusterApiUrl('devnet'),
    'confirmed',
  );

  // 生成钱包并空投SOL
  const fromWallet = web3.Keypair.generate();
  const fromAirdropSignature = await connection.requestAirdrop(
    fromWallet.publicKey,
    web3.LAMPORTS_PER_SOL,
  );
  await connection.confirmTransaction(fromAirdropSignature);

  // 生成接收NFT的钱包
  const toWallet = web3.Keypair.generate();

  // 创建NFT的Mint账户,小数位设为0
  const mint = await splToken.Token.createMint(
    connection,
    fromWallet,
    fromWallet.publicKey,
    null,
    0, // 必须为0,NFT不可分割
    splToken.TOKEN_PROGRAM_ID,
  );

  // 获取发送方的关联Token账户
  const fromTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
    fromWallet.publicKey,
  );

  // 铸造1枚NFT到发送方账户
  await mint.mintTo(
    fromTokenAccount.address,
    fromWallet.publicKey,
    [],
    1, // 总供应量为1
  );

  // 冻结Mint权限,确保NFT总量不会再增加(符合NFT标准要求)
  await mint.setAuthority(
    mint.publicKey,
    null,
    'MintTokens',
    fromWallet.publicKey,
    []
  )

  // 计算元数据账户PDA地址
  const [metadataPDA] = await web3.PublicKey.findProgramAddress(
    [
      Buffer.from('metadata'),
      METADATA_PROGRAM_ID.toBuffer(),
      mint.publicKey.toBuffer(),
    ],
    METADATA_PROGRAM_ID
  );

  // 构造创建元数据的指令
  const createMetadataIx = Metadata.createCreateMetadataAccountV2Instruction(
    {
      metadata: metadataPDA,
      mint: mint.publicKey,
      mintAuthority: fromWallet.publicKey,
      payer: fromWallet.publicKey,
      updateAuthority: fromWallet.publicKey,
    },
    {
      createMetadataAccountArgsV2: {
        data: {
          name: "你的NFT名称", // 替换为实际NFT名称
          symbol: "NFT符号", // 替换为实际NFT符号
          uri: "https://你的图片URI地址", // 替换为实际图片/元数据JSON的URI
          sellerFeeBasisPoints: 0, // 版税比例,单位为0.01%,0表示无版税
          creators: [
            {
              address: fromWallet.publicKey,
              verified: true,
              share: 100
            }
          ],
          collection: null,
          uses: null
        },
        isMutable: true, // 元数据是否可修改
      }
    }
  )

  // 构造NFT转账交易,同时加入元数据创建指令
  const transaction = new web3.Transaction()
    .add(createMetadataIx) // 先创建元数据
    .add(
      splToken.Token.createTransferInstruction(
        splToken.TOKEN_PROGRAM_ID,
        fromTokenAccount.address,
        await mint.getOrCreateAssociatedAccountInfo(toWallet.publicKey).then(acc => acc.address),
        fromWallet.publicKey,
        [],
        1,
      )
    );

  // 签名发送交易
  const signature = await web3.sendAndConfirmTransaction(
    connection,
    transaction,
    [fromWallet],
    {commitment: 'confirmed'},
  );
  console.log('交易签名', signature);
  console.log('NFT Mint地址', mint.publicKey.toBase58());
})();

验证方式

交易上链后,可直接通过Mint地址在Solana浏览器中查询,即可看到对应的NFT名称、符号和图片资源信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:39:00