SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
06.12.2024

Lição: 240: Construindo um Contrato de Loteria

Nesta aula, vamos criar um contrato de loteria simples usando Solidity. O contrato de loteria permitirá que os participantes entrem na loteria enviando Ether e, ao final do período da loteria, ele selecionará aleatoriamente um vencedor e transferirá o montante total arrecadado para esse vencedor.

Pré-requisitos

Antes de começarmos a programar, certifique-se de ter um entendimento básico de Solidity, Ethereum e como implantar contratos inteligentes usando ferramentas como Remix ou Truffle.

Configurando Seu Contrato

Vamos começar definindo nosso contrato de loteria. Vamos incluir funcionalidades básicas, como entrar na loteria, escolher um vencedor e verificar o estado atual da loteria (participantes e saldo).

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Lottery {
    address public gerente;
    address[] public jogadores;

    constructor() {
        gerente = msg.sender; // A conta que implanta o contrato é o gerente
    }

    function entrar() public payable {
        // Taxa mínima de entrada
        require(msg.value > .01 ether, "Entrada mínima é 0.01 Ether");

        // Adiciona o endereço do jogador ao array de jogadores
        jogadores.push(msg.sender);
    }

    function aleatorio() private view returns (uint) {
        // Gera número aleatório usando propriedades do bloco (apenas para fins de demonstração)
        return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, jogadores)));
    }

    function escolherVencedor() public restrito {
        require(jogadores.length > 0, "Não há jogadores na loteria");

        uint indice = aleatorio() % jogadores.length;
        address vencedor = jogadores[indice];

        // Transfere o saldo para o vencedor
        payable(vencedor).transfer(address(this).balance);

        // Redefine o array de jogadores para a próxima loteria
        jogadores = new address[](0);
    }

    modifier restrito() {
        require(msg.sender == gerente, "Apenas o gerente pode chamar esta função");
        _;
    }

    function getJogadores() public view returns (address[] memory) {
        return jogadores;
    }

    function getSaldo() public view returns (uint) {
        return address(this).balance;
    }
}

Análise do Código

  1. Variáveis de Estado:

    • gerente: O endereço do proprietário do contrato (quem o implantou).
    • jogadores: Um array para armazenar os endereços dos participantes da loteria.
  2. Construtor:

    • O construtor define a variável gerente como o endereço que implantou o contrato.
  3. Função Entrar:

    • Essa função permite que os usuários entrem na loteria enviando um mínimo de 0.01 Ether. O endereço do jogador é adicionado ao array de jogadores.
  4. Função Aleatória:

    • Uma função privada que gera um número pseudo-aleatório baseado na dificuldade do bloco atual, no timestamp e nos endereços dos jogadores. Observe que esse método não é seguro e não deve ser usado em ambientes de produção.
  5. Função Escolher Vencedor:

    • Apenas o gerente pode chamar essa função. Ela verifica se existem participantes, gera um índice aleatório, seleciona o vencedor e transfere todo o saldo do contrato para o vencedor. O array jogadores é então redefinido para uma nova loteria.
  6. Modificadores:

    • O modificador restrito verifica se o chamador é o gerente do contrato.
  7. Getters:

    • getJogadores: Retorna o array de jogadores.
    • getSaldo: Retorna o saldo atual do contrato.

Implantando e Testando o Contrato

  1. Abra o Remix IDE.
  2. Crie um novo arquivo chamado Lottery.sol e cole o código acima.
  3. Compile o contrato.
  4. Implemente o contrato usando uma conta Ethereum.
  5. Chame a função entrar com pelo menos 0.01 Ether para adicionar jogadores.
  6. Uma vez que você tenha vários jogadores, chame a função escolherVencedor para selecionar um vencedor.

Observações Importantes

  • A geração de números aleatórios utilizada aqui não é segura e deve ser usada apenas para fins de aprendizado ou demonstração. Para contratos prontos para produção, considere usar Chainlink VRF ou outros métodos para obter aleatoriedade de forma segura.
  • Sempre teste seus contratos inteligentes cuidadosamente antes de implantá-los na rede Ethereum principal.

Conclusão

Nesta aula, construímos um contrato inteligente de loteria simples que permite que os usuários entrem na loteria e selecionem aleatoriamente um vencedor. Este exemplo demonstra conceitos essenciais do Solidity, incluindo variáveis de estado, funções, modificadores e transações com Ether. Modifique e expanda este contrato para atender às suas necessidades ou explore mecanismos de loteria mais complexos. Boa programação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!