高度

マークルツリーキャノピー

Last updated February 24, 2026

Summary

マークルツリーキャノピーは、マークルツリーの上位ノードをオンチェーンにキャッシュし、トランザクションで送信する必要がある証明データを削減します。このページでは、キャノピーの仕組み、コストへの影響、および組み合わせやすさとストレージコストのトレードオフについて説明します。

  • キャノピーはツリーの上位nレベルを保存し、証明サイズをdからd-nノードに削減します
  • キャノピーが大きいほど、同じトランザクション内で他のSolanaプログラムとの組み合わせやすさが向上します
  • キャノピーサイズはツリー作成時に固定され、後から変更できません
  • 必要な追加バイト数の計算式は (2^(n+1) - 1) * 32 です

はじめに

SolanaのネットワーキングスタックはMTUサイズ1280バイトを使用し、ヘッダーを考慮すると、データに1232バイトが残ります。これが圧縮NFT(cNFT)に与える影響は、必要な証明がトランザクションサイズを占有しすぎるため、現在深度24を超えるマークルツリーの変更は不可能になることです。

これらの証明サイズの制限を回避するために、SPLアカウント圧縮は、マークルツリーの最上位ノードをキャッシュする機能を提供します。これはキャノピーと呼ばれ、同時マークルツリーアカウントの最後に保存されます。

深度dのツリーの上位nレベルをキャッシュすることで、証明を最初のd - nノードに切り捨てることができます。これにより、アカウント圧縮トランザクションのサイズを削減し、10億以上のcNFTを保存できる深度31までのツリーの変更を可能にします。

マークルツリーアカウントにキャノピーを初期化するには、追加のバイトでアカウントを初期化する必要があります。必要な追加バイト数は(2⁺¹ - 1)* 32です。ここでnは、キャノピーにキャッシュしたいマークルツリーのレベル数です。

キャノピーは、同時マークルツリーが変更されるたびに更新されます。追加の作業は必要ありません。ただし、ツリーの作成後にキャノピーサイズを変更することはできません。

組み合わせやすさ vs. コスト削減

以下の表はcompressed.appの協力で生成され、キャノピーサイズによって1,000,000個のcNFTをミントする総コストがいかに大きく異なるかを示しています。

様々なキャノピー深度での1,000,000 cNFTのコスト

深度20のマークルツリーは1,048,576個のcNFTを保存できます。

キャノピー深度証明バイトストレージコストミントコスト(LUTで3ミント/tx)総コスト
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はトランザクションデータのMTUとして1280バイトを使用し、1232バイトをデータ用に残します