Tipos de variables en Solidity

Solidity

En este tutorial vamos a ver cuáles son los diferentes tipos de los que pueden ser las variables en Solidity. A diferencia de JavaScript, tendrás que declarar las variables y definir de qué tipo son. Es lo que se conoce como tipado fuerte. Por el contrario, en lenguajes como JavaScript, puedes asignar cualquier valor a una variable, lo que se conoce como tipado débil.

Debido a la sensibilidad de los datos que se tratan en Solidity, tiene todo el sentido del mundo que sea un lenguaje de tipado fuerte. Por ello es muy importante que aprendas cuáles son los tipos existentes.

Podríamos clasificar los tipos variable de Solidity en tres grupos, que son los tipos de variable de tamaño fijo, los de tamaño variable y los definidos por el usuario:

  • Tipo de variable de tamaño fijo: Estas variable ocuparán siempre el mismo tamaño en memoria con independencia de su valor, por lo que tienes que tener esto en cuanta a la hora de asignarles su valor.
  • Tipo de variable de tamaño variable: Ocupan un espacio diferente en memoria en función del tamaño del valor que contengan.
  • Tipos de variable definidos por el usuario: Estructuras complejas cuyo tipo es definido por el usuario, como los objetos o los arrays.

Las variables se pueden definir en el interior de una función, recibiendo el nombre de variables locales, ya que no funcionarán fuera de la misma. Cuando creas un Smart Contract también se pueden definir en la cabecera del mismo, justo tras la declaración del contrato, de modo que puedas acceder a ellas desde cualquier función del mismo:

pragma solidity 0.8.0;

contract MiContracto
{
    bool soyGuapo;
    address destinatario;
    /* ... */
}

A continuación vamos a ver en detalle los tipos de variables que existen en Solidity.

Variables de tipo bool

Se trata de uno de los tipos más utilizados. Se declaran mediante el tipo bool y es una variable de tamaño fijo que únicamente puede contener los valores binarios 0 (false) o 1 (true). Estas variables funcionan exactamente igual que las variables booleanas de JavasScript.

En el siguiente ejemplo definimos la variable booleana soyGuapo:

bool soyGuapo;

Para asignarle un valor:

soyGuapo = true;

Variables de tipo uint

Se trata del tipo de variable unigned integer, que tal y como su nombre indica contiene números enteros positivos, ya que no contienen signo. Son variables de tamaño fijo y se declaran mediante el tipo uint. Es el tipo de valor que usarás cuando quieras realizar una transacción financiera.

En el siguiente ejemplo definimos la variable de tipo uint cantidad:

uint cantidad;

Para asignarle un valor:

cantidad = 40;

Variables de tipo address

Este tipo de variable de tamaño fijo se suele usar para almacenar direcciones de Ethereum. Puedes asignarle otra variable o directamente un literal, que es una cadena de 40 caracteres que comienza por el prefijo 0x. Estos 40 caracteres se corresponden internamente con 20 bytes. El checksum de al dirección debe ser válido para que Remix o Solidity no lancen un aviso.

En el siguiente ejemplo definimos una variable address con nombre destinatario:

address destinatario;

Para asignarle un valor literal:

address = 0xc0ffee254529296a45a3285639AC7B10F9d54960;

Variables de tipo bytes32

El tipo de variable bytes32 es una variable de tamaño fijo que puede contener cualquier valor binario arbitrario. Se suele usar par representar cadenas, entre otras cosas, siempre y cuando su tamaño no exceda los 32 bytes.

En el siguiente ejemplo definimos una variable de tipo bytes32 a la que daremos el nombre de saludo:

bytes32 saludo;

Para asignarle un valor:

saludo = "Say no way";

Variables de tipo string

Este tipo de variable de tamaño variable se usa para almacenar cadenas, al igual que en muchos otros lenguajes de programación, como por ejemplo JavaScript. Sin embargo, a diferencia de JavaScript, en Solidity no existen demasiadas funciones que permitan manipular cadenas de texto. Por ello, muchos desarrolladores prefieren almacenar las cadenas en variables de tipo bytes32. Otra posibilidad consiste en almacenar las cadenas en variables de tipo bytes.

En el siguiente ejemplo definimos una variable de tipo string a la que llamaremos saludo:

string saludo;

Para asignarle un valor:

saludo = "say no way-ah, no way-ay-ay-ay";

Variables de tipo bytes

Se trata de una generalización del tipo de variable bytes32 que ya hemos visto, pero a diferencia del tipo bytes32, el tipo bytes no tiene un tamaño predefinido, siendo de tamaño variable. Este tipo también se usa para almacenar cualquier tipo de información binaria.

En el siguiente ejemplo definimos la variable de tipo bytes de nombre saludo:

bytes saludo;

Para asignarle un valor:

saludo = "Na-na, why don't you get a job?";

Variables de tipo array

El tipo array es un tipo de tamaño variable que se usa para almacenar colecciones de datos. Se trata de vectores que pueden almacenar datos de un determinado tipo, que debe ser especificado de antemano. Para declararlos se suele usar la notación tipo[] al igual que en otros lenguajes como JavaScript, siendo tipo el tipo de variable de los elementos que queremos almacenar.

En el siguiente ejemplo definimos una variable de tipo array que contiene elementos de tipo uint:

uint[] balances;

Para asignarle un valor:

balances = [1, 2, 3];

Variables de tipo mapping

El tipo mapping es un tipo de tamaño variable que se usa para almacenar colecciones de datos del mismo tipo. Son arrays asociativos en los que puedes especificar el índice o clave de cada elemento del array. Las claves se asocian o mapean con un valor; de ahí su nombre.

Se declaran mediante la notación mapping(tipoClave => tipoValor), siendo tipoClave el tipo de la clave que tendrán los elementos del array y tipoValor en tipo de los elementos que contendrá el array.

En el siguiente ejemplo definimos la variable de tipo mapping que contendrá elementos de tipo string y cuyas claves serán de tipo uint:

mapping(uint => string) usuarios;

Para asignarle un valor:

usuarios[2] = "Doomdude";

Variables de tipo struct

Se trata de un tipo de variable que contiene datos cuyo tipo debe ser definido por el usuario. Estos tipos se definen usando la palabra struct seguido del tipo de la estructura, que en general comenzarán por mayúscula. Seguidamente, declararás entre llaves las diferentes variables que contendrá la estructura.

En el siguiente ejemplo definimos un tipo de estructura o struct al que daremos el nombre de Usuario. Contendrá un identificador de usuario al que llamaremos id. También agregamos el nombre de usuario en la variables nombre y su lista de amigos, definida mediante su identificador, en el array amigos:

struct Usuario {
    uint id;
    string nombre;
    uint[] amigos;
}

Tal y como ves una estructura es similar a un objeto de JavaScript, con la diferencia de que en este caso solo definimos el tipo. A la hora de instanciar el objeto debemos almacenarlo en alguna otra variable cuyo tipo será el que hemos definido para la estructura, aunque también podrás almacenarlo en otras variables como por ejemplo un array o una variable de tipo mapping. Se trata de un tipo de variable que usarás con mucha frecuencia.

Para declarar una variable de tipo Usuario:

uint[] amigos = [2,3];
Usuario miUsuario = Usuario(1, "Edu", amigos);

Tal y como ves hemos definido primero la lista de amigos, ya que en Solidity siempre es necesario definir un tipo. Si asignásemos sencillamente [2,3] como valor de la lista de amigos, el compilador lanzaría un error.

Variables de tipo enum

Se trata de un tipo de variable que también contiene datos cuyo tipo debe ser definido por el usuario. Se declaran mediante la palabra clave enum y contienen una serie de opciones.

En el siguiente ejemplo definimos un tipo de estructura al que daremos el nombre herramientas:

enum Herramientas {
    MARTILLO,
    DESTORNILLADOR,
    ALICATE
}

Dicho de otro modo, el tipo enum contiene elementos que podrían ser considerados como etiquetas. Si quisieses representar una herramienta dentro de un Smart Contract tendrías que hacer referencia al tipo y Herramienta y luego al elemento en sí:

Herramienta.DESTORNILLADOR;

Y con esto ya hemos terminado con los tipos de datos básicos de Solidity.

Finalizando

Con estos tipos debería ser suficiente para que comiences a crear Smar Contracs sin complicarte mucho la vida. En otros tutoriales veremos en detalle algunos de estos tipos, como los tipos array, struct o mapping, de modo que puedas aprender a manipularlos.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

1 comentario en “Tipos de variables en Solidity

  1. Excelente explicación. Me gusta porque proporcionas información desde la parte básica, permite ir dando más detalle en medida de que se asimile la información anterior.

Deja una respuesta

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”