summaryrefslogtreecommitdiffstats
path: root/pt-br/news/phase1-basic-network/index.html
blob: 1dbbf62885d913b177b21ffbcfb54a02f9ac522d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Fase 1: Nós Se Encontram — Tesseras</title>
    <meta name="description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
    <!-- Open Graph -->
    <meta property="og:type" content="article">
    <meta property="og:title" content="Fase 1: Nós Se Encontram">
    <meta property="og:description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
    <meta property="og:image" content="https://tesseras.net/images/social.jpg">
    <meta property="og:image:width" content="1200">
    <meta property="og:image:height" content="630">
    <meta property="og:site_name" content="Tesseras">
    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="Fase 1: Nós Se Encontram">
    <meta name="twitter:description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
    <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
    <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
    
        
            <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
        
    
    <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
    
</head>
<body>
    <header>
        <h1>
            <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
                <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
                Tesseras
            </a>
        </h1>
        <nav>
            
                <a href="https://tesseras.net/pt-br/about/">Sobre</a>
                <a href="https://tesseras.net/pt-br/news/">Notícias</a>
                <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
                <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
                <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
                <a href="https://tesseras.net/pt-br/contact/">Contato</a>
            
        </nav>
        <nav class="lang-switch">
            
                <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase1-basic-network&#x2F;">English</a> | <strong>Português</strong>
            
        </nav>
    </header>

    <main>
        
<article>
    <h2>Fase 1: Nós Se Encontram</h2>
    <p class="news-date">2026-02-14</p>
    <p>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.</p>
<h2 id="o-que-foi-construido">O que foi construído</h2>
<p><strong>tesseras-core</strong> (atualizado) — Novos tipos de domínio de rede:
<code>TesseraPointer</code> (referência leve aos detentores de uma tessera e localização
dos fragmentos), <code>NodeIdentity</code> (ID do nó + chave pública + nonce de prova de
trabalho), <code>NodeInfo</code> (identidade + endereço + capacidades) e <code>Capabilities</code>
(bitflags do que um nó suporta: DHT, armazenamento, relay, replicação).</p>
<p><strong>tesseras-net</strong> — A camada de transporte, construída sobre QUIC via quinn. A
trait <code>Transport</code> define a porta: <code>send</code>, <code>recv</code>, <code>disconnect</code>, <code>local_addr</code>.
Dois adaptadores a implementam:</p>
<ul>
<li><code>QuinnTransport</code> — QUIC real com TLS auto-assinado, negociação ALPN
(<code>tesseras/1</code>), pool de conexões via DashMap e um loop de aceitação em
background que trata streams recebidas.</li>
<li><code>MemTransport</code> + <code>SimNetwork</code> — 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.</li>
</ul>
<p>O protocolo de fio usa MessagePack com prefixo de comprimento: um cabeçalho de 4
bytes big-endian seguido de um payload rmp-serde. <code>WireMessage</code> 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.</p>
<p><strong>tesseras-dht</strong> — Uma implementação completa de Kademlia:</p>
<ul>
<li><em>Tabela de roteamento</em>: 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.</li>
<li><em>Distância XOR</em>: métrica XOR de 160 bits com indexação de bucket pelo bit mais
significativo diferente.</li>
<li><em>Prova de trabalho</em>: nós iteram um nonce até que
<code>BLAKE3(pubkey || nonce)[..20]</code> 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.</li>
<li><em>Mensagens de protocolo</em>: Ping/Pong, FindNode/FindNodeResponse,
FindValue/FindValueResult, Store — todos serializados com MessagePack via
serde.</li>
<li><em>Armazenamento de ponteiros</em>: 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.</li>
<li><em>DhtEngine</em>: o orquestrador principal. Trata RPCs recebidos, executa buscas
iterativas (paralelismo alpha=3), bootstrap, publicação e busca. O método
<code>run()</code> dirige um loop <code>tokio::select!</code> com timers de manutenção: refresh da
tabela de roteamento a cada 60 segundos, expiração de ponteiros a cada 5
minutos.</li>
</ul>
<p><strong>tesd</strong> — 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.</p>
<p><strong>Infraestrutura</strong> — 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 <code>tesseras</code>, 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.</p>
<p><strong>Testes</strong> — 139 testes em todo o workspace:</p>
<ul>
<li>47 testes unitários em tesseras-dht (tabela de roteamento, distância, PoW,
armazenamento de ponteiros, serialização de mensagens, RPCs do engine)</li>
<li>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)</li>
<li>14 testes em tesseras-net (roundtrips de codec, send/recv de transporte,
backpressure, disconnect)</li>
<li>Testes de fumaça com Docker Compose usando 3 nós containerizados comunicando
sobre QUIC real</li>
<li>Zero avisos do clippy, formatação limpa</li>
</ul>
<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
<ul>
<li><strong>Transport como porta</strong>: a trait <code>Transport</code> é 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.</li>
<li><strong>Um stream por RPC</strong>: 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.</li>
<li><strong>MessagePack em vez de Protobuf</strong>: 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.</li>
<li><strong>PoW em vez de stake ou reputação</strong>: 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.</li>
<li><strong>Busca iterativa com atualização da tabela de roteamento</strong>: 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.</li>
</ul>
<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
<ul>
<li><strong>Fase 2: Replicação</strong> — 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)</li>
<li><strong>Fase 3: API e Apps</strong> — App Flutter mobile/desktop via flutter_rust_bridge,
API GraphQL (async-graphql), nó WASM no navegador</li>
<li><strong>Fase 4: Resiliência e Escala</strong> — 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</li>
<li><strong>Fase 5: Exploração e Cultura</strong> — navegador público de tesseras, curadoria
institucional, integração genealógica, exportação para mídia física</li>
</ul>
<p>Os nós conseguem se encontrar. Em seguida, aprendem a manter vivas as memórias
uns dos outros.</p>

</article>

    </main>

    <footer>
        <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
    </footer>
</body>
</html>