Volver a la página principal
martes 10 diciembre 2024
4

Cómo usar library en Solidity para definir funciones reutilizables

Una library es un conjunto de funciones que se pueden llamar desde otros contratos o directamente desde la librería. Las librerías son útiles para realizar operaciones comunes, como cálculos matemáticos, gestión de arrays o manipulación de datos.

Características principales:

1. Funciones reutilizables: Facilitan la centralización de lógica compartida.

2. Asociación con tipos de datos: Permiten extender tipos mediante el uso de funciones.

3. Inmutabilidad: No pueden tener variables de estado ni constructores.

4. Optimización de gas: Las funciones de librerías internas son integradas al contrato que las utiliza.

Tipos de librerías

1. Librerías internas:

  • Se compilan directamente en el contrato que las utiliza.
  • No requieren un despliegue independiente.

2. Librerías externas:

  • Deben desplegarse por separado y enlazarse al contrato que las usa.
  • Son útiles para operaciones comunes en múltiples contratos.

Declaración básica de una librería

Ejemplo de una librería para operaciones matemáticas

pragma solidity ^0.8.0;

library Operaciones {
    function sumar(uint a, uint b) internal pure returns (uint) {
        return a + b;
    }

    function restar(uint a, uint b) internal pure returns (uint) {
        require(a >= b, "El minuendo debe ser mayor o igual al sustraendo");
        return a - b;
    }
}
  • internal: Las funciones son accesibles solo dentro de los contratos que las importen.
  • pure: Indica que la función no modifica ni lee el estado del contrato.

Uso de una librería en un contrato

Ejemplo de integración

pragma solidity ^0.8.0;

import "./Operaciones.sol";

contract Calculadora {
    using Operaciones for uint;

    function calcularSuma(uint a, uint b) public pure returns (uint) {
        return a.sumar(b); // Llamada usando "using for"
    }

    function calcularResta(uint a, uint b) public pure returns (uint) {
        return a.restar(b);
    }
}

En este ejemplo:

  • La directiva using Operaciones for uint extiende el tipo uint con las funciones de la librería.
  • Los métodos sumar y restar se pueden llamar directamente sobre instancias de uint.

Ventajas de usar librerías

1. Reutilización de código:

  • Centraliza la lógica común, lo que evita duplicaciones y facilita el mantenimiento.

2. Extensión de tipos:

  • Permite agregar funciones específicas a tipos de datos existentes.

3. Optimización de gas:

  • Las librerías internas no requieren un despliegue adicional, lo que reduce los costos en gas.

4. Modularidad:

  • Ayuda a organizar mejor los contratos dividiendo funcionalidades en módulos reutilizables.

Librerías externas

Si necesitas una librería externa (que debe ser desplegada en la blockchain), sigue este ejemplo:

Ejemplo

Declaración de la librería

library LibreriaExterna {
    function multiplicar(uint a, uint b) external pure returns (uint) {
        return a * b;
    }
}

Uso en un contrato

pragma solidity ^0.8.0;

contract Calculadora {
    function calcularMultiplicacion(uint a, uint b) public pure returns (uint) {
        return LibreriaExterna.multiplicar(a, b);
    }
}
  • La librería debe ser desplegada previamente, y su dirección será enlazada al contrato que la utilice.
  • Las funciones de una librería externa deben ser explícitamente external.

Consideraciones importantes

1. Sin variables de estado:

  • Las librerías no pueden declarar variables de estado, ya que son inmutables.

2. Sin constructores:

  • No pueden tener constructores ni manejar eventos.

3. Alcance de las funciones:

  • Usa internal para librerías internas y external para librerías externas.

4. Uso de using for:

  • Extiende la funcionalidad de un tipo de datos específico con las funciones de la librería.

Buenas prácticas

1. Centraliza la lógica común:

  • Usa librerías para operaciones repetitivas o genéricas, como cálculos matemáticos o validaciones.

2. Optimiza el tamaño de los contratos:

  • Divide las funciones comunes en librerías para reducir la complejidad del contrato principal.

3. Documenta las librerías:

  • Asegúrate de incluir documentación clara para cada función.

Ejemplo avanzado: Librería para manejar arrays

library ArrayUtils {
    function encontrar(uint[] storage array, uint elemento) internal view returns (int) {
        for (uint i = 0; i < array.length; i++) {
            if (array[i] == elemento) {
                return int(i);
            }
        }
        return -1; // Elemento no encontrado
    }
}

contract ManejoArrays {
    using ArrayUtils for uint[];

    uint[] public datos;

    function agregarDato(uint dato) public {
        datos.push(dato);
    }

    function buscarDato(uint dato) public view returns (int) {
        return datos.encontrar(dato);
    }
}

En este ejemplo:

  • La librería ArrayUtils añade una función encontrar al tipo [uint].
  • ManejoArrays utiliza esta funcionalidad para buscar elementos en un array.

Referencias oficiales

Para más información sobre el uso de librerías, consulta la documentación oficial de Solidity.

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer