---
type: tutorial
title: Torne um jogo personalizado capaz de proteger
summary: Envie um artefato de replay headless para o seu jogo auto-hospedado para que o servidor possa rederivar o veredito, o passo que deixa um jogo personalizado satisfazer um portão de jogo.
---

Um [jogo auto-hospedado](/docs/custom-game-development/self-hosted-game) roda e verifica assim que você aponta o `game-src` para ele. Mas para usá-lo como um [portão de jogo](/docs/site-keys/games), onde um visitante precisa resolvê-lo para passar, a Caputchin tem de conseguir rederivar o resultado ela mesma, não confiar no navegador. É para isso que serve o **artefato de replay**. Ao final deste tutorial seu jogo personalizado será elegível para proteger.

Esta é a recompensa do determinismo: como seu jogo registra um [trace](/docs/custom-game-development/self-hosted-game) e deriva tudo da semente, o servidor pode rodar uma cópia headless da sua lógica contra a mesma semente e o mesmo trace e chegar ao mesmo veredito de forma independente.

## O que é o artefato de replay

O artefato é um bundle JavaScript pequeno e autossuficiente só da sua **lógica de jogo**, sem renderização, sem DOM, e sem rede. O servidor o carrega em uma sandbox isolada e o roda para produzir um veredito a partir de `(seed, trace)`. Ele não é o seu jogo jogável; é o juiz headless do seu jogo jogável.

Duas propriedades são exigidas:

- **Autossuficiente.** Ele não pode importar nada que o isolate não consiga resolver; empacote tudo. O upload tem teto de 2 MB, que está bem acima de um bundle de lógica típico.
- **Determinístico e em concordância com o jogo ativo.** Dada a mesma semente e o trace que seu jogo ativo emitiu, ele precisa chegar ao mesmo veredito que o jogo ativo alegou. Se eles discordam, jogadores reais recebem rejeições falsas.

## 1. Registre o jogo personalizado

Se você ainda não fez, registre o jogo no painel para que ele tenha um id e um lugar para guardar o artefato. Na página **Jogos** de uma chave de site (ou da equipe), use a entrada **Jogo personalizado** no painel **Adicionar um jogo**: insira seu id e clique em **Definir**. Veja [jogos personalizados](/docs/game-customization/custom-games) para este passo e [o esquema que você define](/docs/custom-game-development/dashboard-schema).

## 2. Envie o artefato

Na aba **Configurações** do jogo registrado, envie o bundle de replay. Ele é enviado como um único arquivo; a Caputchin gera um hash de conteúdo dele (reenviar os mesmos bytes é um no-op) e imediatamente roda uma **autoverificação**.

## 3. A autoverificação

A autoverificação roda seu artefato enviado no isolate de replay contra uma semente sintética (e sua amostra de trace comprometida, se você fornecer uma) e registra se ele produziu um veredito limpo:

- **Passa** → a instalação fica elegível para proteger. O selo **Não reproduzível** some, e você pode agora ligar [exigir um jogo](/docs/site-keys/games) com este jogo no pool.
- **Falha** → o artefato ainda fica armazenado (para que você possa inspecionar o erro), mas a instalação continua não elegível para proteger. Corrija a lógica e reenvie.

Uma autoverificação falha é o sistema te dizendo que o juiz headless não concorda consigo mesmo ou não conseguiu rodar; é exatamente a discordância que teria causado rejeições falsas em produção, pega antes de qualquer visitante esbarrar nela.

## 4. Ligue o portão

Uma vez que a autoverificação passa, o jogo está no [pool de portão](/docs/site-keys/games) da chave. Ligue **Exigir um jogo** na página Segurança da chave (ou o teto de forçar jogo da equipe), e a Caputchin vai servir seu jogo personalizado, pegar o trace do jogador, e reexecutar seu artefato no servidor para decidir cada verificação.

## Mantendo os dois em sincronia

O jogo ativo (carregado via `game-src`) e o artefato de replay são duas builds da mesma lógica. Quando você muda qualquer coisa que afeta o resultado, reconstrua e reenvie o artefato para que os dois ainda concordem. Se eles divergirem, a autoverificação ou o replay de produção vai começar a rejeitar vitórias reais. Construir os dois a partir de um módulo de lógica compartilhado é a forma confiável de mantê-los idênticos.

## Veja também

- [Construa um jogo auto-hospedado](/docs/custom-game-development/self-hosted-game): produzir o trace que este artefato reexecuta.
- [Jogos e o portão de jogo](/docs/site-keys/games): ligar o portão e o requisito de reprodutibilidade.
- [Jogos personalizados](/docs/game-customization/custom-games): registrar e o selo Não-reproduzível.
- [Referência de esquema do painel](/docs/custom-game-development/dashboard-schema): os campos que o jogo lê do contexto da sua fábrica.
