Apêndice: Estruturas de dados mínimas (manifest/chunk/estado)
Este apêndice apresenta recomendações mínimas de estruturas de dados para “fragmentação paralela + transferência retomável + novas tentativas idempotentes”. O objetivo é permitir concorrência de alta vazão e recuperação confiável após falhas, sem transações complexas.
Princípios gerais
- Objetos grandes versus estado pequeno: os chunks e o manifest são objetos grandes armazenados no armazenamento de objetos; o estado é pequeno e fica em um armazenamento de estado.
- Chaves únicas e idempotência: um chunk DEVE ser endereçável de forma única por (transferId, fileId, chunkIndex), para permitir retransmissões idempotentes.
- Recuperabilidade: o estado DEVE expressar o “conjunto concluído”, para que a recuperação possa pular as partes já concluídas.
- Sem vazamento de dados sensíveis: as chaves de objeto e o estado DEVERIAM evitar embutir campos sensíveis, como e-mail ou nomes de arquivo originais (se esses campos são criptografados depende da sua política de privacidade).
A.1 Campos mínimos do manifest
O manifest é o “ponto de entrada único” do receptor para o download e a remontagem. Recomendações mínimas:
- manifestVersion: DEVE. Usado em atualizações de compatibilidade (por exemplo,
1). - transferId: DEVE. Identificador único da sessão de transferência.
- createdAt / expiresAt: DEVERIA. Para o tratamento do ciclo de vida e dicas na interface.
- policy: DEVERIA. Um resumo da política (limites de contagem de downloads, exigência de senha, se é permitido compartilhar antes da conclusão etc.).
- files[]: DEVE. Descrição da lista de arquivos (no mínimo os tamanhos dos arquivos e os intervalos de chunks).
- chunking: DEVE. Inclui o chunkSize e como o chunkCount é calculado, ou o chunkCount de cada arquivo.
- objectKeyRule: DEVE. Derivar as chaves de objeto a partir de (transferId, fileId, chunkIndex) ou fornecer uma tabela de mapeamento explícita.
A.1.1 Campos mínimos de files[]
- fileId: DEVE. Identificador único do arquivo (não use o nome do arquivo como chave única).
- size: DEVE. Tamanho em bytes.
- mime: PODE. Para exibição e sugestões de download.
- name: PODE. Se você quiser conhecimento zero estrito / vazamento mínimo, omita
nameou armazene um nome criptografado. - chunkCount: DEVE. Quantidade de chunks deste arquivo.
- chunkOffset: PODE. Se vários arquivos compartilham um
chunkIndexglobal, é necessário um deslocamento; caso contrário, pode ser omitido.
A.1.2 Campos de integridade e verificação (opcionais, mas recomendados)
- chunkHashes[]: DEVERIA. Verificação por chunk (um ou uma combinação de hash/tamanho/etag).
- fileHash: PODE. Checksum do arquivo inteiro (verificar após o download).
- ciphertextLength: PODE. Verificações de consistência de tamanho no nível do texto cifrado (sem precisar do texto simples).
A.2 Objetos de chunk: restrições mínimas
- Endereçamento único: um chunk DEVE ser endereçável de forma única por (transferId, fileId, chunkIndex).
- Upload idempotente: reenviar o mesmo chunk NÃO DEVE corromper o estado final (ele pode sobrescrever ou ser rejeitado, mas o comportamento deve ser consistente).
- Metadados mínimos: o servidor PODE registrar apenas o tamanho do texto cifrado, o horário de gravação, o etag/versão etc., para observabilidade e diagnóstico de problemas.
A.2.1 Regra de chave de objeto (exemplo)
/transfers/{transferId}/chunks/{fileId}/{chunkIndex}/transfers/{transferId}/manifest
Restrição: as chaves de objeto DEVEM permitir a limpeza em massa pelo prefixo transferId; as chaves de objeto DEVERIAM evitar carregar informações de negócio sensíveis.
A.3 Registros de estado: campos mínimos
O estado responde a “progresso e recuperação de upload/download”. Deve ser pequeno e rápido de ler e gravar.
- transferId: DEVE.
- status: DEVE. Valores sugeridos:
UPLOADING/READY/DELETED/EXPIRED. - uploadedSet: DEVE. Conjunto de chunks concluídos; DEVERIA ser comprimido com um bitmap / conjunto de intervalos.
- uploadedBytes: DEVERIA. Para exibir o progresso e verificar cotas (pode ser derivado dos chunks, mas mantê-lo é mais rápido).
- downloadCount: PODE. Se você impõe limites de contagem de downloads, ele precisa ser registrado e atualizado de forma atômica (os detalhes dependem do seu armazenamento).
- expiresAt: DEVERIA. Para aplicar a expiração e a limpeza em segundo plano.
A.3.1 Saída mínima de uma API de recuperação
Para transferências retomáveis, o servidor DEVERIA ser capaz de retornar:
- Status da transferência (UPLOADING/READY/DELETED/EXPIRED)
- uploadedSet (conjunto de chunks concluídos)
- Resumo da política (por exemplo, acima da cota, expirada, se é permitido continuar o upload)
Observação: limite em relação ao whitepaper de segurança e privacidade
- Este apêndice descreve apenas as “estruturas e restrições” necessárias para a transferência e o armazenamento.
- Para os campos de criptografia, a forma como o material de chaves é transportado/derivado e o comportamento de falha fechada em caso de falhas de autenticação, consulte o whitepaper de segurança e privacidade.