如何用Bubblegum v2的mintV2铸造cNFT并确认其状态与地址?
Solana压缩NFT(cNFT)创建验证与地址获取方案
问题场景
使用Metaplex Bubblegum v2 mint压缩NFT,代码执行无报错,但Phantom Devnet钱包未显示该资产,需验证cNFT是否创建成功并获取其标识信息。
一、确认cNFT是否成功创建
1. 检查交易状态
从代码的mint_result中提取交易签名,在Solana Devnet区块浏览器中查询:
- 补充代码打印完整签名:
console.log('交易签名:', signature.toString()); - 若交易状态为
Finalized且无错误日志,说明链上操作已完成。
2. 验证Merkle Tree叶子数量
通过Bubblegum API查询Merkle Tree账户的叶子计数,确认是否新增了叶子:
import { getMerkleTree } from '@metaplex-foundation/mpl-bubblegum'; // 查询Merkle Tree账户信息 const merkleTreeAccount = await getMerkleTree(UMI, merkle_tree_signer.publicKey); console.log('当前Merkle Tree叶子数量:', merkleTreeAccount.tree.count);
如果计数比mint前增加1,说明cNFT对应的叶子已成功插入树中。
二、获取cNFT的标识信息(无传统账户地址)
压缩NFT没有独立的账户地址,通过Merkle Tree地址 + 叶子索引/哈希唯一标识,可通过以下方式获取:
1. 提取叶子哈希与索引
修改代码从mint结果中捕获叶子信息:
const mint_result = await mintV2(UMI, { // 你的原有参数 }).sendAndConfirm(UMI); // 从指令中提取叶子哈希 const bubblegumProgram = UMI.programs.get('mplBubblegum').publicKey; const mintIx = mint_result.signature.instructions.find(ix => ix.program === bubblegumProgram); if (mintIx) { // 叶子哈希是指令数据的最后32字节 const leafHash = mintIx.data.slice(-32); console.log('cNFT叶子哈希:', leafHash); // 查询叶子在Merkle Tree中的索引 import { findLeafIndex } from '@metaplex-foundation/mpl-bubblegum'; const leafIndex = await findLeafIndex(UMI, { merkleTree: merkle_tree_signer.publicKey, leaf: leafHash, }); console.log('cNFT叶子索引:', leafIndex); }
2. 生成叶子资产ID(唯一标识)
叶子资产ID是cNFT的核心标识,用于后续转移、解压等操作:
import { getLeafAssetId } from '@metaplex-foundation/mpl-bubblegum'; const leafAssetId = getLeafAssetId(merkle_tree_signer.publicKey, leafIndex); console.log('cNFT叶子资产ID:', leafAssetId);
三、Phantom钱包不显示的排查
- 开启cNFT显示功能:打开Phantom钱包 → 设置 → 高级 → 开启「压缩NFT」选项;
- 关联集合NFT:你的代码中
collection设为none(),未关联到集合,Phantom不会在「收藏」分类显示,需切换到「所有资产」查看; - 等待区块确认:Devnet区块确认可能延迟,等待5-10分钟后刷新钱包。
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

