Pular para o conteúdo

Metodologia de integridade

Esta página existe para você não precisar acreditar em nós.

O problema, dito por inteiro

Nós conhecemos o conteúdo de cada pack desde a ingestão. Alguém abriu o booster, fotografou e catalogou carta por carta — não tem como ser diferente. Então a pergunta honesta não é "vocês olham?", é: o que impede vocês de usar o que sabem?

São três coisas distintas, e cada uma precisa da sua própria trava.

1

O ataque

Trocar o conteúdo depois de ver quem comprou

A trava

Compromisso criptográfico antes da primeira venda

Antes de vender qualquer pack, calculamos SHA-256(conteúdo + nonce) de cada um e publicamos a raiz de uma árvore de Merkle sobre todos eles. Essa raiz recebe carimbo de tempo independente. Mudar uma única carta de um único pack muda a raiz — e a raiz antiga já está carimbada, com data, fora do nosso controle.

2

O ataque

Escolher qual pack vai para qual pessoa

A trava

Sorteio com a sua semente

O pack que você recebe sai de HMAC-SHA256(semente_do_servidor, sua_semente:k:i) sobre a lista de packs ainda disponíveis. A nossa semente é comprometida (publicamos o hash dela) antes da primeira venda; a sua você escolhe na hora. Sem conhecer a sua semente de antemão, não há como preparar o resultado — e depois de comprometida, a nossa não pode mais ser trocada.

3

O ataque

Mexer na lista de disponíveis entre uma venda e outra

A trava

Registro público de cada venda

Toda abertura entra na hora num registro público, com o índice sorteado e o Pack ID consumido — nunca o conteúdo. Quando o lote esgota, revelamos a semente do servidor e qualquer pessoa refaz a sequência inteira, do primeiro ao último sorteio, e confere linha por linha.

Por que o nonce existe

Um booster brasileiro tem 6 cartas de um set conhecido. Sem o nonce, quem tem o catálogo poderia testar todas as combinações plausíveis, calcular o hash de cada uma e descobrir o conteúdo de um pack fechado só comparando com o commit publicado. O espaço é pequeno o bastante para isso ser trivial. Com 32 bytes aleatórios somados a cada pack, não é. O nonce fica guardado cifrado e só é publicado na revelação.

O que fica fechado durante a venda, e por quê

Esta é a parte onde transparência e sustentabilidade puxam para lados opostos, e vale explicar em vez de esconder.

Se publicássemos quais cartas ainda restam no lote, daria para calcular o valor esperado do estoque remanescente e comprar só quando ele ficasse favorável. Quem fizesse a conta compraria bem às custas de quem comprou antes, e o lote seguinte teria que ser pior para compensar. A saída não é esconder mais — é comprometer tudo antes e revelar tudo depois.

DadoDurante a vendaApós esgotar
Raiz de Merkle e carimbopúblicopúblico
Hash da semente do servidorpúblicopúblico
Commit de cada packpúblicopúblico
Registro de vendaspúblico, em tempo realpúblico
Conteúdo do seu packsó para você, ao abrirpúblico
Semente do servidorfechadopúblico
Conteúdo dos demais packsfechadopúblico

O que isto não prova

Criptografia prova que o conteúdo catalogado não mudou e que a atribuição não foi escolhida. Ela não prova que a carta física dentro do envelope é a que foi catalogada. Isso é problema de operação, e a resposta é outra: vídeo contínuo da ingestão com o Pack ID visível, conferência por uma segunda pessoa, inventário cíclico e auditoria independente por lote.

Achamos importante dizer isso aqui, na mesma página, em vez de deixar a matemática dar a impressão de cobrir mais do que cobre.

Apêndice técnico

A especificação completa — serialização canônica byte a byte, construção da árvore, amostragem sem viés, formato do arquivo público e vetores de teste — está em docs/07-spec-integridade.md. O critério que usamos para considerá-la pronta é literal: alguém que nunca viu o nosso código consegue escrever um verificador independente lendo só o documento.

Compromisso por pack
commit = SHA-256( canônico(pack) ‖ 0x00 ‖ nonce )
Folha e nó da árvore
folha = SHA-256( 0x00 ‖ commit ) · nó = SHA-256( 0x01 ‖ esquerda ‖ direita )
Sorteio
índice = amostra_sem_viés( HMAC-SHA256( semente_servidor, "sua_semente:k:i" ), N )

Dois detalhes que parecem preciosismo e não são. O nó ímpar de um nível é promovido, nunca duplicado — duplicar cria duas árvores diferentes com a mesma raiz. E o sorteio descarta valores enviesados em vez de usar o resto da divisão direto, porque o resto favorece os índices baixos sempre que N não divide 2⁶⁴.