Generando números aleatorios en Solidity sin Chainlink

Hola, soy muy consciente de que hay muchos hilos que discuten diferentes métodos. Solo tenía curiosidad y quería preguntar directamente aquí porque siento que la situación podría ser diferente. Esencialmente, estoy tratando de que cada vez que alguien pide fondos del contrato, la cantidad que obtienen varía de 0 a 100, pero obviamente mi método actual es defectuoso dependiendo de ahora.

He estado leyendo ChainLink VRF, pero parece que las tarifas pueden ser un poco molestas. Solo por curiosidad, si hay algún otro método que alguien conozca, de lo contrario, mi otra opción era bloquear el saldo si se acerca a la recompensa de bloque actual y los usuarios tendrán que cobrar más a menudo. Es dudoso que muchos usuarios obtengan un saldo por encima de la recompensa del bloque, pero me gustaría explorar mis opciones.

Solo para aclarar cuando digo bloquear el saldo me refiero a cada usuario, no a todo el contrato.
No tiene que depender solo de nowuna "semilla" para la aleatoriedad. También puede confiar en msg.sender. En otras palabras, puedes usar algo como abi.encodePacked(now, msg.sender).
Ya he intentado que, lamentablemente, un usuario malintencionado podría crear otro contrato para obtener el mismo resultado numérico con su dirección, creo. Pensé que podían seguir haciendo este cálculo hasta que obtuvieran el número deseado y esperar para llamar durante ese tiempo.

Respuestas (2)

Si genera un número aleatorio en Solidity, tendrá que mirar fuera de la cadena en algún momento, de lo contrario, los mineros podrían manipular cualquier tipo de generador de números aleatorios usando el blockhash.

Un enfoque ingenuo para obtener un número aleatorio en una aplicación en la que está de acuerdo con que sea 'hackeable':

function random() private view returns(uint){
    return uint(keccak256(abi.encodePacked(block.difficulty, now, number)));
}

De lo contrario, querrá usar un Chainlink VRF . Aquí hay un artículo sobre el tema si desea obtener más información.

Estoy pensando en usar el oráculo de Rhombus's Network pero estoy tratando de obtener más información, ¡gracias!

Si las tarifas de Chainlink son demasiado altas, siempre puede crear su propia baliza aleatoria que publique números aleatorios en una cadena de bloques. Luego ejecute esto en el nodo DigitalOcean de $ 5 y algo de ETH en la billetera caliente para publicar números con la frecuencia suficiente para su caso de uso.

¿Cómo se ingresaría este número en la cadena de bloques/contrato? Parece una mejor opción, pero supongo que algunos usuarios no la preferirían. ¡Gracias!
La forma más fácil es que el servidor tenga un trabajo de temporizador que escriba un nuevo número aleatorio en su contrato inteligente cada día/semana/mes. Además, no sabes si a los usuarios les importa hasta que preguntas :)
Cierto :) gracias por tu ayuda! Al crear dapps, también me gusta apegarme a la descentralización total si es posible, así que tal vez sea más personal.