功能
创建Bubblegum树
介绍
虽然压缩NFT的数据存储在交易中而不是链上账户中,但我们仍然需要一些链上账户来跟踪默克尔树及其配置。因此,在开始铸造压缩NFT之前,我们需要创建两个账户:
- 默克尔树账户。此账户持有一个通用默克尔树,可用于验证任何类型数据的真实性。它由MPL Account Compression程序拥有,该程序从SPL Account Compression程序分叉。在我们的案例中,我们将使用它来验证压缩NFT的真实性。
- TreeConfigV2账户。第二个账户是从默克尔树账户地址派生的PDA。它允许我们存储特定于压缩NFT的默克尔树额外配置——例如,树创建者、已铸造cNFT数量等。
有了这两个账户,我们就有了开始铸造压缩NFT所需的一切。请注意,我们将带有关联Tree Config账户的默克尔树账户称为Bubblegum树。
创建Bubblegum树
现在让我们看看如何创建这两个账户来创建Bubblegum树。幸运的是,我们的库通过提供创建树操作使这个过程变得简单,该操作为我们处理一切。此操作接受各种参数——大多数是可选的——允许我们根据需要自定义Bubblegum树。最重要的参数是:
- 默克尔树:一个新生成的签名者,将用于创建默克尔树账户。然后可以通过此地址访问默克尔树账户。
- 树创建者:能够管理Bubblegum树和铸造压缩NFT的账户地址。
- 最大深度和最大缓冲区大小:最大深度参数用于计算默克尔树可以容纳的最大叶子数——因此也是压缩NFT数。此最大值按
2^maxDepth计算。最大缓冲区大小参数指示默克尔树的最小并发限制。换句话说,它定义了树中可以并行发生多少更改。这两个参数不能任意选择,必须从预定义的值集中选择,如下表所示。
以下是我们推荐的与Solana生态系统兼容的树设置。
| cNFT数量 | 树深度 | 树冠深度 | 并发缓冲区 | 树成本 | 每个cNFT成本 |
|---|---|---|---|---|---|
| 16,384 | 14 | 8 | 64 | 0.3358 | 0.00002550 |
| 65,536 | 16 | 10 | 64 | 0.7069 | 0.00001579 |
| 262,144 | 18 | 12 | 64 | 2.1042 | 0.00001303 |
| 1,048,576 | 20 | 13 | 1024 | 8.5012 | 0.00001311 |
| 16,777,216 | 24 | 15 | 2048 | 26.1201 | 0.00000656 |
| 67,108,864 | 26 | 17 | 2048 | 70.8213 | 0.00000606 |
| 1,073,741,824 | 30 | 17 | 2048 | 72.6468 | 0.00000507 |
树的最大深度如下:
- 公开:Bubblegum树是否应该公开。如果是公开的,任何人都可以从中铸造压缩NFT。否则,只有树创建者或树委托人(如委托cNFT中讨论的)才能铸造压缩NFT。
以下是如何使用我们的库创建Bubblegum树:
创建Bubblegum树
import { generateSigner } from '@metaplex-foundation/umi'
import { createTreeV2 } from '@metaplex-foundation/mpl-bubblegum'
const merkleTree = generateSigner(umi)
const builder = await createTreeV2(umi, {
merkleTree,
maxBufferSize: 64,
maxDepth: 14,
})
await builder.sendAndConfirm(umi)
默认情况下,树创建者设置为Umi身份,公开参数设置为false。但是,可以如下例所示自定义这些参数。
const customTreeCreator = generateSigner(umi)
const builder = await createTreeV2(umi, {
// ...
treeCreator: customTreeCreator,
public: true,
})
获取Bubblegum树
由于Bubblegum树由两个链上账户组成,让我们看看如何获取它们中的任何一个。
获取默克尔树
默克尔树账户包含关于树的各种信息,例如:
- 树头,存储最大深度、最大缓冲区大小、树的权限以及树创建时的创建Slot。
- 树本身,存储关于树的低级信息,例如其更改日志(或根)、其序列号等。我们在本文档的专门页面中更多地讨论并发默克尔树。
- 树冠,如默克尔树树冠页面中讨论的。
以下是如何使用我们的库获取所有这些数据:
获取默克尔树
import {
fetchMerkleTree,
} from "@metaplex-foundation/mpl-account-compression";
const merkleTreeAccount = await fetchMerkleTree(umi, merkleTree)
获取Tree Config
Tree Config账户包含特定于压缩NFT的数据。它存储:
- Bubblegum树的树创建者。
- Bubblegum树的树委托人(如果有)。否则,设置为树创建者。
- Bubblegum树的总容量,即可以从树中铸造的cNFT最大数量。
- 已铸造数量,跟踪铸造到树中的cNFT数量。这个值很重要,因为它被用作操作的Nonce("一次性使用数字")值,以确保默克尔树叶子是唯一的。因此,这个nonce充当资产的树范围唯一标识符。
- 是否公开参数,指示是否任何人都可以从树中铸造cNFT。
- 是否可解压仅对Bubblegum V1有效。
- 版本是可以使用的LeafSchema版本。
以下是如何使用我们的库获取所有这些数据:
获取Tree Config
import { fetchTreeConfigFromSeeds } from '@metaplex-foundation/mpl-bubblegum';
const treeConfig = await fetchTreeConfigFromSeeds(umi, { merkleTree });
