Ethernaut #1: Hello Ethernaut


Ethernaut es un juego interactivo desarrollado por OpenZeppelin diseñado para enseñar a los desarrolladores los principios fundamentales de la seguridad en contratos inteligentes de Ethereum. A través de desafíos prácticos, los jugadores deben explotar vulnerabilidades de smart contracts, lo cual permite aprender y aplicar técnicas de hacking ético en un entorno seguro.

Este artículo te guiará a través de la configuración básica de Ethernaut y te mostrará cómo resolver el primer desafío del juego.

Configuración básica

Instala MetaMask

MetaMask es una extensión de navegador que actúa como billetera para interactuar con blockchains compatibles con EVM. Si aún no la tienes instalada, puedes hacerlo en navegadores como Chrome, Firefox, Brave u Opera. Una vez instalada, configura tu billetera y selecciona la red de prueba Sepolia desde el selector de redes.

Si quieres ver distintas redes a las que puedes conectarte a MetaMask puedes utilizar Chainlist para añadirlas en un click.

Comandos de consola

Ethernaut provee varios comandos útiles a través de la consola que te ayudarán a lo largo del juego. Aquí tienes algunos de los más importantes:

  • player: Muestra la dirección de tu jugador actual.
  • ethernaut: Es el contrato principal del juego.
  • level: Muestra la dirección del contrato del nivel actual.
  • contract: Instancia del contrato del nivel actual (si ya ha sido creado).
  • instance: Dirección del contrato de la instancia del nivel actual (si ya ha sido creada).
  • version: Muestra la versión actual del juego.
  • getBalance(address): Obtiene el saldo en ether de una dirección específica.
  • getBlockNumber(): Devuelve el número del bloque actual de la red.
  • sendTransaction({options}): Envía una transacción con las opciones especificadas.
  • getNetworkId(): Muestra el ID de la red de Ethereum en la que estás conectado.
  • toWei(ether): Convierte unidades de ether a wei.
  • fromWei(wei): Convierte unidades de wei a ether.
  • deployAllContracts(): Despliega todos los contratos restantes en la red actual.
⚠️

Varios de los comandos que ejecutemos necesitan tener el await

Obtener Ether para testnet

Para jugar, necesitarás ether de prueba. Puedes conseguirlo a través de un faucet para la red Sepolia.

Yo actualmente uso la Facet Sepolia que ofrece Google.

Hay varias por internet y a veces es un poco complicado encontrar una que te pueda dar ETH de forma frecuente.

Resolviendo la Kata

Ahora que ya tenemos todo listo, es hora de abordar el primer desafío. La meta de este nivel es interactuar con el contrato inteligente generado y descubrir cómo superarlo.

El contrato tiene un método info() que puedes ejecutar para obtener una pista inicial:

await contract.info()

Este comando devolverá:

'You will find what you need in info1().'

Ejecuta info1() para obtener la siguiente pista:

 await contract.info1()

Respuesta: ‘Try info2(), but with “hello” as a parameter.’

Llama a info2() con el parámetro “hello”:

await contract.info2('hello')

Respuesta: ‘The property infoNum holds the number of the next info method to call.’

Descubre el siguiente método llamando a infoNum():

await contract.infoNum()

Con esta pista, ejecuta info42():

await contract.info42()

Respuesta: ‘theMethodName is the name of the next method.’

Llama al siguiente método theMethodName():

await contract.theMethodName()

Respuesta: ‘The method name is method7123949.’

Ejecuta el método method7123949():

await contract.method7123949()

Respuesta: ‘If you know the password, submit it to authenticate().’

Finalmente, descubre la contraseña llamando a:

await contract.password()

Respuesta: ‘ethernaut0’

Para completar el nivel, utiliza el método authenticate() con la contraseña:

await contract.authenticate('ethernaut0')

Conclusión

Una vez autenticado, habrás completado el primer nivel de Ethernaut. Este desafío introductorio es una excelente manera de familiarizarse con la interacción básica con contratos inteligentes. ¡Ahora estás listo para enfrentar desafíos más complejos en Ethernaut!