WEB3DEV Español

Cover image for Solidity: Jugando con las Cadenas
Delia Viloria T
Delia Viloria T

Posted on • Updated on

Solidity: Jugando con las Cadenas

Image description

Los strings (cadenas) de personajes representan el centro de cada idioma de programación porque, como sabrás, las computadoras usualmente interactúan con los humanos. Por esta razón, manejar las cadenas es una de las primeras funcionalidades desarrolladas en cualquier lenguaje. Además, la primera prueba tradicionalmente imprime la cadena “Hello, world!”

Solidity no es una excepción. Tiene apoyo nativo para las cadenas pero aún, su uso no está completo 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 las cadenas. Sin embargo, la documentación ofrece una solución válida para ambas funciones que depende de abi.encodePacked() (hablaremos de ello luego) para comparar dos cadenas:

keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2)) 
Enter fullscreen mode Exit fullscreen mode

Y para concatenar dos cadenas:

abi.encodePacked(s1, s2)
Enter fullscreen mode Exit fullscreen mode

Para entender mejor los mecanismos internos de estas dos funciones simples, como siempre, usaremos una implementación juguete simple:

pragma solidity ^0.7.1;

contract C {

function compare(string memory s1, string memory s2) public pure returns (bool) {

return keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2));
}


function concatenate(string memory s1, string memory s2) public pure returns (string memory) {

return string(abi.encodePacked(s1, s2));
}
}
Enter fullscreen mode Exit fullscreen mode

Como siempre, puede jugar cómodamente usando Remix. Una vez compilado, serás capaz de invocar dos métodos desde la interfaz:

Image description

Llamar los dos métodos, firmará una transacción que contiene la invocación al método que pasó por los argumentos. La salida de la transacción se muestra en la ventana de la consola, siguiendo la ejecución de la concatenación de las cadenas (para mostrar totalmente los resultado, recuerda hacer click en la pequeña flecha en la derecha):

Image description

En el centro de estas dos simples implementaciones está la función abi.encodePacked(), la cual realiza un ajustado paquete de variables que pasan como argumentos. En la siguiente figura (tomada desde la documentación, puedes ver cómo las partes de cada uno de los argumentos son simplemente concatenados en la salida:

Image description

Un punto interesante de este encoding (codificación) es que es inherentemente ambiguo, así que no hay manera de decodificarlo. En el siguiente código, simplemente probamos esta ambiguedad, comparando la codificación de dos conjuntos de cadenas distintas. Con el paquete en su lugar, las dos invocaciones regresarán a la secuencia exacta de bytes porque ambas invocaciones regresarán al string ”aab” sin considerar la longitud diferente del input de las cadenas:

pragma solidity ^0.7.1;

contract ambiguity {

function test_ambiguity() public pure returns (bool) {

return (keccak256(abi.encodePacked("aa", "b")) == keccak256(abi.encodePacked("a", "ab")));

}
}
Enter fullscreen mode Exit fullscreen mode

Comparando los resultados codificados usando keccak256(), es un acercamiento común en Solidity porque es eficiente con el gas.

Conclusión

La manipulación básica de las cadenas es ofrecida por Solidity pero no de forma nativa sino a través de un uso nativo y eficiente muy estandarizado.

Hay librerías de manipulación de cadenas más sofisticadas. Incluso hay una librería parson JSON.

Mi consejo personal es tomar esta forma de manipulación lo más bajo posible. Los mensajes para el usuario, la manipulación compleja de JSON, etc. debería estar alejado de la blockchain. La Blockchain debería ser considerada como un backend especializado con un performance que depende de la representación de cada una de las variables envueltas.

Referencias

  1. Documentación Solidity 7.1
  2. Librería de utilidades de string & slice para Solidity
  3. Utilidades Estándar de Solidity

Este artículo fue escrito por Rosario de Chiara y traducido por Delia Viloria T. Su original se puede leer aquí.

Sería genial escucharte en nuestro Discord, puedes contarnos tus ideas, comentarios, sugerencias y dejarnos saber lo que necesitas.
Si prefieres puedes escribirnos a @web3dev_eshttps://twitter.com/web3dev_es en Twitter.

Discussion (0)