Fase 1: Nós Se Encontram
2026-02-14
Tesseras não é mais uma ferramenta apenas local. A Fase 1 entrega a camada de rede: nós se descobrem através de uma DHT Kademlia, comunicam-se sobre QUIC e publicam ponteiros de tesseras que qualquer par na rede pode encontrar. Uma tessera criada no nó A agora pode ser encontrada a partir do nó C.
O que foi construído
tesseras-core (atualizado) — Novos tipos de domínio de rede:
TesseraPointer (referência leve aos detentores de uma tessera e localização
dos fragmentos), NodeIdentity (ID do nó + chave pública + nonce de prova de
trabalho), NodeInfo (identidade + endereço + capacidades) e Capabilities
(bitflags do que um nó suporta: DHT, armazenamento, relay, replicação).
tesseras-net — A camada de transporte, construída sobre QUIC via quinn. A
trait Transport define a porta: send, recv, disconnect, local_addr.
Dois adaptadores a implementam:
QuinnTransport— QUIC real com TLS auto-assinado, negociação ALPN (tesseras/1), pool de conexões via DashMap e um loop de aceitação em background que trata streams recebidas.MemTransport+SimNetwork— canais em memória para testes determinísticos sem I/O de rede. Cada teste de integração no crate DHT roda contra este adaptador.
O protocolo de fio usa MessagePack com prefixo de comprimento: um cabeçalho de 4
bytes big-endian seguido de um payload rmp-serde. WireMessage carrega um byte
de versão, ID de requisição e um corpo que pode ser requisição, resposta ou erro
de protocolo. Tamanho máximo de mensagem é 64 KiB.
tesseras-dht — Uma implementação completa de Kademlia:
- Tabela de roteamento: 160 k-buckets com k=20. Evicção do menos recentemente visto, mover-para-trás ao atualizar, verificação por ping antes de substituir a entrada mais antiga de um bucket cheio.
- Distância XOR: métrica XOR de 160 bits com indexação de bucket pelo bit mais significativo diferente.
- Prova de trabalho: nós iteram um nonce até que
BLAKE3(pubkey || nonce)[..20]tenha 8 bits zero iniciais (~256 tentativas de hash em média). Barato o suficiente para qualquer dispositivo, caro o suficiente para tornar ataques Sybil impraticáveis em escala. - Mensagens de protocolo: Ping/Pong, FindNode/FindNodeResponse, FindValue/FindValueResult, Store — todos serializados com MessagePack via serde.
- Armazenamento de ponteiros: armazenamento em memória limitado com TTL configurável (24 horas padrão) e máximo de entradas (10.000 padrão). Quando cheio, remove ponteiros mais distantes do ID do nó local, seguindo o modelo de responsabilidade baseado em distância do Kademlia.
- DhtEngine: o orquestrador principal. Trata RPCs recebidos, executa buscas
iterativas (paralelismo alpha=3), bootstrap, publicação e busca. O método
run()dirige um looptokio::select!com timers de manutenção: refresh da tabela de roteamento a cada 60 segundos, expiração de ponteiros a cada 5 minutos.
tesd — Um binário de nó completo. Analisa argumentos de CLI (endereço de bind, pares de bootstrap, diretório de dados), gera uma identidade de nó válida por PoW, abre um endpoint QUIC, faz bootstrap na rede e roda o motor DHT. Desligamento gracioso com Ctrl+C via tratamento de sinais do tokio.
Infraestrutura — Configuração OpenTofu para dois nós bootstrap no Hetzner
Cloud (instâncias cx22 em Falkenstein, Alemanha e Helsinki, Finlândia). Script
de provisionamento cloud-init cria um usuário dedicado tesseras, escreve um
arquivo de configuração e configura um serviço systemd. Regras de firewall abrem
UDP 4433 (QUIC) e restringem métricas a acesso interno.
Testes — 139 testes em todo o workspace:
- 47 testes unitários em tesseras-dht (tabela de roteamento, distância, PoW, armazenamento de ponteiros, serialização de mensagens, RPCs do engine)
- 5 testes de integração multi-nó (bootstrap de 3 nós, convergência de lookup com 10 nós, publicar-e-encontrar, detecção de partida de nó, rejeição de PoW)
- 14 testes em tesseras-net (roundtrips de codec, send/recv de transporte, backpressure, disconnect)
- Testes de fumaça com Docker Compose usando 3 nós containerizados comunicando sobre QUIC real
- Zero avisos do clippy, formatação limpa
Decisões de arquitetura
- Transport como porta: a trait
Transporté a única interface entre o motor DHT e a rede. Trocar QUIC por qualquer outro protocolo significa implementar quatro métodos. Todos os testes de DHT usam o adaptador em memória, tornando-os rápidos e determinísticos. - Um stream por RPC: cada par requisição-resposta DHT usa um stream bidirecional QUIC novo. Sem complexidade de multiplexação, sem bloqueio head-of-line entre operações independentes. O QUIC trata a multiplexação no nível da conexão.
- MessagePack em vez de Protobuf: codificação binária compacta sem geração de código ou arquivos de esquema. Integração com serde significa que adicionar um campo a uma mensagem é uma mudança de uma linha. Trade-off: sem garantias de evolução de esquema embutidas, mas neste estágio velocidade importa mais.
- PoW em vez de stake ou reputação: uma identidade de nó custa ~256 hashes BLAKE3. Isso roda em menos de um segundo em qualquer hardware, incluindo um Raspberry Pi, mas gerar milhares de identidades para um ataque Sybil se torna caro. Sem tokens, sem blockchain, sem dependências externas.
- Busca iterativa com atualização da tabela de roteamento: nós descobertos são adicionados à tabela de roteamento conforme encontrados durante buscas iterativas, seguindo o comportamento padrão do Kademlia. Isso garante que a tabela de roteamento melhore organicamente conforme os nós interagem.
O que vem a seguir
- Fase 2: Replicação — Codificação de apagamento Reed-Solomon pela rede, distribuição de fragmentos, loops de reparo automáticos, livro-razão de reciprocidade bilateral (sem blockchain, sem tokens)
- 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. Em seguida, aprendem a manter vivas as memórias uns dos outros.