¿Es difícil aprender Solidity?
Podría decirse que aprender Solidity como lenguaje es uno de los lenguajes más fáciles de aprender. Sin embargo, aprender el entorno de Ethereum es difícil.
Se ve muy similar a Javascript, o a casi cualquier lenguaje con llaves derivado de C.
Las sentencias if, los bucles for, la herencia de clases y los tipos de variables resultan todos muy familiares.
Solidity sí tiene algunas rarezas exclusivas del movimiento de criptomonedas. Por ejemplo, cada llamada a una función tiene una variable de entorno que indica cuánto ether se envió con la llamada a la función y tiene algunas APIs específicas para interactuar con otros smart contracts. Solidity también tiene instrucciones extrañas como delegatecall y selfdestruct que no se encuentran en otros lenguajes, pero son fáciles de comprender después de estudiar la documentación un poco.
Sin embargo, el desarrollo en Solidity y Ethereum puede estar lleno de sorpresas. Aquí hay solo tres ejemplos.
Cambios aparentemente menores pueden resultar en diferencias muy grandes en el costo de gas

Lo que hace este contrato es muy simple. Transfiere tokens desde otro contrato hacia sí mismo, y luego los transfiere al invocador en la misma transacción.
Sin embargo, openFaucetInefficient y openFaucetMoreEfficient pueden tener costos de gas enormemente diferentes. ¿Por qué? A nivel interno, los tokens ERC20 almacenan el saldo del usuario como una variable de storage. Cuando una variable de storage pasa de cero a un valor distinto de cero, esto hace que la variable se cree en la blockchain. Y el paso de creación tiene un alto costo asociado. Cuando una variable se establece en cero, se borra implícitamente. Así que la primera función está creando y borrando repetidamente una variable de storage.
La segunda función es mucho más eficiente. Crea la variable de storage para su propio saldo y luego se asegura de que no se destruya hasta el final, cuando transfiere el último token. Esto evita la creación innecesaria de variables de storage.
La tercera función, que tiene una construcción de bucle for extraña, es aún más eficiente. Debido a ciertas peculiaridades en el compilador de Solidity, reorganizar un bucle for de esta manera es más eficiente, incluso cuando le indicas al compilador que aplique mejoras de eficiencia automáticas en tu código.
¿Cómo sabrías esto? Bueno, no hay una manera directa de saberlo. Es por eso que Solidity no es fácil de dominar.
Las operaciones de E/S (I/O) pueden deshacerse

Tanto x como y son variables de storage, y puedes pensar en ellas como si estuvieran almacenadas en un disco persistente. Mantienen sus valores entre transacciones.
Al ser consultados, muchos desarrolladores asumen que x se establecerá en newValue e y se establecerá en 2 veces x si x es menor o igual a 10. Por ejemplo, si newValue es 5, x será 5 e y será 10. Si newValue es 20, x será 20 y newValue no cambiará.
Pero esto no es lo que sucede. Si ocurre un revert en cualquier parte de la transacción, la escritura en X se deshace.
Esto resulta muy contraintuitivo para los desarrolladores, porque la mayoría de las operaciones de E/S no hacen revert. Sin embargo, todas las transacciones en Ethereum son atómicas. Por lo tanto, x nunca puede ser mayor que 10, y x e y deben cambiar a la par.
Las funciones inocuas pueden conducir a ataques de reentrada

El código anterior parece enviar a las personas un token ERC20 y un token ERC1155 cuando llaman a mintTokens. Aparentemente, cada dirección solo puede acuñar una vez debido a la comprobación de alreadyClaimed.
Sin embargo, es posible vaciar el contrato de todos los tokens en una sola transacción. La función _mint en ERC1155 no solo acuña un token, sino que también cede el control al remitente de la transacción, antes de haber actualizado que el remitente ha reclamado sus tokens. Esto permite al remitente reclamar todos los tokens para sí mismo llamando de forma recursiva a mintTokens cuando _mint le devuelve el control.
No hay ninguna lógica ni razón sobre qué funciones ceden el control a otros contratos. Uno simplemente tiene que memorizarlas.
Conclusión
Como puedes ver arriba, un lenguaje aparentemente simple puede estar lleno de sorpresas. Aquí solo hemos arañado la superficie. ¿Sabías que es posible que los smart contracts “inmutables” cambien su bytecode? ¿Qué hay de los malos diseños de código que permiten a los compradores gastar dos veces su ether sin un ataque de reentrada? ¿Puedes generar números aleatorios de forma segura a pesar de que la blockchain es completamente determinista y transparente?
La tecnología blockchain está llena de incógnitas imprevisibles a pesar de utilizar un lenguaje de programación que es “fácil” de aprender. Es por esto que los hackeos son tan comunes.
Solidity se puede comprender en un fin de semana. Aquí tienes nuestro tutorial gratuito para Aprender Solidity rápidamente si ya conoces otro lenguaje de programación.
Pero dominar el ecosistema no ocurre en cuestión de días.
¿Quieres dominar el ecosistema? Postula ahora a nuestro Solidity Bootcamp completamente remoto.
Publicado originalmente el 8 de noviembre de 2022