Cómo funciona la compresión
La compresión de estado almacena un gran conjunto de registros como hojas en un árbol de Merkle. Solo la raíz hash (y los nodos canopy opcionales) residen en la cadena; los actualizadores proporcionan pruebas de que un cambio de hoja es válido sin almacenar cada hoja en una cuenta de Solana.
Receta
En cadena: MerkleTreeAccount { root, canopy[], change_log }
Fuera de cadena: Árbol completo / datos de hoja indexados por proveedor
Por actualización: hoja + prueba de Merkle + transición de raíz válida
const proof = await dasRpc("getAssetProof", { id: assetId });
// proof.proof = hashes hermanos desde la hoja hasta la raízCuándo recurrir a esto:
- Para entender por qué las transferencias de cNFT necesitan pruebas DAS
- Para dimensionar árboles de Merkle concurrentes para la capacidad de la colección
- Para depurar transacciones fallidas de Bubblegum (prueba obsoleta, raíz incorrecta)
- Para evaluar la dependencia del indexador para tu producto
Ejemplo de trabajo
// Actualización conceptual de Merkle para transferencia de hoja
type MerkleProof = {
root: string;
proof: string[]; // hashes hermanos de abajo hacia arriba
node_index: number;
leaf: string;
};
async function explainProof(assetId: string) {
const proof = await dasRpc<MerkleProof>("getAssetProof", { id: assetId });
console.log("Raíz actual:", proof.root);
console.log("Profundidad de la prueba:", proof.proof.length);
console.log("Hash de la hoja:", proof.leaf);
// Bubblegum verifica la prueba contra la raíz de la cuenta del árbol en cadena
// luego reemplaza la hoja (propiedad) con el nuevo hash
}// La compresión de cuentas SPL en cadena verifica la prueba y aplica el reemplazo de hoja
// Bubblegum envuelve la semántica de metadatos alrededor de las CPI de compresión
// Los programas rara vez reimplementan la verificación de pruebas; delegar al programa de compresiónLo que esto demuestra:
- Longitud de la prueba ≈ profundidad del árbol - profundidad del canopy
- La raíz en cadena debe coincidir con la raíz de la prueba en el momento de la creación de la transacción
- El hash del contenido de la hoja codifica la propiedad de la cNFT y los campos de metadatos
Análisis en profundidad
Cómo funciona
- Creación del árbol asigna una cuenta Concurrent Merkle Tree con
maxDepthymaxBufferSizeelegidos. - Mint agrega el hash de la hoja en el siguiente índice; el programa verifica la prueba de adición.
- Transferencia reemplaza los datos de la hoja (nuevo propietario) con una prueba de reemplazo.
- Canopy almacena nodos de prueba superiores en cadena para reducir el tamaño de la transacción.
- Los indexadores reconstruyen el estado y sirven pruebas a través de DAS.
En cadena vs. Fuera de cadena
| Datos | Ubicación |
|---|---|
| Hash de la raíz | Cuenta del árbol en cadena |
| Nodos del canopy | Cuenta del árbol en cadena |
| Todas las hojas | Infraestructura de indexador / DAS |
| Pruebas | Servidas por solicitud por DAS |
Dimensionamiento del árbol
| maxDepth | Hojas máximas (aprox.) |
|---|---|
| 14 | 16,384 |
| 20 | 1,048,576 |
| 24 | 16,777,216 |
Elige la profundidad para el suministro máximo + margen; los árboles más profundos cuestan más alquiler.
Trampas comunes
- Prueba obsoleta después de mints concurrentes - la raíz ha cambiado. Solución: obtén una prueba fresca inmediatamente antes de firmar.
- Profundidad de árbol insuficiente - no se puede hacer mint más allá de la capacidad. Solución: planifica el suministro máximo al
createTree. - Canopy cero en árbol profundo - tx demasiado grande. Solución: establece la profundidad del canopy según las recomendaciones de Metaplex para tu profundidad.
- Asumir que la hoja está en la cuenta de la billetera - no hay cuenta de token SPL para cNFT. Solución: la propiedad es el estado de la hoja, léelo a través de DAS.
- Auto-alojamiento de pruebas sin indexador - infraestructura pesada. Solución: usa un proveedor DAS o ejecuta un indexador de Merkle.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| NFT completamente en cadena | Suministro bajo, máxima composabilidad | Lanzamiento de un millón de artículos |
| Base de datos fuera de cadena solamente | No se necesita procedencia en cadena | Se necesita prueba criptográfica de propiedad |
| Compresión zk (otra) | Pila de producto diferente | Ruta estándar de cNFT de Metaplex |
Preguntas frecuentes
¿Qué se almacena en cadena?
Raíz de Merkle, caché del canopy, metadatos del registro de cambios, no cada cuenta NFT.
¿Qué es una prueba de Merkle?
Hashes hermanos que prueban la inclusión de una hoja y permiten actualizaciones verificadas.
¿Por qué un árbol concurrente?
Soporta múltiples actualizaciones de hojas por slot sin contención de bloqueo global del árbol.
¿Qué es el canopy?
Caché en cadena de nodos superiores del árbol que reduce el tamaño de la prueba en las transacciones.
¿Quién sirve las pruebas?
Los proveedores RPC habilitados para DAS indexan árboles y exponen getAssetProof.
¿Se pueden falsificar las pruebas?
El programa Bubblegum/compresión verifica contra la raíz en cadena - las pruebas inválidas fallan.
¿Cuándo cambia la raíz?
Cada mint, transferencia, quema que actualiza una hoja.
¿IDs de programa?
Compresión: cmtDvXnzBMY46rZyrBGX7p7r4Xc78DGpXEC5rVjrvAf. Bubblegum: BGUMAp9Gq7iN3nEkgqX1FbwwdBonfLCEEgxoj36SYPk.
¿Puedo leer una hoja sin DAS?
Teóricamente a través de un indexador personalizado que ingiere registros del programa de compresión - DAS es el predeterminado de producción.
¿Límites de tamaño de prueba?
Impulsa el tamaño de la tx - el ajuste del canopy y las transacciones versionadas con ALTs ayudan.
¿Quemar un activo comprimido?
Reemplazo de hoja a estado nulo/quemado con prueba - instrucción de quema de Bubblegum.
¿Árboles de Devnet?
Misma mecánica en devnet; verifica el soporte de DAS en devnet en tu proveedor.
Relacionado
- Conceptos básicos de compresión de estado - introducción
- Lectura de activos comprimidos (DAS) - obtención de pruebas
- Transferencia de cNFTs - pruebas en transacciones
Versiones de la pila: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.