通用功能

创建Bubblegum树

介绍

虽然压缩NFT的数据存储在交易中而不是链上账户中,但我们仍然需要一些链上账户来跟踪默克尔树及其配置。因此,在开始铸造压缩NFT之前,我们需要创建两个账户:

  • 默克尔树账户。此账户持有一个通用的默克尔树,可用于验证任何类型数据的真实性。它由Solana创建和维护的账户压缩程序拥有。在我们的案例中,我们将使用它来验证压缩NFT的真实性。
  • 树配置账户。第二个账户是从默克尔树账户地址派生的PDA。它允许我们为默克尔树存储特定于压缩NFT的额外配置——例如,树创建者、铸造的cNFT数量等。

有了这两个账户,我们就拥有开始铸造压缩NFT所需的一切。请注意,我们将具有关联树配置账户的默克尔树账户称为Bubblegum树

创建Bubblegum树

现在让我们看看如何创建这两个账户来创建Bubblegum树。幸运的是,我们的库通过提供创建树操作使这个过程变得简单,它会为我们处理一切。此操作接受各种参数——大多数是可选的——允许我们根据需要自定义Bubblegum树。最重要的参数是:

  • 默克尔树:一个新生成的签名者,将用于创建默克尔树账户。然后可以在此地址访问默克尔树账户。
  • 树创建者:将能够管理Bubblegum树并铸造压缩NFT的账户地址。
  • 最大深度最大缓冲区大小最大深度参数用于计算默克尔树可以容纳的最大叶子数(因此也是压缩NFT的最大数量)。此最大值通过2^maxDepth计算。最大缓冲区大小参数表示默克尔树的最小并发限制。换句话说,它定义了树中可以并行发生多少更改。这两个参数不能任意选择,必须从下表中显示的预定义值集中选择。

以下是我们推荐的树设置,以便在Solana生态系统中兼容。

cNFT数量树深度树冠深度并发缓冲区树成本每个cNFT成本
16,384148640.33580.00002550
65,5361610640.70690.00001579
262,1441812642.10420.00001303
1,048,576201310248.50120.00001311
16,777,2162415204826.12010.00000656
67,108,8642617204870.82130.00000606
1,073,741,8243017204872.64680.00000507

树的最大深度如下。

  • 公开:Bubblegum树是否应该公开。如果是公开的,任何人都可以从中铸造压缩NFT。否则,只有树创建者或树委托(如委托cNFT中讨论的)才能铸造压缩NFT。

以下是如何使用我们的库创建Bubblegum树:

创建Bubblegum树

import { generateSigner } from '@metaplex-foundation/umi'
import { createTree } from '@metaplex-foundation/mpl-bubblegum'
const merkleTree = generateSigner(umi)
const builder = await createTree(umi, {
merkleTree,
maxDepth: 14,
maxBufferSize: 64,
})
await builder.sendAndConfirm(umi)

默认情况下,树创建者设置为Umi身份,公开参数设置为false。但是,可以自定义这些参数,如下例所示。

const customTreeCreator = generateSigner(umi)
const builder = await createTree(umi, {
// ...
treeCreator: customTreeCreator,
public: true,
})

获取Bubblegum树

由于Bubblegum树由两个链上账户组成,让我们看看如何获取其中任何一个。

获取默克尔树

默克尔树账户包含有关树的各种信息,例如:

  • 树头部,存储最大深度最大缓冲区大小、树的权限以及树创建时的创建槽位
  • 本身,存储有关树的低级信息,如其变更日志(或根)、序列号等。我们在本文档的专门页面中更多地讨论并发默克尔树。
  • 树冠,如默克尔树树冠页面中讨论的。

以下是如何使用我们的库获取所有这些数据:

获取默克尔树

import { fetchMerkleTree } from '@metaplex-foundation/mpl-bubblegum'
const merkleTreeAccount = await fetchMerkleTree(umi, merkleTree)

获取树配置

树配置账户包含特定于压缩NFT的数据。它存储:

  • Bubblegum树的树创建者
  • Bubblegum树的树委托(如果有)。否则,设置为树创建者
  • Bubblegum树的总容量,即可以从树中铸造的cNFT的最大数量。
  • 已铸造数量,跟踪铸造到树中的cNFT数量。此值很重要,因为它用作操作的随机数("仅使用一次的数字")值,以确保默克尔树叶子是唯一的。因此,此随机数充当资产的树范围唯一标识符。
  • 是否公开参数,指示是否任何人都可以从树中铸造cNFT。

以下是如何使用我们的库获取所有这些数据:

获取树配置

import { fetchTreeConfigFromSeeds } from '@metaplex-foundation/mpl-bubblegum'
const treeConfig = await fetchTreeConfigFromSeeds(umi, { merkleTree })
Previous
Rust