Fase 2: Memórias Sobrevivem
+2026-02-14
+Uma tessera não está mais presa a uma única máquina. A Fase 2 entrega a camada +de replicação: os dados são divididos em fragmentos com codificação de +apagamento, distribuídos entre múltiplos pares e reparados automaticamente +quando nós ficam offline. Um livro-razão de reciprocidade bilateral garante +troca justa de armazenamento — sem blockchain, sem tokens.
+O que foi construído
+tesseras-core (atualizado) — Novos tipos de domínio de replicação:
+FragmentPlan (seleciona a camada de fragmentação baseada no tamanho da
+tessera), FragmentId (hash da tessera + índice + contagem de shards +
+checksum), FragmentEnvelope (fragmento com seus metadados para transporte na
+rede), FragmentationTier (Small/Medium/Large), Attestation (prova de que um
+nó possui um fragmento em um dado momento) e ReplicateAck (confirmação de
+recebimento de fragmento). Três novas traits de porta definem os limites
+hexagonais: DhtPort (encontrar pares, replicar fragmentos, solicitar
+atestações, ping), FragmentStore (armazenar/ler/deletar/listar/verificar
+fragmentos) e ReciprocityLedger (registrar trocas de armazenamento, consultar
+saldos, encontrar melhores pares). O tamanho máximo de uma tessera é 1 GB.
tesseras-crypto (atualizado) — O ReedSolomonCoder existente agora alimenta
+a codificação de fragmentos. Os dados são divididos em shards, shards de
+paridade são computados, e qualquer combinação de shards de dados pode
+reconstruir o original — desde que o número de shards ausentes não exceda a
+contagem de paridade.
tesseras-storage (atualizado) — Dois novos adaptadores:
+-
+
FsFragmentStore— armazena dados de fragmentos como arquivos em disco +({raiz}/{hash_tessera}/{indice:03}.shard) com um índice de metadados SQLite +rastreando hash da tessera, índice do shard, contagem de shards, checksum e +tamanho em bytes. A verificação recalcula o hash BLAKE3 e compara com o +checksum armazenado.
+SqliteReciprocityLedger— contabilidade bilateral de armazenamento em +SQLite. Cada par tem uma linha rastreando bytes armazenados para eles e bytes +que eles armazenam para nós. A colunabalanceé uma coluna gerada +(bytes_they_store_for_us - bytes_stored_for_them). UPSERT garante incremento +atômico dos contadores.
+
Nova migração (002_replication.sql) adiciona tabelas para fragmentos, planos
+de fragmentação, detentores, mapeamentos detentor-fragmento e saldos de
+reciprocidade.
tesseras-dht (atualizado) — Quatro novas variantes de mensagem: Replicate
+(enviar um envelope de fragmento), ReplicateAck (confirmar recebimento),
+AttestRequest (pedir a um nó que prove que possui os fragmentos de uma
+tessera) e AttestResponse (retornar atestação com checksums e timestamp). O
+engine trata essas mensagens em seu loop de despacho.
tesseras-replication — O novo crate, com cinco módulos:
+-
+
-
+
Codificação de fragmentos (
+fragment.rs):encode_tessera()seleciona a +camada de fragmentação baseada no tamanho e então chama a codificação +Reed-Solomon para as camadas Medium e Large. Três camadas:-
+
- Small (< 4 MB): replicação do arquivo inteiro para r=7 pares, sem +codificação de apagamento +
- Medium (4–256 MB): 16 shards de dados + 8 de paridade, distribuídos +entre r=7 pares +
- Large (≥ 256 MB): 48 shards de dados + 24 de paridade, distribuídos +entre r=7 pares +
+ -
+
Distribuição (
+distributor.rs): filtragem de diversidade de sub-rede limita +pares por sub-rede /24 IPv4 (ou prefixo /48 IPv6) para evitar falhas +correlacionadas. Se todos os seus fragmentos caírem no mesmo rack, uma única +queda de energia os elimina.
+ -
+
Serviço (
+service.rs):ReplicationServiceé o orquestrador. +replicate_tessera()codifica os dados, encontra os pares mais próximos via +DHT, aplica diversidade de sub-rede e distribui fragmentos em round-robin. +receive_fragment()valida o checksum BLAKE3, verifica o saldo de +reciprocidade (rejeita se o déficit do remetente exceder o limite +configurado), armazena o fragmento e atualiza o livro-razão. +handle_attestation_request()lista os fragmentos locais e calcula seus +checksums como prova de posse.
+ -
+
Reparo (
+repair.rs):check_tessera_health()solicita atestações dos +detentores conhecidos, recorre ao ping para nós não responsivos, verifica a +integridade local dos fragmentos e retorna uma de três ações:Healthy, +NeedsReplication { deficit }ouCorruptLocal { fragment_index }. O loop de +reparo roda a cada 24 horas (com 2 horas de jitter) viatokio::select!com +integração de desligamento.
+ -
+
Configuração (
+config.rs):ReplicationConfigcom padrões para intervalo +de reparo (24h), jitter (2h), transferências simultâneas (4), espaço livre +mínimo (1 GB), tolerância de déficit (256 MB) e limite de armazenamento por +par (1 GB).
+
tesd (atualizado) — O daemon agora abre um banco de dados SQLite
+(db/tesseras.db), executa migrações, cria instâncias de FsFragmentStore,
+SqliteReciprocityLedger e FsBlobStore, envolve o engine DHT em um
+DhtPortAdapter, constrói um ReplicationService e lança o loop de reparo como
+tarefa em segundo plano com desligamento gracioso.
Testes — 193 testes em todo o workspace:
+-
+
- 15 testes unitários em tesseras-replication (camadas de codificação de +fragmentos, validação de checksum, diversidade de sub-rede, verificações de +saúde do reparo, fluxos de recebimento/replicação do serviço) +
- 3 testes de integração com armazenamento real (ciclo completo +codificar→distribuir→receber para tessera média, replicação de arquivo inteiro +para tessera pequena, rejeição de fragmento adulterado) +
- Testes usam SQLite em memória + diretório temporário para fragmentos com mocks +mockall para DHT e BlobStore +
- Zero avisos do clippy, formatação limpa +
Decisões de arquitetura
+-
+
- Fragmentação em três camadas: arquivos pequenos não precisam de +codificação de apagamento — o overhead não compensa. Arquivos médios e grandes +recebem progressivamente mais shards de paridade. Isso evita desperdiçar +armazenamento em tesseras pequenas enquanto oferece redundância forte para as +grandes. +
- Distribuição por push do dono: o dono da tessera codifica os fragmentos e +os envia aos pares, em vez dos pares puxarem. Isso simplifica o protocolo (sem +fase de negociação) e garante que os fragmentos são distribuídos +imediatamente. +
- Reciprocidade bilateral sem consenso: cada nó rastreia seu próprio saldo +com cada par localmente. Sem livro-razão global, sem token, sem blockchain. Se +o par A armazena 500 MB para o par B, o par B deveria armazenar +aproximadamente 500 MB para o par A. Free riders perdem redundância +gradualmente — seus fragmentos são despriorizados para reparo, mas nunca +deletados. +
- Diversidade de sub-rede: os fragmentos são espalhados por diferentes +sub-redes para sobreviver a falhas correlacionadas. Uma queda de datacenter +não deveria eliminar todas as cópias de uma tessera. +
- Verificações de saúde por atestação primeiro: o loop de reparo pede aos +detentores que provem posse (atestação com checksums) antes de declarar uma +tessera degradada. Apenas quando a atestação falha é que ele recorre a um +simples ping. Isso detecta corrupção silenciosa de dados, não apenas partida +de nós. +
O que vem a seguir
+-
+
- Fase 3: API e Apps — App Flutter mobile/desktop via flutter_rust_bridge, +API GraphQL (async-graphql), nó WASM no navegador +
- Fase 4: Resiliência e Escala — Assinaturas pós-quânticas ML-DSA, travessia +avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros, +empacotamento para Alpine/Arch/Debian/FreeBSD/OpenBSD, CI no SourceHut +
- Fase 5: Exploração e Cultura — navegador público de tesseras, curadoria +institucional, integração genealógica, exportação para mídia física +
Os nós conseguem se encontrar e manter vivas as memórias uns dos outros. Em +seguida, damos às pessoas uma forma de segurar suas memórias nas mãos.
+ +