高级

默克尔树树冠

Last updated February 24, 2026

Summary

默克尔树树冠将默克尔树的上层节点缓存在链上,减少交易中必须发送的证明数据。本页面介绍树冠的工作原理、成本影响以及可组合性与存储成本之间的权衡。

  • 树冠存储树的前n层,将证明大小从d个节点减少到d-n个节点
  • 更大的树冠可以在同一交易中更好地与其他Solana程序组合
  • 树冠大小在创建树时固定,之后无法更改
  • 所需额外字节数的计算公式为 (2^(n+1) - 1) * 32

介绍

Solana的网络栈使用1280字节的MTU大小,扣除头部后,剩余1232字节用于数据。这对压缩NFT(cNFT)的影响是,目前不可能修改深度大于24的默克尔树,因为所需的证明会占用太多交易大小。

为了规避这些证明大小限制,spl-account-compression提供了缓存默克尔树最上层节点的能力。这被称为树冠,存储在并发默克尔树账户的末尾。

通过缓存深度为d的树的上层n个级别,证明可以被截断为前d - n个节点。这有助于减小账户压缩交易的大小,并使得可以修改深度高达31的树,可以存储超过10亿个cNFT。

要在默克尔树账户上初始化树冠,您必须使用额外的字节初始化账户。所需的额外字节数为(2⁺¹ - 1) * 32,其中n是您希望树冠缓存的默克尔树级别数。

每当并发默克尔树被修改时,树冠都会更新。不需要额外的工作。但请注意,树创建后不能更改树冠大小。

可组合性与成本节约

下表是在compressed.app的帮助下生成的,显示了铸造1,000,000个cNFT的总成本如何因树冠大小而大不相同。

不同树冠深度下1,000,000个cNFT的成本

深度为20的默克尔树可以存储1,048,576个cNFT。

树冠深度证明字节数存储成本铸造成本(3个铸造/交易 带LUT)总成本
06400.30911.66671.9758
141927.60671.66679.2734
179658.69331.666760.36

树冠深度为零的原因是为了获得最便宜的铸造。然而,这需要在transferdelegateburn等指令中发送大量证明数据。在零深度树冠的情况下,略超过一半的交易大小限制被证明数据消耗,这负面影响了将Bubblegum指令与其他程序指令组合的能力。

最终,树冠大小的决定必须考虑成本和可组合性之间的权衡。这个评估应该考虑诸如cNFT的预期用途、开发平台的兼容性以及树的所有权结构等因素。

Notes

  • 树冠深度为0是最便宜的选项,但使用最多的交易空间用于证明,限制了可组合性。
  • 每当树被修改时,树冠会自动更新,无需额外工作。
  • 创建树后无法更改树冠大小。请根据预期的交易组合需求规划树冠深度。
  • 对于深度超过24的树,需要树冠,因为完整的证明会超过Solana的1232字节交易限制。

Glossary

术语定义
树冠存储在链上的默克尔树上层节点缓存,用于减少交易中的证明大小
树冠深度树冠中缓存的树上层级别数
证明字节数交易中默克尔证明消耗的字节数(每个证明节点32字节)
可组合性在单个交易中将其他程序指令与Bubblegum操作一起包含的能力
MTU最大传输单元 — Solana使用1280字节,为交易数据留出1232字节