Para entrar mais a fundo no tema de Smart Contracts e desenvolvimento de jogos, iniciei um projeto que vai contar com uma série de vídeos, explicando na pratica a criação de um jogo simples de Snake, singleplayer e multiplayer, com um marketplace para NFTs e ganho de token ERC20 SnakeCoin a cada partida, nos molde do bom e velho Axie Infinity.

Github Server: https://github.com/andrehrferreira/cryptosnake-server

Github Game: https://github.com/andrehrferreira/cryptosnake-game

Github Contracts: https://github.com/andrehrferreira/cryptosnake-contracts

Servidor

Por se tratar de um projeto com multiplayer e emissão de token ERC20, será necessário um servidor, que será responsável por criar as partidas, emitir e transferir os tokens, consumir energia e, ainda, armazenar logs das partidas.

A autenticação do jogador vai ser feita pela Metamask, usando como assinatura uma mensagem enviada pelo servidor e validada. Para simplificar a integração, o banco de dado será um Sqlite local, utilizando sistema ORM Sequelize, a comunicação será feira por meio de Websocket. Como não queremos lag na movimentação, vou utilizar Protobuf para comunicação binária e, na parte de Web3, vamos utilizar a biblioteca mais famosa do JavaScript, desenvolvida pela ChainSafe.

Ainda para facilitar a criação dos Smart Contracts e testes locais, vamos utilizar o Ganache.

Game

O jogo será feito em HTML, CSS e JavaScript, utilizando a tag Canvas, para leitura das mensagens Protobuf, vamos utilizar a versão de browser do Protobufjs, a biblioteca de Web3 é a mesma do servidor. Ainda, para atualizar dados em tempo real e bind de eventos, será utilizado RxJS. Como base do jogo, vou usar os códigos de um projeto Open Source, o Snake Game HTML5, esse projeto é bem simples e atende parcialmente à necessidade do projeto, porém requer adaptação para a movimentação ser controlada pelo servidor.

A ideia é bem simples, quanto maior os segmentos na Snake, mais tokens o usuário recebe.

Contratos

O Token do projeto será feito no padrão ERC20, usando HardHat e OpenZeppelin. Para gerar automaticamente o ABI dos contratos vou usar um modulo do NPM chamado Hardhat ABI Generator, sem o ABI não é possível acessar os contratos por meio de JavaScript.

Para NFT vou utilizar o padrão ERC721A em uma configuração simples, armazenando um número de “série” que irá gerar automaticamente a imagem da Snake por meio da biblioteca de imagens do JavaScript, esses NFTs vão ser liberados em formato de rewards.

Marketplace

O marketplace será implementado usando SPA Vue 3, 100% integrado diretamente na Blockchain, sem intermediação de banco de dados, incorporando, inclusive, a Metamask para transferência de Token e transferência, compra e venda de NFTs.

Nota

Obviamente, por se tratar de um projeto estudo, algumas questões de segurança, como custódia de carteira, serão desprezadas e adicionadas diretamente no código fonte ou por meio de arquivo .env. Não recomendo utilizar o projeto em produção, utilize apenas para consolidar os conceitos.
(Continua.)