engineeringfairnessmultiplayer
Autoridade do servidor significa que o servidor guarda a única cópia da partida que conta. O seu dispositivo envia a jogada que quer fazer, o servidor testa-a contra os seus próprios dados e as suas próprias regras, e só então o tabuleiro muda. Uma app modificada pode afirmar o que quiser: a verdade vive num sítio onde ela não chega.
O gamão merece esse rigor. É um jogo de dados com uma escada e um pote, o que significa que há duas maneiras de fazer batota: falsificar as jogadas ou torcer os lançamentos. Um servidor justo tem de fechar as duas portas. A segunda porta inclui-nos, e lá chegaremos.
O que significa autoridade do servidor, afinal?
Cada partida do Orion em curso existe num só sítio: no nosso servidor. O tabuleiro no seu telemóvel é uma janela, não a partida. Quando arrasta uma pedra, a app não a move. Envia uma mensagem curta que diz: é isto que quero jogar. O servidor reproduz essa intenção no seu próprio tabuleiro, com o seu próprio motor de regras, com os dados que tirou para esse turno. As jogadas legais fazem a partida avançar, e os dois jogadores recebem a mesma posição nova. As jogadas ilegais nunca aconteceram.
É um só servidor para todos. A app de iOS é SwiftUI nativa, a de Android é Jetpack Compose nativa, e ambas são janelas para o mesmo backend e para o mesmo conjunto de jogadores. Vidro diferente, mesma verdade.
Porque é que os jogos que confiam no cliente levam batota?
Porque o dispositivo do seu adversário pertence ao seu adversário. Tudo o que lá corre pode ser modificado. Um cliente remendado pode enviar jogadas que nunca foram legais. Um editor de memória pode reescrever um número no momento, e o ecrã mostra a mentira fielmente. Nada disto é exótico. As ferramentas são gratuitas, documentadas e mais antigas do que os telemóveis inteligentes.
Um jogo que confia no cliente pede a cada jogador que prometa não espreitar debaixo do capô. Alguns espreitam. Por isso tornámos a opinião do cliente irrelevante. No Orion, a app tem exatamente três tarefas:
- Desenhar: o tabuleiro, as pedras, o cubo, o relógio.
- Pedir: pedir ao servidor que jogue uma jogada, oferecer o dobro, desistir.
- Receber: mostrar a posição a que o servidor chama real.
Lançar os dados, julgar a legalidade e mover uma única moeda não estão nessa lista. Nada que decida um desfecho nasce num dispositivo.
O que acontece quando faço uma jogada?
Você joga.. A sua app envia a intenção: esta pedra, estes pontos. Nada no seu dispositivo muda o tabuleiro a sério.
O servidor reproduz.. O nosso motor de regras corre a jogada contra o tabuleiro do servidor e os dados do servidor. Se for legal, a partida avança. Se não for, é recusada na origem, venha de que app vier.
Os dois lados recebem a mesma verdade.. A nova posição sai para os dois jogadores. Se a sua ligação cair, o prazo de reconexão do relógio de turno guarda-lhe o lugar, e volta ao tabuleiro tal como ele está de facto, não como o seu telemóvel o recordava pela última vez.
As apostas seguem a mesma regra. Quando começa uma partida com entrada, o servidor guarda as duas entradas em depósito. O pote vive num só livro de registos, no servidor, e é liquidado lá quando a partida acaba. A nenhum cliente é alguma vez perguntado quanto pensa ter ganho. As moedas e as gemas são virtuais, sem valor no mundo real e sem resgate, e ainda assim mantemos esse livro como se guardasse algo precioso, porque guarda: a sua confiança na posição.
O que impede o próprio servidor de fazer batota?
É a pergunta certa, e a maioria dos jogos espera que nunca a faça. Um servidor que lança dados em segredo podia lançar com simpatia para quem favorece, e você nunca veria. Cada lançamento parece plausível. Os dados são assim.
Por isso tirámos esse poder a nós próprios. Antes de a partida começar, o servidor gera uma semente secreta e publica um compromisso SHA-256 sobre ela. Depois cada lançamento é derivado dessa semente com HMAC-SHA256, um a um, por ordem. Quando a partida acaba, o servidor revela a semente. Qualquer pessoa pode verificar que a semente coincide com o compromisso dado antes do primeiro lançamento e que cada lançamento da partida decorre dela. Em sentido criptográfico, os seus dados estavam fixados antes de qualquer dos jogadores tocar numa pedra. Não conseguiríamos torcer o lançamento doze sem quebrar a promessa que publicámos no lançamento zero.
Não precisa de aceitar nada disto pela nossa palavra. A verificação em orion.arthea.ai/verify recalcula a cadeia inteira no seu navegador, com a Web Crypto, na sua máquina, a partir do registo público da partida. Sem conta, sem instalação. A porta em orion.arthea.ai/go leva as ligações para a App Store e para a Google Play e mostra sempre o que está disponível neste momento.