diff options
Diffstat (limited to 'pt-br/news/phase2-replication')
| -rw-r--r-- | pt-br/news/phase2-replication/index.html | 213 | ||||
| -rw-r--r-- | pt-br/news/phase2-replication/index.html.gz | bin | 0 -> 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://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://tesseras.net/news/phase2-replication/">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> (< 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>© 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 Binary files differnew file mode 100644 index 0000000..7658f2c --- /dev/null +++ b/pt-br/news/phase2-replication/index.html.gz |