Eventos en solidity

Los eventos en solidity son como en cualquier otro lenguaje, emisor y receptor. Se usan para comunicar que algo paso en el blockchain hacia tu frontend, el cual estará «escuchando» para ciertos eventos y tomara acción cuando suceda.

Por ejemplo:

// declarando el evento
event EnterosSumados(uint x, uint y, uint resultado);

function sumar(uint _x, uint _y) public returns (uint) {
  uint result = _x + _y;
  // disparar el evento hacia el app
  emit EnterosSumados(_x, _y, result);
  return result;
}

Tu frontend podría estar escuchando el evento. Una implementación en Javascript podría verse así:

TuContrato.EnterosSumados(function(error, result) {
  // haz algo con el resultado
})

Source: https://cryptozombies.io/en/lesson/1/chapter/13

También te puede interesar:

Funciones puras en solidity: https://alanhurtarte.com/funciones-puras-en-solidity/

Funciones puras en Solidity

En solidity hay funciones llamadas puras o pure en ingles, que es cuando no se accede al app ni se escribe sobre ella, solo se usa lo que se mande por parámetros.

Por ejemplo

function _multiply(uint a, uint b) private pure returns (uint) {
  return a * b;
}

Esta función ni siquiera lee el estado del app. El valor a retornar depende solo de los parámetros de la función.

Cabe mencionar que puede ser difícil de recordar cuando marcar una función como pure/view. Por suerte el compilador es bueno para recordar con warning de cuándo deberías usar uno de estos modificadores.

Source: https://cryptozombies.io/en/lesson/1/chapter/10

Lo que aprendí del Toptal JS Speeding Challenge

El toptal js speeding challenge concluyo ya hace unas semanas, y tenía premios geniales como $1000 gift card en amazon y unos airpods para el primer lugar. Lo que aprendí yc de cómo podrías ganarlo.

Muchos como a mí les habra salido la publicidad del challenge de toptal, apelaban al orgullo de si podías resolver algo con js rápido, y no me convencían, paso una semana con estos anuncios constantes hasta que decidí participar. Lo curioso es que la publicidad que funciono fue una que apelaba a mi nacionalismo. Algo tipo «ayuda a que tu país rankee mas alto». Me parece curioso que eso me llevo a la acción.

El primer intento

Bueno dije yo, participe y resultaron ser los típicos ejercicios de JS que hacen en las entrevistas laboras. Algunos mas fáciles como retorno un numero al cubo, o sacar la raíz cuadrada de un número. Otros un poco más complejos como encontrar anagramas y palíndromos.

En mi primer intento saque 15 puntos, fueron 3 ejercicios acertados en 2:30 minutos. Me pareció muy poco tiempo pero pensé, de esto se ha de tratar, quién typea mas rapido. Al terminar mi tiempo me llevo a mi scoreboard nacional, solo habían unos 8 participantes y estaba sexto en el listado de Guatemala, pero el primer lugar tenía 4500 puntos. Eso es imposible dije yo, o logro hackear el timer o esta haciendo algo más, porque no hay manera de escribir tan rápido. Luego vi el score global y era lo mismo, arriba de 4000 puntos.

Lo que necesitaba era automatización

Después de ver los scores más altos encontré que esto tenía que ser un bot, o algo similar. Investigue un poco y decidí probar https://github.com/puppeteer/puppeteer. Resulta que esta herramienta se utiliza para automatizar pruebas y acciones en un navegador tal y como la haría una persona, pero mucho más rápido. Pase dos días perdido probando e investigando como niño que descubrió algo nuevo.

Resulto que el Toptal JS Speeding Challenge resulto ser mas un concurso de velocidad de automatización que de Javascript.

Solución

Ya con esta solución solo fue cuestión de tiempo para encontrar el patrón y automatizar todas las respuestas. Yo entre el penúltimo día de la competencia, logre una puntuación alta, mas no perfecta. Logre quedar en el puesto 15 de América y como en el 97 a nivel global. Mi solución puede encontrarse aquí https://github.com/kenny08gt/toptal-speed-coding-challenge-js

Leaderboard en América
Leaderboard en Americas (mejor posición que llegue, luego quede 15)

Que queda por mejorar y aprendí

Realmente creo que mis soluciones se pueden mejorar para dar un mejor tiempo de respuesta, sin embargo creo que es más fundamental encontrarse en un lugar con poca latencia. En un concurso tan competido, donde el tiempo es la medida de calificación, sería perfecto tener una conexión con poca latencia. Donde en vez de tardarse 300ms la conexión pudiera darse en menos de 100ms. Multiplica eso por 36 ejercicios y ya son mas de 3 segundos menos, por dar un ejemplo. Esta podría ser la clave para ganarlo o rankear mas alto.

No te olvides de pasar otros de mis posts