고급
머클 트리 캐노피
소개
Solana의 네트워킹 스택은 1280바이트의 MTU 크기를 사용하며, 헤더를 고려하면 데이터에 대해 1232바이트가 남습니다. 압축된 NFT(cNFT)에 미치는 영향은 현재 깊이가 24보다 큰 머클 트리를 수정하는 것이 불가능하다는 것입니다. 필요한 증명이 트랜잭션 크기를 너무 많이 차지하기 때문입니다.
이러한 증명 크기 제한을 우회하기 위해 spl-account-compression은 머클 트리의 최상위 노드들을 캐시하는 기능을 제공합니다. 이를 캐노피라고 하며, 동시 머클 트리 계정의 끝에 저장됩니다.
깊이 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를 사용한 tx당 3회 민팅) | 총 비용 |
|---|---|---|---|---|
| 0 | 640 | 0.3091 | 1.6667 | 1.9758 |
| 14 | 192 | 7.6067 | 1.6667 | 9.2734 |
| 17 | 96 | 58.6933 | 1.6667 | 60.36 |
캐노피 깊이가 0인 이유는 가능한 한 가장 저렴한 민팅을 위해서입니다. 하지만 이는 transfer, delegate, burn과 같은 명령어와 함께 많은 증명 데이터를 보내야 합니다. 캐노피 깊이가 0인 경우, 트랜잭션 크기 제한의 절반 이상이 증명 데이터로 소비되어 Bubblegum 명령어를 다른 프로그램 명령어와 조합하는 능력에 부정적인 영향을 미칩니다.
궁극적으로 캐노피 크기 결정은 비용과 조합성 사이의 트레이드오프를 고려해야 합니다. 이 평가는 cNFT의 의도된 사용, 개발 플랫폼의 호환성, 트리의 소유권 구조와 같은 요소들을 고려해야 합니다.
