高级
默克尔树树冠
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) | 总成本 |
|---|---|---|---|---|
| 0 | 640 | 0.3091 | 1.6667 | 1.9758 |
| 14 | 192 | 7.6067 | 1.6667 | 9.2734 |
| 17 | 96 | 58.6933 | 1.6667 | 60.36 |
树冠深度为零的原因是为了获得最便宜的铸造。然而,这需要在transfer、delegate和burn等指令中发送大量证明数据。在零深度树冠的情况下,略超过一半的交易大小限制被证明数据消耗,这负面影响了将Bubblegum指令与其他程序指令组合的能力。
最终,树冠大小的决定必须考虑成本和可组合性之间的权衡。这个评估应该考虑诸如cNFT的预期用途、开发平台的兼容性以及树的所有权结构等因素。
Notes
- 树冠深度为0是最便宜的选项,但使用最多的交易空间用于证明,限制了可组合性。
- 每当树被修改时,树冠会自动更新,无需额外工作。
- 创建树后无法更改树冠大小。请根据预期的交易组合需求规划树冠深度。
- 对于深度超过24的树,需要树冠,因为完整的证明会超过Solana的1232字节交易限制。
Glossary
| 术语 | 定义 |
|---|---|
| 树冠 | 存储在链上的默克尔树上层节点缓存,用于减少交易中的证明大小 |
| 树冠深度 | 树冠中缓存的树上层级别数 |
| 证明字节数 | 交易中默克尔证明消耗的字节数(每个证明节点32字节) |
| 可组合性 | 在单个交易中将其他程序指令与Bubblegum操作一起包含的能力 |
| MTU | 最大传输单元 — Solana使用1280字节,为交易数据留出1232字节 |
