Sistema Provably Fair - CSGOFlip
Range Oficial
O range do sistema Provably Fair é de 1 a 10.000.000 (dez milhões).
typescript
const HASH_MIN = 1;
const HASH_MAX = 10000000;Como Funciona
1. Geração do Roll
O roll é calculado usando HMAC-SHA256:
typescript
function calculateRoll(serverSeed: string, clientSeed: string, nonce: number): number {
const combined = `${serverSeed}:${clientSeed}:${nonce}`;
const hash = crypto.createHmac('sha256', serverSeed).update(combined).digest('hex');
return (parseInt(hash.substring(0, 8), 16) % 10000000) + 1;
}Componentes:
serverSeed: Gerado pelo servidor (hash SHA256 revelado antes, seed revelado depois)clientSeed: Fornecido pelo jogador (ou gerado automaticamente)nonce: Contador incremental por sessão
Aplicações
Abertura de Caixas
Cada item da caixa tem um range de hash:
Item | Range Start | Range End | Chance
------------------------|-------------|------------|--------
AK-47 | Redline | 1 | 3.500.000 | 35%
M4A4 | Asiimov | 3.500.001 | 6.000.000 | 25%
AWP | Dragon Lore | 9.999.900 | 10.000.000 | 0.001%O item é selecionado quando: roll >= hashRangeStart && roll <= hashRangeEnd
Upgrades
O sucesso do upgrade é calculado com base na chance:
typescript
// Exemplo: 20% de chance
const successThreshold = 10000000 - (20 / 100) * 10000000; // = 8.000.000
const success = roll >= successThreshold; // Roll >= 8.000.000 = sucesso| Chance | Threshold | Range de Sucesso |
|---|---|---|
| 5% | 9.500.000 | 9.500.000 - 10.000.000 |
| 10% | 9.000.000 | 9.000.000 - 10.000.000 |
| 20% | 8.000.000 | 8.000.000 - 10.000.000 |
| 50% | 5.000.000 | 5.000.000 - 10.000.000 |
| 80% | 2.000.000 | 2.000.000 - 10.000.000 |
Sistema FLIP
O FLIP ativa quando o roll cai na faixa de itens raros:
typescript
const flipThreshold = Math.min(...rareItems.map(item => item.hashRangeStart));
const isFlip = roll >= flipThreshold;Verificação
Os jogadores podem verificar qualquer resultado:
- Antes do jogo: Server Seed Hash é revelado
- Durante o jogo: Client Seed é definido pelo jogador
- Após o jogo: Server Seed original é revelado
Como Verificar
javascript
const crypto = require('crypto');
// Dados fornecidos após o jogo
const serverSeed = 'abc123...';
const clientSeed = 'xyz789...';
const nonce = 42;
// Verificar hash do server seed
const serverSeedHash = crypto.createHash('sha256').update(serverSeed).digest('hex');
console.log('Server Seed Hash:', serverSeedHash); // Deve bater com o hash revelado antes
// Calcular roll
const combined = `${serverSeed}:${clientSeed}:${nonce}`;
const hash = crypto.createHmac('sha256', serverSeed).update(combined).digest('hex');
const roll = (parseInt(hash.substring(0, 8), 16) % 10000000) + 1;
console.log('Roll:', roll); // Deve bater com o roll do jogoArquivos do Sistema
| Arquivo | Responsabilidade |
|---|---|
provably-fair.service.ts | Cálculo de roll e geração de seeds |
perform-upgrade.use-case.ts | Lógica de sucesso do upgrade |
verify-upgrade.use-case.ts | Verificação de upgrades |
open-case.use-case.ts | Abertura de caixas |
execute-battle.use-case.ts | Batalhas |
flip.service.ts | Sistema FLIP |
add-case-item.use-case.ts | Recálculo de ranges |
remove-case-item.use-case.ts | Recálculo de ranges |
probability.service.ts | Atribuição de ranges |
Regras de Implementação
SEMPRE
- Use
HASH_MAX = 10000000em todos os cálculos - Use
roll >= start && roll <= endpara seleção de items - Use
roll >= successThresholdpara upgrades - Arredonde para baixo (
Math.floor) ao calcular ranges
NUNCA
- Use ranges diferentes de 1-10.000.000
- Use
<ao invés de<=na comparação de ranges - Use valores hardcoded diferentes de 10.000.000
Histórico de Correções
2024-12-09: Padronização do Range
Problema: Alguns arquivos usavam 100000 ao invés de 10000000.
Arquivos corrigidos:
calculate-result.use-case.ts: 100000 → 10000000verify-upgrade.use-case.ts: 100000 → 10000000probability.service.ts: HASH_MAX 100000 → 10000000add-case-item.use-case.ts: Adicionada normalização para 10000000remove-case-item.use-case.ts: Adicionada normalização para 10000000
