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 | 4668 -> 0 bytes |
2 files changed, 0 insertions, 213 deletions
diff --git a/pt-br/news/phase2-replication/index.html b/pt-br/news/phase2-replication/index.html deleted file mode 100644 index 40320b8..0000000 --- a/pt-br/news/phase2-replication/index.html +++ /dev/null @@ -1,213 +0,0 @@ -<!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 differdeleted file mode 100644 index 7658f2c..0000000 --- a/pt-br/news/phase2-replication/index.html.gz +++ /dev/null |