高级

默克尔树树冠

介绍

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的预期用途、开发平台的兼容性以及树的所有权结构等因素。