> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/contributor/contributor-pt/conteudo/snapshots.md).

# Snapshots

Os content servers irão compilar periodicamente resumos das active entities que estão a alojar, chamados *snapshots*. São regulares [files](https://github.com/decentraland/docs/tree/main/contributor/filesystem.md) e podem ser descarregados usando o seu identificador.

Os snapshots são criados numa base diária, semanal, mensal e anual. Cada um contém o conjunto de active entities que mudou desde o snapshot anterior para esse intervalo.

Os snapshots conterão versões conflituantes das mesmas entities (isto é, diferentes [manifest files](https://github.com/decentraland/docs/tree/main/contributor/entities.md#properties) associados ao mesmo pointer), à medida que são atualizados. Ao analisá-los, os clients devem manter a versão no snapshot mais recente. Como os content servers podem apagar files inativos, não é garantido que versões obsoletas de entities estejam disponíveis para download.

Quando um novo snapshot *substitui* os mais antigos (por exemplo, um snapshot semanal que combina uma série de diários), os seus metadados indicam quais os files anteriores que são substituídos, para que os clients não precisem de os descarregar.

O conjunto completo de active entities pode ser descoberto combinando todos os snapshots disponíveis (mais sobre isso abaixo), mantendo a entity mais recente referenciada por cada [pointer](https://github.com/decentraland/docs/tree/main/contributor/pointers.md) descoberto ao longo do caminho.

Pode experimentar snapshots com código funcional na [prática](https://github.com/decentraland/docs/tree/main/contributor/practice.md) secção.

### Descobrir Snapshots <a href="#discover" id="discover"></a>

Para localizar o conjunto atual de snapshots, use o [`snapshots` endpoint](https://decentraland.github.io/catalyst-api-specs/#tag/Content-Server/operation/getSnapshots). A resposta contém um array de itens com estes campos:

| Campo                     | Valor                                                                                        |
| ------------------------- | -------------------------------------------------------------------------------------------- |
| `generationTimestamp`     | O timestamp Unix UTC quando este snapshot foi criado.                                        |
| `hash`                    | O snapshot [file](https://github.com/decentraland/docs/tree/main/contributor/filesystem.md). |
| `numberOfEntities`        | O número de entradas no snapshot file.                                                       |
| `replacedSnapshotHashes`  | Um array com os `hash` de quaisquer snapshots substituídos por este.                         |
| `timeRange.initTimestamp` | O timestamp Unix UTC (em milissegundos) para o início do intervalo do snapshot.              |
| `timerange.endTimestamp`  | O timestamp Unix UTC (em milissegundos) para o fim do intervalo.                             |

Por exemplo:

```json
{
  "generationTimestamp": 1684979298844,
  "hash": "bafybeiflmm46nr4vv2h3wuzbx3pukcz7ju4fhbfzt6yxmoo533uktlgru4",
  "numberOfEntities": 12345,
  "replacedSnapshotHashes": [ "bafybeicw6x75ieaxfwynekbyhpcsgctpjkt6cb4j6oa7s57qjj6e4b5phd" ],
  "timeRange": {
     "initTimestamp": 1684281600000,
     "endTimestamp": 1684886400000
  }
}
```

### Descarregar Snapshots <a href="#download" id="download"></a>

Usando o `hash` campo de um snapshot, os clients podem descarregar as entities associadas criadas ou atualizadas nesse intervalo de tempo.

Os snapshot files começam com esta linha exata:

```
### Decentraland json snapshot
```

Depois disso, cada linha é um documento JSON que descreve um [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md) com os seguintes campos:

| Campo             | Valor                                                                                                                                                        |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `entityId`        | O identificador imutável para esta [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md).                                         |
| `entityType`      | Um de `scene`, `perfil`, `wearable`, `emote`, `store` ou `outfits`.                                                                                          |
| `pointers`        | Um array de [pointers](https://github.com/decentraland/docs/tree/main/contributor/pointers.md) que resolvem (ou eram usados para resolver) para esta entity. |
| `entityTimestamp` | O timestamp Unix UTC (em milissegundos) quando esta entity foi carregada.                                                                                    |
| `authChain`       | O [serializada em JSON](https://github.com/decentraland/docs/tree/main/contributor/entities.md#ownership) para esta entity.                                  |

Uma entrada típica tem este aspeto:

```json
{
  "entityId": "bafkreigrvaqynmiglpvewwhn2yd63q5dvagrrt5jbhimzvbrn5kimj5zne",
  "entityType": "wearable",
  "pointers": ["urn:decentraland:matic:collections-v2:0x11a6879861f36cbad632a4e7226816a16139fb33:0"],
  "entityTimestamp": 1671117456129,
  "authChain": [
    // ... payloads e assinaturas da cadeia de autenticação
  ]
}
```

{% hint style="info" %}
Se pretender analisar um snapshot linha a linha, lembre-se de saltar (ou, melhor ainda, validar) a primeira linha com o cabeçalho e esteja preparado para lidar com uma linha vazia no fim do file.
{% endhint %}

#### Iniciar um Entity Index <a href="#index-start" id="index-start"></a>

Os clients que pretendem indexar todo o conjunto de active entities devem processar todos os snapshots atualmente disponíveis e manter a entity mais recente [entity](https://github.com/decentraland/docs/tree/main/contributor/entities.md) para cada [pointer](https://github.com/decentraland/docs/tree/main/contributor/pointers.md).

A estratégia mais simples é processar os snapshots por ordem cronológica inversa (isto é, do mais recente para o mais antigo), ignorando pointers que já tenham sido descobertos, de modo a manter a referência para a entity mais recente.

Em pseudo-código:

```py
# Descarregue o conjunto atual de snapshots e ordene-os do mais recente para o mais antigo:
snapshots = get_snapshots()
snapshots.sort('timeRange.initTimestamp', DESCENDING)

seen_pointers = set()

# Processe os snapshots, mantendo a entity mais recente para cada pointer:
for snapshot in snapshots:
    items = get_snapshot_items(snapshot) 

    for item in items:
        if any(pointer in seen_pointers for pointer in item.pointers):
            discard(item)
        else:
            keep(item)
            seen_pointers.update(item.pointers)
```

Como as entities individuais podem ser referenciadas por múltiplos pointers (como é comum no caso de [cenas](/contributor/contributor-pt/conteudo/tipos-de-entity/scenes.md)), todos eles devem ser verificados antes de decidir manter ou descartar o item.

{% hint style="info" %}
Os snapshot files para os intervalos de tempo mais longos podem ser muito grandes. Para fins de desenvolvimento e experimentação que não exijam indexar todo o conjunto de entities, recomenda-se usar os snapshots mais pequenos. O conjunto resultante de entities será incompleto, mas válido.
{% endhint %}

#### Atualizar um Entity Index <a href="#index-update" id="index-update"></a>

Os clients que mantêm um entity index atualizado podem fazer chamadas periódicas ao [`snapshots`](https://decentraland.github.io/catalyst-api-specs/#tag/Content-Server/operation/getSnapshots) endpoint e determinar se devem descarregar cada file considerando:

* O snapshot identificado por `hash` já foi descarregado?
* Está `hash` na `replacedSnapshotHashes` lista de outro snapshot que já foi descarregado?
* É o `timeRange` relevante para os fins atuais?

Se houver novos snapshots a processar, pode usar-se a mesma estratégia acima para atualizar um dataset existente.

### Exemplos

Na [prática](https://github.com/decentraland/docs/tree/main/contributor/practice.md) secção, encontrará exemplos de código que funcionam com o sistema de snapshots.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/contributor/contributor-pt/conteudo/snapshots.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
