Como funciona o Provably Fair

Nosso compromisso é oferecer sorteios totalmente transparentes, confiáveis e seguros. Implementamos o sistema “Provably Fair” para que você possa acompanhar, de forma técnica e acessível, todo o processo. Antes de cada sorteio, geramos uma Server Seed única e divulgamos seu hash, garantindo que seu valor não possa ser alterado posteriormente. No momento do sorteio, uma Client Seed é gerada aleatoriamente e combinada com a Server Seed, formando o Final Hash através do algoritmo SHA-256. Essa combinação rigorosa assegura que qualquer tentativa de manipulação seja imediatamente detectada, pois qualquer alteração resultaria em um hash incompatível com o divulgado. Dessa forma, você tem acesso a um método auditável que reforça a integridade e a imparcialidade de cada sorteio.

1. Geração e Divulgação do Hash da Server Seed

1.1. O que é a Server Seed
A Server Seed é um texto (string) aleatório que criamos e guardamos antes de iniciar o sorteio. Costuma ser composta por:

  • Um prefixo que indica o propósito (ex.: "pub-" para semente oficial, "test-" em casos de teste, etc.).
  • Um UUID4 (identificador universal único), garantindo que seja praticamente impossível gerar duas seeds idênticas.
  • Opcionalmente, um sufixo de data/hora ou outro identificador.

Exemplo de Server Seed:

pub-20230415-b3e29fc2-71dd-4d19-9ecc-1690c6b023c4

  • "pub-20230415" indica que foi gerada publicamente em 15/04/2023.
  • "b3e29fc2-71dd-4d19-9ecc-1690c6b023c4" é um UUID4 (128 bits de entropia).

1.2. Por que divulgamos apenas o Hash dessa seed no começo
Não revelamos a Server Seed diretamente no início. Em vez disso, publicamos um “compromisso” na forma de um hash (cálculo feito com o algoritmo SHA-256). Por exemplo:

SHA-256("pub-20230415-b3e2...") => "c91d3f7e4a43906a65bc...f32b"

Ao publicar esse valor (64 caracteres hexadecimais), estamos nos obrigando a não modificar a Server Seed depois, pois qualquer mudança (mesmo de um caractere) mudaria completamente o hash. Assim, se alguém desconfiar que alteramos a seed, basta recalcular o hash para ver se bate com o que foi divulgado inicialmente.

2. Criação (ou Definição) da Client Seed

O segundo elemento é a Client Seed, que adiciona outra camada de segurança:

  • Pode ter um prefixo como "auto-", sinalizando que foi gerada automaticamente, ou "final-", se for a semente usada no resultado definitivo.
  • Em muitos casos, vem de um fator independente, seja tempo exato, aleatoriedade extra ou algo fornecido por usuários.

Por que precisamos de uma Client Seed?
Se a NeshaStore pudesse escolher sozinha a Server Seed após ver a do cliente, seria possível manipular o resultado final. Com a Client Seed, a chance de manipulação desaparece, pois a soma de ambas define o “número aleatório”. Se tentássemos mudar a Server Seed depois, o hash que anunciamos publicamente deixaria de bater.

3. Final Hash = SHA-256(ServerSeed + ClientSeed)

3.1. Concatenação das Seeds

No momento oficial do sorteio, concatenamos a Server Seed e a Client Seed em uma só string. Exemplo:

ServerSeed: "pub-20230415-b3e29fc2-71dd-4d19-9ecc-1690c6b023c4" ClientSeed: "auto-1680012345-9dbf316c-a21b-47f3-b414-d264f5203bec" ValorCombinado: "pub-20230415-b3e29fc2-71dd-4d19-9ecc-1690c6b023c4auto-1680012345-9dbf316c-a21b-47f3-b414-d264f5203bec"

3.2. Aplicação do algoritmo SHA-256

O algoritmo SHA-256 converte esse ValorCombinado em 256 bits (exibidos normalmente como 64 caracteres hex). Chamamos isso de Final Hash.

FinalHash = SHA-256( ValorCombinado )

Se qualquer caractere da Server Seed ou da Client Seed for alterado, o Final Hash muda completamente (propriedade de avalanche do SHA-256).

4. Como o Final Hash decide os vencedores

Digamos que temos um Final Hash de 64 caracteres (hexadecimais) após concatenar e hashear as duas seeds. Queremos, por exemplo, escolher 3 ganhadores dentre 100 participantes.

4.1. Conversão em números pseudoaleatórios

  1. Dividimos o Final Hash em blocos de 8 caracteres (cada bloco representa 32 bits).
  2. Convertendo esse bloco de 8 caracteres hex em decimal, obtemos um valor entre 0 e 0xFFFFFFFF (~4,29 bilhões).
  3. Dividimos o valor por 0xFFFFFFFF, obtendo um número entre 0 e 1.
  4. Multiplicamos esse número pela quantidade total de participantes (ex.: 100), para obter um índice.

Exemplo prático:

  • O Final Hash começa com "a4d9c6450e8ee215..."
  • Primeiro bloco de 8 chars: "a4d9c645". Em decimal, isso pode dar ~2763456325.
  • Dividindo por 4294967295, obtemos 0.6438.
  • Multiplicando por 100 (participantes), chegamos a 64,38. Arredondando para baixo, índice 64.
  • Esse índice (64) corresponde a um participante na lista (por exemplo, “João”). Ele é o 1º vencedor.

Para o segundo ganhador, usamos o próximo bloco de 8 hex. Para o terceiro, o seguinte, e assim por diante até atingir a quantidade de ganhadores necessária. Se algum índice sair duplicado (indicando a mesma pessoa novamente), aplicamos regra de não repetir (por exemplo, somar 1 e fazer % total).

5. Conferindo na prática (Verificação Independente)

Após a NeshaStore anunciar o resultado, nós revelamos:

  1. Server Seed real (aquela que antes tinha só o hash publicado).
  2. Client Seed usada.
  3. Como dividimos o Final Hash para escolher ganhadores.

Quem quiser conferir faz:

  1. Verifica se SHA-256(ServerSeed) bate com o hash publicado no início (garantindo que não trocamos de seed).
  2. Concatena ServerSeed + ClientSeed e calcula SHA-256 desse valor, para ver se obtém o mesmo Final Hash.
  3. Percorre o Final Hash em blocos de 8 caracteres para replicar a seleção de índices, confirmando os mesmos vencedores.

5.1. Ferramenta de verificação manual

Caso você deseje fazer essa checagem de maneira simples, a NeshaStore oferece um campo.

Verificação Manual – Cálculo de Final Hash

Insira a Server Seed e a Client Seed:







Basta inserir a Server Seed e a Client Seed nos espaços indicados, e o sistema exibirá o Final Hash calculado. Se esse hash bater com o oficial, comprova-se que as sementes divulgadas são legítimas.

6. O que é SHA-256 e por que ele garante confiabilidade?

  • SHA-256: uma função criptográfica de 256 bits que pega um texto de qualquer tamanho e produz um valor fixo de 64 caracteres hexadecimais.
  • Propriedades:
    • “Avalanche” – mudar um bit na entrada muda todo o resultado.
    • “Resistência a colisões” – achar duas entradas distintas que gerem o mesmo hash é virtualmente impossível.
    • “Irreversibilidade” – sabendo apenas o hash, não se consegue descobrir a mensagem original.

Assim, se anunciamos o hash da Server Seed antecipadamente, depois não podemos trocar a semente sem que todo o hash se altere, denunciando a fraude.

7. O que é UUID4 e por que usamos prefixos?

  • UUID4 (“Universally Unique Identifier” versão 4) é basicamente um identificador de 128 bits gerado aleatoriamente. É muito difícil dois UUID4 serem iguais, tornando a seed única.
  • Prefixos (como “pub-”, “auto-” ou “final-”) servem para indicar o contexto daquela seed. Exemplo: “pub-20230415-…” deixa claro que é a semente oficial gerada em 15/04/2023. Esses prefixos não afetam a entropia em si; apenas organizam e distinguem as seeds.

8. Benefícios da Abordagem Provably Fair na NeshaStore

  1. Impossibilidade de mudança de última hora: Já que a hash da Server Seed foi divulgada, não podemos trocá-la depois de conhecer a Client Seed.
  2. Transparência total: Você pode replicar todo o processo (desde o Final Hash até a extração de números pseudoaleatórios) com a mesma lógica e chegar aos mesmos ganhadores.
  3. Verificabilidade: A soma textual “ServerSeed + ClientSeed” e o uso de SHA-256 são passos matemáticos bem definidos, sem espaço para manipular o resultado quando as seeds já estão fixadas.
  4. Confiança: Mesmo quem não domina criptografia pode usar a verificação manual, ver a “mágica” do hash bater exatamente com o que anunciamos, e confirmar que não houve trapaça.

9. Resumo Final

  • Nós, da NeshaStore, geramos uma Server Seed (ex.: "pub-...-UUID4") e publicamos seu hash (SHA-256) para provar que não mudaremos esse valor depois.
  • Chega o momento do sorteio, combinamos essa semente com a Client Seed (ex.: "auto-...-UUID4").
  • Aplicamos SHA-256 na concatenação das duas strings, obtendo o Final Hash.
  • Dividimos o Final Hash em blocos de 8 caracteres para sortear os ganhadores (convertendo em decimal, normalizando 0..1, multiplicando pela quantidade de participantes, etc.).
  • Após o sorteio, revelamos a Server Seed real (para que todos confirmem se o hash confere) e a Client Seed, possibilitando que qualquer pessoa reproduza integralmente o resultado.
  • Para simplificar a checagem do hash, oferecemos os campos acima onde você insere as duas seeds e vê o Final Hash calculado na hora.

Essa estrutura mantém a integridade do processo, assegurando que nenhuma das partes possa unilateralmente forjar resultados. Com isso, garantimos a você uma experiência de sorteio justo, auditável e em conformidade com as melhores práticas de segurança e transparência.