Lendo Assets Comprimidos (DAS)
Compressed NFTs não têm contas por asset legíveis via getAccountInfo. Apps de produção usam a DAS API para buscar metadata de asset, campos de compressão e merkle proofs para transferências.
Receita
const asset = await dasRpc("getAsset", { id: "CNFT_ID" });
const proof = await dasRpc("getAssetProof", { id: "CNFT_ID" });const collection = await dasRpc("getAssetsByGroup", {
groupKey: "collection",
groupValue: "COLLECTION_ID",
page: 1,
limit: 100,
});Quando usar:
- Renderizar galerias cNFT em carteiras
- Buscar proofs antes de construir transações de transferência
- Verificar id de árvore e índice de folha para depuração
- Dashboards de coleção após mint em massa
Exemplo Funcional
const DAS_RPC = process.env.DAS_RPC_URL!;
async function dasRpc<T>(method: string, params: unknown): Promise<T> {
const res = await fetch(DAS_RPC, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
});
const json = await res.json();
if (json.error) throw new Error(json.error.message);
return json.result as T;
}
type DasAsset = {
id: string;
compression?: {
eligible: boolean;
compressed: boolean;
leaf_id: number;
tree: string;
seq: number;
};
content?: { metadata?: { name?: string } };
};
type AssetProof = {
root: string;
proof: string[];
node_index: number;
leaf: string;
tree_id: string;
};
const assetId = "CNFT_ASSET_ID_FROM_PRIOR_QUERY";
const asset = await dasRpc<DasAsset>("getAsset", { id: assetId });
console.log("name:", asset.content?.metadata?.name);
console.log("tree:", asset.compression?.tree);
console.log("leaf:", asset.compression?.leaf_id);
const proof = await dasRpc<AssetProof>("getAssetProof", { id: assetId });
console.log("proof nodes:", proof.proof.length);
console.log("root:", proof.root);import { createSolanaRpc } from "@solana/kit";
// Standard RPC for sending txs; DAS for reads and proofs
const txRpc = createSolanaRpc(process.env.RPC_URL!);O que isso demonstra:
getAssetretorna metadatacompressionpara cNFTsgetAssetProoffornece hashes irmãos para instruções Bubblegum- Use
idretornado pelo DAS consistentemente - não só pubkey da árvore
Aprofundamento
Como Funciona
- Indexer rastreia eventos Bubblegum e atualizações de conta de árvore
- DAS normaliza assets comprimidos junto com Core e Token Metadata
getAssetProofdeve corresponder ao root atual - atualize antes do build da txgetAssetsByGrouplista cNFTs de coleção com paginação
Campos DAS para cNFTs
| Campo | Significado |
|---|---|
compression.tree | Pubkey da conta merkle tree |
compression.leaf_id | Índice da folha na árvore |
compression.seq | Sequência para atualizações concorrentes |
id | Identificador de asset DAS para chamadas de follow-up |
Notas TypeScript
// Cache asset metadata longer than proofs
// proofs TTL: seconds to minutes during active mint windowsArmadilhas
- Usar pubkey de mint como id cNFT - lookup DAS falha. Correção: use
iddegetAssetsByOwner. - Proof obsoleto - tx falha com root mismatch. Correção: busque proof imediatamente antes de assinar.
- Sem DAS em RPC público - método ausente. Correção: URL de provider com DAS habilitado.
- Gaps de paginação - coleção incompleta durante mint. Correção: pagine até página vazia após fim do mint.
- Ignorar
seq- raros problemas de update concorrente. Correção: inclua seq mais recente do asset no builder de transferência quando necessário.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Indexer merkle self-hosted | Controle total | MVP rápido |
| APIs Helius/Tensor | Conveniência SDK vendor | DAS padrão basta |
| Leituras só on-chain | Impossível para metadata completa | Produtos cNFT |
FAQs
Por que DAS para cNFTs?
Folhas não são contas completas - indexers reconstruem estado e expõem API unificada.
getAsset vs getAssetProof?
Asset: metadata + campos compression. Proof: irmãos merkle para transações.
Com que frequência proofs expiram?
Sempre que root da árvore muda - busque novamente por transação em períodos ativos.
Método de query de coleção?
getAssetsByGroup com chave/valor de agrupamento de coleção.
Suporte devnet?
Específico do provider - confirme DAS devnet no dashboard.
Limites de taxa?
Escale tier de API; cache metadata; minimize buscas de proof.
Valor do campo interface?
Tipicamente indica tipo compressed NFT no schema DAS.
Link para página DAS padrão?
Veja rpc-websockets-das-api/the-das-api para setup geral.
Ordem do array proof?
Siga expectativa do SDK Metaplex ao alimentar transferência Bubblegum - use builders oficiais quando possível.
Asset ausente após mint?
Lag de indexer - retry; verifique sucesso da tx de mint no explorer.
Comprimido fungível?
Produto diferente - foco cNFT aqui; DAS cobre múltiplas interfaces.
Integração kit 7.0.0?
fetch para DAS; kit para envio de transação após build com Umi/mpl-bubblegum.
Relacionado
- Reading NFTs (DAS API) - leituras gerais de NFT
- Transferring cNFTs - use proof na tx
- How Compression Works - teoria de proof
Versões da stack: Esta página foi 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 e LiteSVM 0.6.x.