Una interfaz es una definición abstracta de un contrato que contiene únicamente las firmas de funciones que deben ser implementadas por otro contrato. No incluye lógica ni variables de estado. Las interfaces son ideales para interactuar con contratos externos y para definir estándares, como los utilizados por los tokens ERC-20 y ERC-721.
external
.
pragma solidity ^0.8.0;
interface MiInterfaz {
// Declaración de una función
function miFuncion(uint valor) external;
// Declaración de un evento
event MiEvento(address indexed emisor, uint valor);
}
En este ejemplo:
miFuncion
es una función que debe ser implementada en un contrato que herede de esta interfaz.
MiEvento
es un evento que puede ser utilizado tanto por la interfaz como por el contrato que la implemente.
Las interfaces son útiles para interactuar con contratos ya desplegados en la blockchain, sin necesidad de tener acceso a su implementación completa.
interface ContratoExterno {
function obtenerBalance(address usuario) external view returns (uint);
function transferir(address destinatario, uint cantidad) external;
}
contract MiContrato {
address contratoExterno;
constructor(address _contratoExterno) {
contratoExterno = _contratoExterno;
}
function consultarBalance(address usuario) public view returns (uint) {
return ContratoExterno(contratoExterno).obtenerBalance(usuario);
}
function enviarTokens(address destinatario, uint cantidad) public {
ContratoExterno(contratoExterno).transferir(destinatario, cantidad);
}
}
En este caso:
ContratoExterno
es una interfaz que describe las funciones disponibles en el contrato externo.
MiContrato
utiliza la interfaz para llamar funciones del contrato externo sin necesidad de conocer su lógica interna.
Las interfaces son fundamentales para definir estándares como ERC-20 o ERC-721, asegurando que los contratos sigan una estructura predefinida.
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
Cualquier contrato que implemente la interfaz IERC20 debe proporcionar la lógica para las funciones declaradas, garantizando que cumpla con el estándar.
Las interfaces permiten separar contratos en componentes modulares, haciendo que la lógica sea más fácil de mantener y actualizar.
interface IModulo {
function calcular(uint a, uint b) external pure returns (uint);
}
contract Calculadora is IModulo {
function calcular(uint a, uint b) external pure override returns (uint) {
return a + b;
}
}
Cuando un contrato implementa una interfaz, debe proporcionar las definiciones completas de todas las funciones declaradas en la interfaz.
interface IOperaciones {
function sumar(uint a, uint b) external pure returns (uint);
function restar(uint a, uint b) external pure returns (uint);
}
contract Calculadora is IOperaciones {
function sumar(uint a, uint b) external pure override returns (uint) {
return a + b;
}
function restar(uint a, uint b) external pure override returns (uint) {
return a - b;
}
}
En este ejemplo:
IOperaciones
.
override
se utiliza para indicar que las funciones sobrescriben las declaradas en la interfaz.
1. Desacoplamiento: Permiten separar contratos en componentes independientes, facilitando la modularidad.
2. Interoperabilidad: Garantizan que los contratos puedan interactuar siguiendo estándares comunes.
3. Seguridad: Al no incluir lógica, reducen el riesgo de errores en la implementación inicial.
4. Eficiencia: Reducen la complejidad al interactuar con contratos externos, ya que no requieren la implementación completa.
1. Sin lógica: No pueden incluir implementaciones de funciones o constructores.
2. Uso restringido: No admiten variables de estado ni funciones que no sean external
.
3. Dependen del estándar: Si un contrato no sigue la interfaz definida, no se puede interactuar con él mediante esta.
1. Versiones de Solidity: Asegúrate de usar la misma versión de compilador para la interfaz y el contrato que la implementa.
2. Gas eficiente: Usa interfaces para minimizar el tamaño del contrato y ahorrar gas.
3. Cumple con los estándares: Implementa interfaces como ERC-20 o ERC-721 cuando crees contratos basados en estos estándares.
Para más información sobre interfaces, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer