Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

Lotería Cripto

Publicado: 2026-07-31

Etiquetas: Proyectos, Python


Buenos días, tardes o noches:

Aviso que la idea propuesta en este artículo es tontería pero quería probarla por curiosidad.

Idea

La lotería clásica es un proceso en el que elegimos unos números y luego comprobamos si esos números tienen premio o no. Cuando nos creamos una cartera para criptomonedas hacemos algo parecido: nuestro ordenador genera (elige) un número. En este caso bastante más largo que los de la lotería. Por ejemplo: ad01c933780120c090cdb0fc07ba89532cdbc7e32dc222f8d6c1a780cc50c929. Esta es una clave privada de Ethereum. Dada una clave privada se puede generar la dirección pública de la cartera y con ella saber si hay dinero.

Se me ocurrió que si generamos claves privadas una detrás de otra hasta que encontremos una con saldo sería una especie de lotería y además gratuita (salvo el coste en electricidad). Sería la Lotería Cripto.

Antes de empezar, debería ser obvio por qué hacer esto es una tontería pero por si acaso lo pongo explícitamente. Las claves privadas de Ethereum por ejemplo son de 256 bits. Es decir, hay 115792089237316195423570985008687907853269984665640564039457584007913129639936 valores diferentes. La probabilidad de que se generen dos veces la misma clave es extremadamente baja. La Lotería Nacional por ejemplo tiene una probabilidad de 1 entre 600000 de tener premio. Encontrar una clave privada de Ethereum ya usada previamente simplemente probando combinaciones equivaldría a que a una persona le tocasen todas las lotería del mundo el mismo día. No tiene sentido pero vamos con ello.

Implementación

Lo primero era averiguar cómo obtener el saldo de una cartera Ethereum con Python. Al parecer el módulo Web3 es el más usado para estas cosas. Con él son 3 líneas de código:

w3 = Web3(Web3.HTTPProvider(provider_url))
balance_wei = w3.eth.get_balance(address)
balance_etch = w3.from_wei(balance_wei, 'ether')

Para poder saber el estado de una cuenta hace falta un proveedor de Web3. Encontré una lista de proveedores gratuitos y puse uno al azar.

Como mi objetivo era encontrar claves privadas que dinero, necesitaba algo para poder generarlas: el módulo eth-account. Con dos líneas ya tenemos el asunto resuelto.

acc = Account.create()
address = acc.address

El código final incluye algunos prints, espera un minuto cada vez y si encuentra una cartera con dinero (cosa que nunca pasará) escribe los datos a fichero.

from eth_account import Account
from web3 import Web3
import time

provider_url = 'https://public-eth.nownodes.io/'

def main():
    while True:
        w3 = Web3(Web3.HTTPProvider(provider_url))

        acc = Account.create()
        address = acc.address

        balance_wei = w3.eth.get_balance(address)
        balance_etch = w3.from_wei(balance_wei, 'ether')

        print(f'Key: {acc.key.hex()}')
        print(f'Address: {address}')
        print(f'Balance (ETH): {balance_etch}')

        if balance_etch > 0:
            print('FOUND!')

            with open('result.txt', 'w') as fin:
                fin.write(acc.key.hex() + '\n')
                fin.write(address + '\n')
            quit()

        print('--------------------------------')
        time.sleep(60)


if __name__ == "__main__":
    main()

Esto es un ejemplo de lo que va escribiendo:

Key: ad01c933780120c090cdb0fc07ba89532cdbc7e32dc222f8d6c1a780cc50c929
Address: 0x38F2EA6782C03476a66684edf02950280751b90b
Balance (ETH): 0
--------------------------------
cKey: 52e6a3533fe70c8f51c5ababc663e7f6c7db5c63bda6410aeacdd78fe9e67e41
Address: 0x52D0b237d6b77EDc240113Eac166Ce2b6fB88B80
Balance (ETH): 0
--------------------------------
Key: 403420324fd1eb57afffd048eaac7263488475204d096062e90546451ec8ded3
Address: 0xe6f35Ee768878AE7E74C5438643432bBF3bDe486
Balance (ETH): 0
--------------------------------
Key: fe9a180d63f648e070b65d58e0e83a3aaf7cab9141be4f97e2c1952adf7ca72d
Address: 0xb27262Fca5F20E785aBcd3FD8561f366B9A3f82d
Balance (ETH): 0
--------------------------------
Key: 54153669995016968c5b3702ac090785151b6fc6d1d59e81abda5ee0212286d1
Address: 0xbA4DD71926Ac900E2910c6582232F3D9f9DB08eF
Balance (ETH): 0
...

El otro día lo dejé ejecutándose durante la noche y cuando miré por la mañana la terminal ya no estaba. Se había cerrado. Ya expliqué el mes pasado que en mi Ubuntu las terminales se cierran si están 15 minutos sin actividad. Esto quiere decir que se había dejado de ejecutar el script y la única forma de que pare el script anterior es que encuentre una cartera con dinero. ¿Me había tocado la Lotería Cripto?

Por supuesto que no. No había ningún fichero result.txt en el directorio así que no había encontrado nada. Seguramente el script falló por alguna razón y se cerró. No sé la razón exacta porque la terminal se cerró automáticamente 15 minutos después. Lo más probable es que fuera la llamada al proveedor de Web3. Quizá tienen alguna cuota de llamadas que se pueden hacer y yo había superado ese límite a pesar de solo hacer una petición por minuto.

Conclusión

Era una idea muy tonta pero me ha servido para investigar un poco cómo se pueden programar clientes de Ethereum. Supongo que para otros blockchains sería similar.

Si alguien tiene suficiente tiempo y capacidad de cálculo para intentar encontrar claves privadas por fuerza bruta creo que le saldría mucho más rentable usar ese hardware para minar directamente la cadena de bloques. La probabilidad de ganar algo de dinero serían infinitamente más altas.


Artículo siguiente: Sobre la periodicidad de este blog
Artículo anterior: Mi casa