summaryrefslogtreecommitdiffstats
path: root/pt-br/news/phase2-replication
diff options
context:
space:
mode:
Diffstat (limited to 'pt-br/news/phase2-replication')
-rw-r--r--pt-br/news/phase2-replication/index.html213
-rw-r--r--pt-br/news/phase2-replication/index.html.gzbin0 -> 4668 bytes
2 files changed, 213 insertions, 0 deletions
diff --git a/pt-br/news/phase2-replication/index.html b/pt-br/news/phase2-replication/index.html
new file mode 100644
index 0000000..40320b8
--- /dev/null
+++ b/pt-br/news/phase2-replication/index.html
@@ -0,0 +1,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>
diff --git a/pt-br/news/phase2-replication/index.html.gz b/pt-br/news/phase2-replication/index.html.gz
new file mode 100644
index 0000000..7658f2c
--- /dev/null
+++ b/pt-br/news/phase2-replication/index.html.gz
Binary files differ