Modelo de Loteria na Blockchain do Ethereum

Por Vinicius Paiva|
Atualizado: Mai 2020 |
Publicado: Dez 2017

Uma simples PoC para ilustrar o poder do conceito Blockchain. Você provavelmente já ouviu falar no termo Blockchain ou, se nunca ouviu, vale a pena pesquisar. Esse conceito relativamente recente está ganhando cada vez mais notoriedade e promete revolucionar as relações de acordos entre partes de maneira irreversível.

Pois bem, então o que é blockchain?

Blockchain é o conceito por trás de tecnologias como a moeda virtual Bitcoin e também o Ethereum. Basicamente, se refere a uma cadeia que registra todas as atividades que acontecem na rede. Essa cadeia é composta por blocos que, por sua vez, são compostos por transações. Cada uma dessas transações é uma atividade realizada por algum nó da rede.

Por exemplo, suponhamos que um dos nós da rede (conta Ethereum) dispara uma transação para transferir Ethers (moeda virtual da Rede Ethereum) para outro nó. Essa transação será validada pelos outros nós da rede e, caso não haja nenhuma irregularidade, a transação irá compor um bloco que será adicionado à cadeia.

A confiabilidade e segurança deste conceito estão relacionadas à criptografia e à descentralização da rede, uma vez que a informação é validada por todos os nós e não por um intermediador centralizado.

Quer ver mais conteúdos como esse?

Smart Contracts na Rede Ethereum

Os Smart Contracts são a grande diferença entre as tecnologias do Bitcoin e do Ethereum. Enquanto no Bitcoin tudo gira em torno da moeda virtual e das operações realizadas com ela, no Ethereum o principal produto são os Smart Contracts.

Basicamente, Smart Contracts são códigos que executam algum algoritmo e tem um custo para serem criados e, também, para serem executados. Por se tratar de um código, os Smart Contracts abrem infinitas possibilidades de aplicações. No nosso caso, por exemplo, foi criado um contrato que, quando executado, funciona como uma loteria. Qualquer nó da rede Ethereum, desde que tenha o endereço do contrato, pode apostar na loteria. Depois que as apostas forem feitas, o criador do contrato chama uma função que automaticamente encontra os ganhadores e transfere para eles o valor do prêmio igualmente dividido.

Como funciona a loteria na blockchain do Ethereum?

A loteria implementada oferece:

● Transparência: O código do contrato é aberto permitindo ao usuário avaliar como o jogo é executado caso seja de seu interesse.

● Confiabilidade: O resultado é validado por todos os nós da rede.

● Menores custos: Elimina os gastos que vão para o intermediador ou, no mínimo, diminui significativamente. Além disso, suas características principais com relação à implementação são:

● O Smart Contract foi desenvolvido na linguagem Solidity.

● Recebe uma ou mais apostas de um ou mais jogadores (conta Ethereum).

● A aposta é um número inteiro qualquer escolhido pelo apostador.

● A conta criadora do contrato especifica o range do número a ser sorteado entre 1 e x, e também o preço a ser pago em Ethers para se fazer uma aposta.

● O apostador deve pagar o preço da aposta para cada número escolhido, caso contrário, sua aposta não é computada.

● O prêmio é a soma do valor arrecadado com todas as apostas e é dividido entre os ganhadores.

● Após realizar o pagamento ao último vencedor, o contrato é destruído (comando selfdestruct).

Abaixo, segue o código implementado em Solidity do contrato lottery:

pragma solidity ^0.4.0;

contract lottery {

 //Struct representando cada apostador com seu endereço (conta Ethereum) e número de aposta.

    struct Gambler {

        address gamblerAddress;

        uint gamblerLuckyNum;

    }

 //Variáveis globais do contrato. 

    uint public numPossibilities;

    uint public priceGamble;

    uint public numGamblers;

    uint public numWinners;

    uint public luckyNum;

    uint public prize;

    address public chairperson;

    mapping(uint => Gambler) public gamblers;

 //Construtor do contrato Lottery.

//Recebe preço por aposta (priceG) em Ethers e maior número do range de possibilidades sendo o range de 1 a numP.

    function lottery(uint priceG, uint numP) {

        numPossibilities = numP;

        priceGamble = priceG * 1000000000000000000;

        numGamblers = 0;

        numWinners = 0;

        prize = 0;

        chairperson = msg.sender;

    }

  //Função chamada por cada apostador onde é passado como parâmetro o número apostado.

//Só executa caso o valor transferido para o contrato seja igual ao valor estipulado no construtor.

    function gamble(uint chosenNum) payable{

        if(msg.value != priceGamble){

            throw;   

        }else{

            Gambler gb = gamblers[numGamblers];

            gb.gamblerAddress = msg.sender;

            gb.gamblerLuckyNum = chosenNum;

            numGamblers++;

        }

    }

 

//Função chamada para encontrar e pagar ganhadores.

//Só pode ser chamada pelo criador do contrato, caso contrário gera exceção.

//Gera número randômico com base no hash do bloco anterior.

//Calcula número de ganhadores.

//Divide prêmio igualmente entre ganhadores e destrói o contrato após pagar último ganhador.

 

    function winner () {

        if(msg.sender != chairperson){

            throw;

        }else{

            luckyNum = uint(block.blockhash(block.number-1))%numPossibilities + 1;

            for (uint i = 0; i < numGamblers ; i++){

                if (gamblers[i].gamblerLuckyNum == luckyNum) {

                    numWinners++;

                }

            }

            if(numWinners == 0){

                selfdestruct(chairperson);

            }else{

                uint numWinnersAux = numWinners;

                prize = this.balance/numWinnersAux;

                for (uint j = 0; j < numGamblers ; j++){

                    if (gamblers[j].gamblerLuckyNum == luckyNum) {

                        numWinnersAux–;

                        if(numWinnersAux == 0){

                            selfdestruct(gamblers[j].gamblerAddress);

                        } else {

                            gamblers[j].gamblerAddress.transfer(prize);

                        }

                    }

                }

            }

        }

    }

}

 

E o futuro?

Como se pode notar, as possibilidades através do conceito blockchain são incríveis, principalmente quando associado ao uso de Smart Contracts como acontece na rede Ethereum. Esse modelo bastante simples de loteria é só um aperitivo da ampla gama de inovações que podem e, certamente, irão surgir num futuro bem próximo.

Quer saber como a blockchain pode impactar seu negócio? Entre em contato com a dti!

Quer saber mais?