空投策略与压缩 NFT
在 Solana 上,给 10 万用户发送 NFT 空投是一个常见的需求。但如果使用标准 NFT,这将是一笔巨款。 本章我们将探讨如何通过技术手段,将空投成本降低 1000 倍以上。
1. 空投方式对比
| 方式 | 原理 | 成本 (10k 用户) | 优点 | 缺点 |
|---|---|---|---|---|
| 标准空投 (Standard) | 为每个用户创建一个 Mint 账户和 Token 账户。 | ~150 SOL ($20,000+) | 兼容性最好,完全链上。 | 极贵。大部分钱都用来付账户租金了。 |
| Claim 模式 | 发个网页,让用户自己点 "Claim" (Mint)。 | 0 SOL (用户付费) | 项目方省钱。 | 转化率低。用户需要有 SOL 并且愿意签名。 |
| 压缩空投 (cNFT) | 使用 Merkle Tree 技术,将 100 万个 NFT 存入一个账户。 | ~5 SOL ($700) | 极度便宜,适合大规模分发。 | 需要支持压缩标准的钱包/市场;依赖 RPC 索引。 |
2. 压缩 NFT (Compressed NFT / cNFT)
Solana 的 State Compression (状态压缩) 技术是区块链扩容的黑科技。 Metaplex 的 Bubblegum 程序利用这一技术实现了 cNFT。
原理:把数据"哈希"上链
- 传统 NFT:每个 NFT 都是一个独立的 Account,占用 165+ 字节的链上存储空间。
- 压缩 NFT:
- 创建一个巨大的 Merkle Tree 账户(例如能存 100 万个叶子)。
- 每个 NFT 只是树上的一个 叶子节点 (Leaf),包含元数据的哈希值。
- 链上只存储树的 根哈希 (Root) 和部分路径数据 (Canopy)。
- 具体的元数据日志存储在 Solana 的 Ledger (历史记录) 中,由 Indexer (索引器) 负责读取和提供查询。
结果:你只需要为一个 Tree 账户付租金,就可以在里面存入数百万个 NFT。
3. 实现 cNFT 空投
要发送 cNFT,你需要使用 @metaplex-foundation/mpl-bubblegum 库。
步骤 1: 创建 Merkle Tree
你需要根据预估的空投数量选择树的大小 (maxDepth)。
- Depth 14: ~16k NFTs
- Depth 20: ~1M NFTs (租金约 5 SOL)
typescriptimport { createTree } from '@metaplex-foundation/mpl-bubblegum'; async function setupTree(umi) { const merkleTree = generateSigner(umi); // 创建一棵能存 100万 (2^20) 个 NFT 的树 await createTree(umi, { merkleTree, maxDepth: 20, maxBufferSize: 64, }).sendAndConfirm(umi); return merkleTree.publicKey; }
步骤 2: 铸造 cNFT
这只是一个简单的指令,将数据哈希后追加到树上。没有创建新账户,因此无需支付租金。
typescriptimport { mintV1 } from '@metaplex-foundation/mpl-bubblegum'; async function airdropCnft(umi, treeAddress, userAddress) { await mintV1(umi, { leafOwner: userAddress, merkleTree: treeAddress, metadata: { name: "Super cNFT", uri: "https://...", sellerFeeBasisPoints: 0, collection: { key: collectionMint, verified: false }, creators: [...], }, }).sendAndConfirm(umi); }
4. 权衡与选择
什么时候用 cNFT?
- 游戏道具 (数量巨大,单价低)。
- 活动门票 / POAP (大规模分发)。
- DePIN 设备证书 (百万级设备)。
什么时候用标准 NFT?
- 高价值艺术品 (1/1 Art)。
- 主要用于 DeFi 抵押 (目前很多借贷协议还不支持 cNFT)。
随着生态的发展,越来越多的钱包和市场已经原生支持 cNFT,它正在成为 Solana 大规模应用的首选标准。