NFT Collection 创建与管理
1. 为什么需要 Collection?
在以太坊上,通常通过部署一个新的 ERC-721 合约来创建一个新的 NFT 系列。但在 Solana 上,由于程序(Program)是共享的,我们不能通过部署合约来区分不同的系列。
Solana 引入了 Collection NFT 的概念。 Collection 本身就是一个特殊的 NFT。其他的 NFT 通过指向这个 Collection NFT 的地址来声明归属关系。
Collection 的核心作用:
- 真伪验证 (Authenticity):这是最重要的功能。任何人都可以在元数据里写上 "Bored Ape" 的名字,但只有经过 Collection Authority 签名验证 (Verify) 的 NFT,才会被市场和钱包标记为正品。
- 数据聚合:Magic Eden 等市场通过 Collection 地址来聚合交易量、计算地板价。
- 批量管理:对于 Metaplex Core,可以直接在 Collection 层级修改配置,自动应用到所有成员。
2. 创建 Collection (Token Metadata / Legacy)
在旧标准中,Collection 只是一个普通的 NFT,只是我们在铸造子 NFT 时引用了它。
typescriptimport { createNft, findMetadataPda } from '@metaplex-foundation/mpl-token-metadata'; import { generateSigner, percentAmount } from '@metaplex-foundation/umi'; async function createLegacyCollection(umi) { // 1. 生成 Collection 的 Mint 账户 const collectionMint = generateSigner(umi); // 2. 铸造 Collection NFT await createNft(umi, { mint: collectionMint, name: 'My Awesome Collection', uri: 'https://example.com/collection.json', sellerFeeBasisPoints: percentAmount(5), // 5% 版税 isCollection: true, // 关键标记:这是一个集合 }).sendAndConfirm(umi); console.log('Collection Address:', collectionMint.publicKey); return collectionMint.publicKey; }
如何将 NFT 加入集合?
在铸造普通 NFT 时,我们需要传入 collection 参数,并随后调用 verifyCollection 指令。
typescriptawait createNft(umi, { // ... 其他参数 collection: { key: collectionMintAddress, verified: false, // 初始状态通常为未验证 }, }).sendAndConfirm(umi); // 只有拥有 Collection 私钥的人才能执行这一步 await verifyCollectionV1(umi, { metadata: nftMetadata, collectionMint: collectionMintAddress, authority: umi.identity, }).sendAndConfirm(umi);
3. 创建 Collection (Metaplex Core)
在 Core 标准中,Collection 是一等公民,流程更加简化。
typescriptimport { createCollectionV1 } from '@metaplex-foundation/mpl-core'; async function createCoreCollection(umi) { const collectionSigner = generateSigner(umi); await createCollectionV1(umi, { collection: collectionSigner, name: 'My Core Collection', uri: 'https://example.com/collection.json', plugins: [ { type: 'Royalties', // 配置系列版税 data: { basisPoints: 500, creators: [{ address: umi.identity.publicKey, percentage: 100 }], ruleSet: { __kind: 'None' }, }, }, ], }).sendAndConfirm(umi); return collectionSigner.publicKey; }
自动验证:
在 Core 标准中,如果你使用 Collection Authority 铸造子资产,它们会自动被归入集合并验证,无需额外的 verify 步骤。
4. 元数据上传实战
在创建 Collection 之前,你需要先将图片和 JSON 上传到去中心化存储(如 Arweave)。 我们推荐使用 Irys (原 Bundlr),它提供了极快的上传速度。
typescriptimport { createGenericFile } from '@metaplex-foundation/umi'; import { irysUploader } from '@metaplex-foundation/umi-uploader-irys'; // 1. 配置 Uploader umi.use(irysUploader()); async function uploadAsset() { // 2. 读取本地图片 const imageBuffer = fs.readFileSync('./assets/cover.png'); const imageFile = createGenericFile(imageBuffer, 'cover.png', { contentType: 'image/png' }); // 3. 上传图片,获取链上 URI const [imageUri] = await umi.uploader.upload([imageFile]); console.log('Image URI:', imageUri); // 4. 构建并上传 Metadata JSON const metadata = { name: "My Collection", description: "Best collection ever", image: imageUri, // 引用刚才上传的图片 properties: { files: [{ uri: imageUri, type: "image/png" }] } }; const metadataUri = await umi.uploader.uploadJson(metadata); console.log('Metadata URI:', metadataUri); return metadataUri; // 这个 URI 填入 createNft 的 uri 字段 }