summaryrefslogtreecommitdiffstats
path: root/pt-br/news/phase2-replication/index.html
blob: 40320b8bf42b2b25040dd50c68c144ac6ff28309 (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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Fase 2: Memórias Sobrevivem — Tesseras</title>
    <meta name="description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
    <!-- Open Graph -->
    <meta property="og:type" content="article">
    <meta property="og:title" content="Fase 2: Memórias Sobrevivem">
    <meta property="og:description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
    <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 2: Memórias Sobrevivem">
    <meta name="twitter:description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
    <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;phase2-replication&#x2F;">English</a> | <strong>Português</strong>
            
        </nav>
    </header>

    <main>
        
<article>
    <h2>Fase 2: Memórias Sobrevivem</h2>
    <p class="news-date">2026-02-14</p>
    <p>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.</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 replicação:
<code>FragmentPlan</code> (seleciona a camada de fragmentação baseada no tamanho da
tessera), <code>FragmentId</code> (hash da tessera + índice + contagem de shards +
checksum), <code>FragmentEnvelope</code> (fragmento com seus metadados para transporte na
rede), <code>FragmentationTier</code> (Small/Medium/Large), <code>Attestation</code> (prova de que um
nó possui um fragmento em um dado momento) e <code>ReplicateAck</code> (confirmação de
recebimento de fragmento). Três novas traits de porta definem os limites
hexagonais: <code>DhtPort</code> (encontrar pares, replicar fragmentos, solicitar
atestações, ping), <code>FragmentStore</code> (armazenar/ler/deletar/listar/verificar
fragmentos) e <code>ReciprocityLedger</code> (registrar trocas de armazenamento, consultar
saldos, encontrar melhores pares). O tamanho máximo de uma tessera é 1 GB.</p>
<p><strong>tesseras-crypto</strong> (atualizado) — O <code>ReedSolomonCoder</code> 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.</p>
<p><strong>tesseras-storage</strong> (atualizado) — Dois novos adaptadores:</p>
<ul>
<li><code>FsFragmentStore</code> — armazena dados de fragmentos como arquivos em disco
(<code>{raiz}/{hash_tessera}/{indice:03}.shard</code>) 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.</li>
<li><code>SqliteReciprocityLedger</code> — 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 coluna <code>balance</code> é uma coluna gerada
(<code>bytes_they_store_for_us - bytes_stored_for_them</code>). UPSERT garante incremento
atômico dos contadores.</li>
</ul>
<p>Nova migração (<code>002_replication.sql</code>) adiciona tabelas para fragmentos, planos
de fragmentação, detentores, mapeamentos detentor-fragmento e saldos de
reciprocidade.</p>
<p><strong>tesseras-dht</strong> (atualizado) — Quatro novas variantes de mensagem: <code>Replicate</code>
(enviar um envelope de fragmento), <code>ReplicateAck</code> (confirmar recebimento),
<code>AttestRequest</code> (pedir a um nó que prove que possui os fragmentos de uma
tessera) e <code>AttestResponse</code> (retornar atestação com checksums e timestamp). O
engine trata essas mensagens em seu loop de despacho.</p>
<p><strong>tesseras-replication</strong> — O novo crate, com cinco módulos:</p>
<ul>
<li>
<p><em>Codificação de fragmentos</em> (<code>fragment.rs</code>): <code>encode_tessera()</code> 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:</p>
<ul>
<li><strong>Small</strong> (&lt; 4 MB): replicação do arquivo inteiro para r=7 pares, sem
codificação de apagamento</li>
<li><strong>Medium</strong> (4–256 MB): 16 shards de dados + 8 de paridade, distribuídos
entre r=7 pares</li>
<li><strong>Large</strong> (≥ 256 MB): 48 shards de dados + 24 de paridade, distribuídos
entre r=7 pares</li>
</ul>
</li>
<li>
<p><em>Distribuição</em> (<code>distributor.rs</code>): 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.</p>
</li>
<li>
<p><em>Serviço</em> (<code>service.rs</code>): <code>ReplicationService</code> é o orquestrador.
<code>replicate_tessera()</code> codifica os dados, encontra os pares mais próximos via
DHT, aplica diversidade de sub-rede e distribui fragmentos em round-robin.
<code>receive_fragment()</code> 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.
<code>handle_attestation_request()</code> lista os fragmentos locais e calcula seus
checksums como prova de posse.</p>
</li>
<li>
<p><em>Reparo</em> (<code>repair.rs</code>): <code>check_tessera_health()</code> 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: <code>Healthy</code>,
<code>NeedsReplication { deficit }</code> ou <code>CorruptLocal { fragment_index }</code>. O loop de
reparo roda a cada 24 horas (com 2 horas de jitter) via <code>tokio::select!</code> com
integração de desligamento.</p>
</li>
<li>
<p><em>Configuração</em> (<code>config.rs</code>): <code>ReplicationConfig</code> com 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).</p>
</li>
</ul>
<p><strong>tesd</strong> (atualizado) — O daemon agora abre um banco de dados SQLite
(<code>db/tesseras.db</code>), executa migrações, cria instâncias de <code>FsFragmentStore</code>,
<code>SqliteReciprocityLedger</code> e <code>FsBlobStore</code>, envolve o engine DHT em um
<code>DhtPortAdapter</code>, constrói um <code>ReplicationService</code> e lança o loop de reparo como
tarefa em segundo plano com desligamento gracioso.</p>
<p><strong>Testes</strong> — 193 testes em todo o workspace:</p>
<ul>
<li>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)</li>
<li>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)</li>
<li>Testes usam SQLite em memória + diretório temporário para fragmentos com mocks
mockall para DHT e BlobStore</li>
<li>Zero avisos do clippy, formatação limpa</li>
</ul>
<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
<ul>
<li><strong>Fragmentação em três camadas</strong>: 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.</li>
<li><strong>Distribuição por push do dono</strong>: 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.</li>
<li><strong>Reciprocidade bilateral sem consenso</strong>: 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.</li>
<li><strong>Diversidade de sub-rede</strong>: 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.</li>
<li><strong>Verificações de saúde por atestação primeiro</strong>: 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.</li>
</ul>
<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
<ul>
<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 e manter vivas as memórias uns dos outros. Em
seguida, damos às pessoas uma forma de segurar suas memórias nas mãos.</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>