使用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
相关产品推荐
相关产品推荐

