Muy buenas, les saluda Miguel y aquí les traigo este nuevo artículo.
Empezando con Solidity
Las cadenas de caracteres representan el corazón de todos los lenguajes de programación porque, ya sabes, las computadoras a menudo interactúan con los humanos. Por esta razón, el manejo de cadenas es una de las primeras funcionalidades desarrolladas en cualquier idioma. Además, la primera prueba tradicionalmente imprime la cuerda «¡Hola Mundo!»
Solidez no es una excepción. Tiene soporte nativo para cadenas, pero aún así, su uso no es completo como en lenguajes de alto nivel como JavaScript, Python o Java. Por ejemplo, fuera de la caja, Solidity no ofrece una forma nativa de comparar o concatenar cadenas. Sin embargo, la documentación ofrece una solución válida para ambas funciones que se basan en abi.encodePacked()
(hablaremos de ello más adelante) para comparar dos cadenas:
keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2))
Y para concatenar dos cadenas:
abi.encodePacked(s1, s2)
Para comprender mejor la mecánica interna de estas dos funciones simples, como de costumbre, usaremos una implementación de juguete simple:
Como de costumbre, puedes jugar cómodamente con él usando Remix. Una vez compilado, podrá invocar los dos métodos directamente desde la interfaz:
Llamar a los dos métodos firmará una transacción que contiene una invocación al método que pasa los argumentos. La salida de la transacción se muestra en las ventanas de la consola después de la ejecución de la concatenación de cadenas (para mostrar completamente los resultados, recuerde hacer clic en la flecha pequeña a la derecha):
En el núcleo de estas dos implementaciones simples está la función abi.encodePacked()
, que realiza un empaquetado ajustado de las variables pasadas como argumentos. En la siguiente figura (tomada del documentación), puede ver cómo los bits de cada uno de los argumentos simplemente se concatenan en la salida:
Un punto interesante de esta codificación es que es intrínsecamente ambiguo, por lo que no hay forma de decodificarlo. En el siguiente código, simplemente probamos esta ambigüedad comparando la codificación de dos conjuntos de cadenas diferentes. Con el empaquetado en el lugar, las dos invocaciones devolverán la secuencia exacta de bytes porque ambas invocaciones devolverán la cadena "aab"
sin tener en cuenta la diferente longitud de las cadenas de entrada:
Comparando los resultados de la codificación usandokeccak256()
es un enfoque común en Solidity debido a su eficiencia de gas.
Conclusión
Solidity ofrece la manipulación básica de cadenas no de forma nativa, sino a través de un uso bastante estandarizado de un uso nativo y eficiente.
Hay disponibles bibliotecas de manipulación de cadenas más sofisticadas . Incluso hay una biblioteca de analizador JSON.
Mi consejo personal es mantener este tipo de manipulación lo más bajo posible. Los mensajes para el usuario, la manipulación compleja de JSON, etc. deben mantenerse alejados de la cadena de bloques. Blockchain debe considerarse un back-end specializado cuyo rendimiento se basa en la representación de cada una de las variables involucradas.
Referencias
- Solidez 7.1 Documentación.
- Biblioteca de utilidad de cadena y corte para Solidity.
- Utilidades estándar de solidez.
Gracias por leer.
Añadir comentario