En primer lugar, se puede apreciar que se trata de un contrato bastante simple. Se definen al comienzo algunas variables en el
Storage del contracto, también está el constructor del
Smart Contract y una función denominada
set_flag(flag).
Figura 3: Smart Contract del reto Blockchain Tour
Si ya has jugado otros niveles de
Level_UP! echarás en falta la típica función
getFlag() que normalmente, tras realizar diferentes acciones para conseguir ser el
owner del contrato, nos termina devolviendo la
flag para superar el reto. Sin embargo en esta ocasión no disponemos de dicha función, por lo que tenemos que ver que otras opciones tenemos. Detallando las variables que se almacenan en el
Storage tenemos:
- Una variable privada de tipo string llamada flag.
- Un variable pública de tipo uint llamada blocknumber.
- Una variable pública de tipo address llamada owner.
Esta última variable,
owner, se fija en el momento del despliegue del contrato, a través del constructor, dándole el valor con la dirección del
msg.sender. Además, la plataforma hace también una llamada a la función
set_flag() tras desplegar el contrato para definir el valor de la
flag dinámica que se genera desde el
backend. Por ello, esta función
set_flag() tiene un requisito que comprueba que es el propietario del contrato el que puede llamar a esta función.
Además de definir el valor de la
flag (que se pasa como parámetro y se guardará en la variable
flag del
Storage), se define el valor de la variable
blocknumber, que tendrá el valor del número de bloque actual. Y aquí es donde debemos fijarnos. Al ser una variable pública podremos acceder a dicho valor.
Figura 4: Acceso a la variable blocknumber desde la consola del navegador
Podemos encontrar el valor en hexadecimal que, si lo pasamos a decimal, obtendremos el valor del bloque donde debemos buscar. En el ejemplo mostrado aparece el valor “
0x027e”, que se corresponde con el valor
638. Vamos ahora a revisar que hay en dicho bloque. Para revisar el contenido del bloque podemos hacer uso de la
API JSON-RPC que dispone la
blockchain, concretamente haciendo una solicitud con método
eth_getBlockByNumber:
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber",
"params":["0x027e", true],"id":1}' 127.0.0.1:7545
Figura 5: Haciendo uso de JSON-RPC API de Ethereum
En este caso, como la
blockchain se encuentra en un
Ganache GUI en la misma máquina, sería posible revisar directamente la
GUI para encontrar el bloque de una manera más sencilla aunque este método sólo es válido si tenemos nosotros el acceso al
Ganache GUI.
Figura 6: Visualización del bloque en Ganache GUI
En ambos ejemplo nos encontramos que hay una única transacción:
0xcc3abbedd9f63ef1d09c3f1b7a6b978917bc9970d36316c1476d8b23a9f4cca6. Incluso en la petición con
cURL nos da la información directamente del
input de la transacción, ya que la petición se hizo para que diera el detalle de cada una de las transacciones que se encuentran en el bloque:
0x42e22ff6000000000000000000000000000000000000000000000000000000000000002
00000000000000000000000000000000000000000000000000000000000000027323
23934383936343334313433363136383934303638393337373430313235373131373
138393300000000000000000000000000000000000000000000000000
Con esta información, en primer lugar, podemos averiguar el selector de la función. Hago uso de nuestra
herramienta Open Source CrazyToolBox y compruebo el selector
0x42e22ff6 con la función selector decoder.
Pero lamentablemente el servicio
4byte.directory no tiene información sobre este selector, por lo que procedo a validar que la función
set_flag() se corresponde con dicho selector haciendo uso del selector encoder.
Ahora sí, estamos seguros de que en esos datos es donde debemos buscar nuestra
flag. Como en la función
get_flag() sólo se pasa un parámetro (la
flag) vamos a convertir los datos de
hexadecimal a texto (
ASCII).
Figura 9: Conversor de hexadecimal a ASCII
¡Lo tenemos! Finalmente, nos queda validar nuestra
flag (únicamente los números) interactuando con el contrato base y la función
validateFlag() para obtener nuestros puntos, tal y como ya se ha realizado con anterioridad en el resto de retos.
Nuevo reto: Gas Knowledge
Este mes publicamos un nuevo reto relacionado con el
gas en
Ethereum, donde se repasa este concepto y tendrás que acelerar tus transacciones si quieres superar el reto. Se trata del reto número
17, con un nivel de
2 sobre
5 y que nos dará
75 puntos para sumar al resto de retos que ya tenemos validados. Recuerda reclamar tu
NFT en la plataforma cada vez que puedas para demostrar tu nivel, ¿llegarás a ser el gran maestro?
Figura 10: Nuevo reto "Gas Knowledge"
Como siempre, esperamos que sigas disfrutando y aprendiendo con la plataforma
Level_UP! y nos vemos el próximo mes con un nuevo reto,
que pronto tendréis novedades para jugar en una testnet.