Dependencia con timestamp
Clase 4 de 15 • Curso de Introducción a Seguridad de Smart Contracts
Contenido del curso
Clase 4 de 15 • Curso de Introducción a Seguridad de Smart Contracts
Contenido del curso
José Manuel Piña Rodríguez
Cristian Marchese
Diego Fernando Gómez Peña
Jader Moncayo
Erick Bonilla
Kevin Fiorentino
Erick Bonilla
Martín Alexis Samán Arata
Sebastian Perez
Alfonso Jiménez Gandulias
Sebastian Perez
Una solucion segura para ese problema de generar numeros aleatorios es haciendo uso de Oracles, recordemos que la blockchain de Ethereum es deterministica.
No es tan seguro tampoco. Al poner un oraculo tenés un punto centralizado para hackear y manipular que alguien podría explotar. Una forma que si se suele utilizar para generar un probably fair game es, una vez después de cerrado el juego (por ejemplo ante una determianda cantidad de usuarios), dejar pasar un par de bloques (10 bloques por ejemplo) y luego tomar el hash de ese bloque para calcular de una forma determinista el numero ganador. De esta forma las reglas estan impuestas de antemano para que cualquiera pueda comprobar de que no se manipuló pero nadie puede predecir cual va a ser el hash de ese bloque futuro para manipularlo.
Muchas veces se utiliza el timestamp del bloque actual como entrada de una operacion critica como determinar el ganador de un sorteo. No es lo correcto. Para generar valores aleatorios NO debemos usar
DEPENDENCIAS CON TIMESTAMP
Flujos críticos con timestamp: se lo utiliza como valor de entrada de una operación critica como determinar el ganador de un sorteo.
No utilizar el timestamp cuando hacemos un sorteo, una selección de una cuenta por ser vulnerable y el número de bloques que es predecible.
🚫Evitar
Profe Sebastian y la alternativa al block.timeStamp ?
Como alternativa a block.timeStamp para generar números aleatorios que sean seguros, tienes que utilizar mecanismo externos a Blockchain. Se lo conoce como procesamiento off-chain, ya que son piezas de código que se ejecutan fuera de la blockchain e insertan datos en el contrato pagando alguna comisión. Estos servicios son conocidos como Oráculos y un ejemplo sería Chainlink.
Saludos
@KevinFiorentino gracias Bruh!
Y cómo se pueden predecir los bloques?
El numero de bloque es secuencial, entonces el proximo será el actual +1. Con eso puedes predecirlo.
El timestamp es puesto por el minero, más que predecirlo la situación es que el minero puede usar a conveniencia un timestamp que le favorezca (siempre y cuando la lógica del contrato se base en el timestamp por eso es que hay que evitarlo)
Una consulta, cual sería la alternativa a block.number si lo que busco es almacenar periodos de tiempo en mi contrato?
Hola Alfonso, lo que buscas es block.timestamp que es la fecha en segundos en que se escribió el bloque donde se ejecutó la transacción. Recuerda que al ser en segundos el valor lo guardarás como un uint ya que no hay un tipo de dato fecha nativo para Solidity