8. NFT Collection 创建与管理

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 时引用了它。

typescript
import { 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 指令。

typescript
await 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 是一等公民,流程更加简化。

typescript
import { 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),它提供了极快的上传速度。

typescript
import { 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 字段 }
JSPlayground
EDITOR ACTIVE
Initializing JS Environment...

Collection 验证机制

Collection NFT
MyCollection
Auth: Admin
Admin Wallet
(Signer)
Item #1
Coll: MyCollection
Item #2
Coll: MyCollection
Item #3
Coll: MyCollection
机制说明: 市场(如 Magic Eden)通过检查元数据中的 verified: true 字段来辨别真伪。这个字段只有当 Collection Authority 对元数据账户进行签名后才会变成 true。