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.
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.
1. Librerías internas:
2. Librerías externas:
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;
}
}
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:
using Operaciones for uint
extiende el tipo uint
con las funciones de la librería.
sumar
y restar
se pueden llamar directamente sobre instancias de uint
.
1. Reutilización de código:
2. Extensión de tipos:
3. Optimización de gas:
4. Modularidad:
Si necesitas una librería externa (que debe ser desplegada en la blockchain), sigue este ejemplo:
library LibreriaExterna {
function multiplicar(uint a, uint b) external pure returns (uint) {
return a * b;
}
}
pragma solidity ^0.8.0;
contract Calculadora {
function calcularMultiplicacion(uint a, uint b) public pure returns (uint) {
return LibreriaExterna.multiplicar(a, b);
}
}
external
.
1. Sin variables de estado:
2. Sin constructores:
3. Alcance de las funciones:
internal
para librerías internas y external
para librerías externas.
4. Uso de using for:
1. Centraliza la lógica común:
2. Optimiza el tamaño de los contratos:
3. Documenta las librerías:
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:
ArrayUtils
añade una función encontrar
al tipo [uint]
.
ManejoArrays
utiliza esta funcionalidad para buscar elementos en un array.
Para más información sobre el uso de librerías, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer