Inspiration

La inspiración para este proyecto proviene de la necesidad de generar entropía confiable en redes blockchain, algo esencial para aplicaciones que dependen de números aleatorios. Debido a que no encontramos ninguna herramienta de generación de números aleatorios descentralizada, gratuita o de muy bajo costo y que funcionara como un Public Good, nos propusimos la tarea de realizar una nosotros. Esto con el objetivo de brindar una herramienta de uso público descentralizada, adversarial y altruista hasta ahora inexistente en la Blockchain que permita complementar los esquemas tradicionales de generación de números pseudo aleatorios en contratos inteligentes.

What it does

Good Numbers permite a los usuarios participar en un juego basado en un número de lotería (presentado como un hash hexadecimal) almacenado en la blockchain, con el objetivo de generar entropía descentralizada y, como resultado, los hashes de estas interacciones sean de libre acceso al ecosistema a través de nuestro contrato.

Para jugar los participantes envían pequeñas cantidades Ether al contrato (típicamente el wei equivalente a centavos de dólares), lo que modifica el número de la lotería y aumenta el fondo acumulado del juego. Si un jugador consigue que los últimos caracteres del número de lotería coincidan con su dirección de billetera, puede reclamar la mitad de los fondos acumulados. De esta manera, los jugadores adversariales pueden competir por llevarse los fondos cuando les sea económicamente viable.

El contrato también destina un porcentaje de los depósitos a un fondo para financiar proyectos que generen impacto social. Incentivando así la participación de actores altruistas que interactúen con el proyecto generando hashes motivados por el desarrollo del ecosistema y no por la posible recompensa económica. Permitiendo un balance entre la adversarialidad y el altruismo, siendo nuestra inspiración la forma en que funcionan los incentivos Blockchain como Proof of work y Proof of stake.

How we built it

Construimos el contrato utilizando Solidity en la versión ^0.8.28, y empleamos Hardhat como entorno de desarrollo. El contrato incluye las siguientes funciones:

checkNumber Descripción: Esta función permite consultar el número actual de la lotería almacenado en la blockchain. Es útil para los jugadores y otros contratos que deseen usar este número como parte de cálculos o procesos dependientes de entropía. Uso: Simplemente devuelve el número actual sin requerir Ether ni permisos especiales.

getNewNumber

Descripción: Modifica el número de lotería almacenado en el contrato, generando un nuevo número basado en el número actual, la dirección del remitente y la cantidad de Ether enviada. Este proceso incrementa la entropía del sistema. Requisito: El jugador debe enviar una cantidad mínima de Ether especificada en el contrato para ejecutar esta función. Objetivo: Fomenta la participación activa de los jugadores y la generación de números aleatorios resistentes a manipulaciones.

claimLottery Descripción: Permite a un jugador reclamar los fondos acumulados en el contrato si los últimos caracteres de su dirección de billetera coinciden con los últimos caracteres del número de lotería actual. Requisito: El jugador debe cumplir con la condición de coincidencia para poder retirar los fondos. Objetivo: Incentivar estrategias adversariales y premiar a los jugadores exitosos.

claimDevelopmentAndDonation Descripción: Permite al propietario del contrato retirar un porcentaje de los fondos acumulados destinado al desarrollo y donaciones sociales. Solo puede ser ejecutada por la dirección designada como propietaria del contrato (por ejemplo, una multisig). Requisito: Accesible únicamente para el administrador del contrato. Objetivo: Asegurar que parte de los fondos se destinen al mantenimiento del contrato y al impacto social.

setMatchLength Descripción: Ajusta la longitud del hash que debe coincidir entre el número de lotería y la dirección de un jugador para reclamar un premio. Este parámetro controla la dificultad del juego. Requisito: Solo puede ser ejecutada por el propietario del contrato. Objetivo: Adaptar la dificultad del juego según el comportamiento de los jugadores y las necesidades del sistema.

getContractState Descripción: Proporciona un resumen completo del estado actual del contrato, incluyendo: El propietario del contrato. El número de lotería actual. Los fondos acumulados para premios y donaciones. El depósito mínimo requerido para participar. La longitud actual de la coincidencia (matchLength). Uso: Ayuda a los jugadores y administradores a comprender el estado del sistema de forma centralizada.

Eventos definidos: NewNumberGenerated: Se emite cada vez que se genera un nuevo número de lotería, registrando el jugador que inició el cambio y la cantidad de Ether utilizada. LotteryClaimed: Se emite cuando un jugador reclama con éxito los fondos del juego. DevAndDonationClaimed: Se emite cuando los fondos para desarrollo y donaciones son retirados por el propietario.

MatchLengthUpdated: Se emite cuando se actualiza la dificultad del juego.

También hemos incluido medidas básicas contra reentrancy y restricciones de acceso para proteger el sistema. Además, utilizamos eventos para registrar acciones clave, como la generación de un nuevo número y la reclamación de premios.

Challenges we ran into

Diseño del sistema: Diseñar un sistema de estas características nos requirió muchas horas de diseño y debate en el equipo. Así como entender como podían interactuar los distintos actores, donde cada uno tiene intereses propios.

Generación de Entropía de Forma Confiable: Un desafío clave fue asegurar que la entropía generada fuera segura y resistente a manipulaciones. Para eso, decidimos usar un enfoque adversarial en el que los jugadores compiten por modificar el número de la lotería, pero manteniendo un control sobre la dificultad de la coincidencia mediante el parámetro matchLength.

Seguridad del Contrato: La implementación de medidas como el bloqueo de reentrancy en funciones críticas (getNewNumber y claimLottery) y la validación de entradas fue crucial para evitar vulnerabilidades, lo que requirió pruebas exhaustivas.

Gestión de Fondos: Asegurarnos de que los fondos estuvieran distribuidos correctamente entre el juego, el desarrollo y las donaciones sociales fue una parte desafiante de la discusión y donde creamos que es necesario ajustar el proyecto de cara a un lanzamiento oficial.

Accomplishments that we're proud of

Generación Descentralizada de Entropía: Logramos un sistema donde la entropía no depende de un solo punto de fallo, utilizando las interacciones de los jugadores para producir un número de lotería aleatorio.

Modelo Económico Sostenible: Implementamos una estructura económica que no solo incentiva la participación, sino que también apoya proyectos de desarrollo y causas sociales dentro del ecosistema blockchain.

Seguridad y Robustez: Gracias a los controles de seguridad (como los modificadores noReentrancy y las validaciones de parámetros) y a las pruebas rigurosas, el contrato se mantiene seguro y confiable.

What we learned

Generación de Números Aleatorios en Blockchain: Aprendimos de criptografía y cómo crear entropía de manera efectiva dentro de un contrato inteligente, utilizando interacciones adversariales y parámetros ajustables.

Desarrollo Seguro en Solidity: A lo largo del desarrollo, adquirimos experiencia en la implementación de medidas de seguridad como bloqueo de reentrancy y validaciones de parámetros para proteger el contrato de vulnerabilidades.

Estrategias de Incentivos en Blockchain: Aprendimos a estructurar incentivos económicos en un contrato blockchain, equilibrando recompensas para los jugadores con el financiamiento de bienes públicos.

What's next for Good Numbers

Obtener financiamiento para auditoría y desarrollo adicional: Si bien los alcances acotados del proyecto nos permitirían deployar el proyecto como MVP casi en su estado actual. Consideramos necesario poder auditar el código del contrato y realizar un mejor desarrollo de UX para garantizar la seguridad y garantizar el lanzamiento de un producto atractivo.

Escalabilidad a Otras Redes: Nuestro proyecto es fácilmente exportable a otras redes compatibles con EVM, por lo que consideramos expandir el proyecto para brindar los beneficios de este proyecto a usuarios de otras redes.

Interfaz de Usuario: Desarrollaremos una interfaz amigable que permita a los usuarios interactuar con el contrato de manera más sencilla, posiblemente integrando una conexión con MetaMask.

Ajustes en la Generación de Entropía: Investigaremos nuevas formas de mejorar la resistencia de la entropía generada, utilizando combinaciones de fuentes de información para hacerla aún más confiable.

Expansión del Impacto Social: Buscaremos nuevas maneras de colaborar con proyectos sociales y organizaciones dentro del ecosistema blockchain, para que una mayor parte de los fondos recaudados beneficie a la comunidad.

Share this project:

Updates