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.
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.
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.
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.
| Dado | Durante a venda | Após esgotar |
|---|---|---|
| Raiz de Merkle e carimbo | público | público |
| Hash da semente do servidor | público | público |
| Commit de cada pack | público | público |
| Registro de vendas | público, em tempo real | público |
| Conteúdo do seu pack | só para você, ao abrir | público |
| Semente do servidor | fechado | público |
| Conteúdo dos demais packs | fechado | pú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⁶⁴.
