Skip to content

jbokser/rock_paper_scissors

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rock Paper Scissors on Blockchain

Este es mi trabajo practico final del curso de Desarrolladores de Blockchain dictado por Leandro Rawicz (CoinFabrik) en la Universidad de Palermo. Fecha de entrega 2019-07-17.

Se trata de un smart contract que permitiría jugar al clásico juego de Piedra Papel o Tijera. También se incluye un pequeño programa cliente (shell.py) para interactuar con este contrato a través de infura.io.

Descripción funcional del contrato

El contrato permite a dos personas que no necesitan conocerse jugar al clásico "Piedra, papel o tijera"

Un jugador inicia la jugada y queda a la espera de un oponente o en su defecto se transforma en el oponente de otro jugador que estaba en esa espera.

La jugada se realiza con un hash de una concatenación de la movida elegida (piedra, papel o tijera) y una palabra secreta a la que llamaremos nonce que luego se utilizará solo para revelar la jugada.

El nonce que elijamos deberá variar en cada jugada o se tornara fácil de predecir.

Al momento de realizar la jugada se debe pagar la apuesta.

Cuando ambos (el jugador y su oponente) ya realizaron sus jugadas con el hash tienen un periodo máximo para revelar sus jugadas con el nonce con la que la construyeron.

Si alguno de los dos no revela la jugada en el periodo estipulado el otro podrá reclamar haber ganado.

Cuando el último de ambos jugadores que le faltaba revelar su jugada, lo hace, o el jugador que si revelo su jugada reclama que su oponente no lo hizo en el tiempo adecuado, el contrato evaluará quien es el ganador y le trasferirá el premio al mismo. Ademas contabilizará la comisión que se quedará el dueño del contrato.

Si hay un empate se les devuelve las apuestas a ambos jugadores.

Por último, en el momento que el dueño del contrato lo decida, podrá retirar las comisiones acumuladas.

Diagrama de estados de una jugada

Código fuente del smart contract

El código fuente del contrato puede encontrarle en:

Para clonar este repositorio con todos los fuentes del proyecto debe correr el siguiente comando:

$ git clone https://github.com/jbokser/rock_paper_scissors.git

Contrato en la Testnet (Rinkeby)

Address = 0x2306c5A10b2D8e1598CC6357574FD924Ba8B6CBb

Link para verlo en etherscan.io

Funciones mas importantes del contrato

Función para crear una jugada con un hash

function makeAmove(bytes32 _hash) public payable returns (uint _index) {}

Función para exponer jugada creada con la función anterior

function showMyMove(uint _index, string memory _nonce) public {}

Función para reclamar una jugada expirada

function claimAnExpiredMove(uint _index) public {}

Función para obtener el estado de una jugada

enum Result {lose, tie, win, bad, wait, opponent_not_showed, not_showed}
function seeAmove(uint _index) public view returns (Result) {}

Eventos del contrato

Se emite cuando se crea una nueva jugada. es la forma que tiene makeAmove de devolver el indice de la jugada creada.

event MakeAmove(address indexed _addr, uint _index);

Programa cliente para interactuar con este contrato

shell.py es una interface simple de linea de comandos desarrollada en python3 que permite interactuar con el smart contract de este proyecto.

Para mas información de esta herramienta ver el archivo README.md dentro de la carpeta utils/ de este proyecto.

También puede ver un cast de como se usa en asciinema.org

asciicast

Mejoras a considerar en el futuro

  • Medir el tiempo con el numero de bloque y no con el timestamp. Si la blockchain se pone lenta no es culpa de los jugadores y se pueden hacer reclamos a jugadas expiradas que no corresponden.
  • Darle soporte para apuestas no fijas.
  • Mantener un top 10 de ganadores, donde se acumulan 2 puntos por jugada ganada y 1 punto por jugada empatada.
  • Como lo que no se esta evaluando es la lógica del juego, se armo con el clásico Rock, Paper, Scissors pero hubiera quedado mas interesante usar la versión Rock, Paper, Scissors, Lizard, Spock de The Big Bang Theory.

Licencia

Este trabajo está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.

Desarrollado por Juan S. Bokser juan.bokser@gmail.com

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published