Saltar al contenido principal

Componentes Core

nota

Prerrequisitos: Antes de leer esto, debes haber elegido una modalidad de despliegue y entender los conceptos básicos de Solidity.

Público: Relevante para todos los desarrolladores.

Contexto de uso: Antes de comenzar cualquier desarrollo en ISBE.

Los Componentes Core son las capacidades fundamentales que heredan automáticamente todos los contratos desplegados en ISBE.

Visión General​

El Core agrupa las funcionalidades base del sistema:

  • Inicialización: Patrón seguro para proxies Diamond
  • Introspección: Detección de interfaces soportadas (ERC165)
  • Control de Acceso: Sistema RBAC integrado con DIDs
  • Propiedad: Gestión de propietario del contrato
  • Pausabilidad: Capacidad de pausa de emergencia
  • Utilidades: Validaciones y acceso a contexto blockchain

Todos estos componentes se agregan en DidDocumentDetailedInternal, que actúa como clase base universal.

DidDocumentDetailedInternal​

DidDocumentDetailedInternal agrega todas las capacidades Core. Todos los contratos ISBE heredan de DidDocumentDetailedInternal.

contract MiCasoDeUso is DidDocumentDetailedInternal {
// Tu contrato hereda automáticamente todas las capacidades Core
}

Inicialización de Proxies​

ISBE usa el patrón Diamond Proxy (EIP-2535). Los proxies no pueden usar constructores, por lo que el Core proporciona inicialización segura.

bytes32 constant BUSINESS_ID = keccak256("MiToken.business.id");

function initialize(string memory nombre)
external
initializer(BUSINESS_ID)
{
// Se ejecuta solo una vez por facet
}

Este BUSINESS_ID se utilizará en todo el ciclo de vida de la faceta.

El modificador initializer(_businessID) garantiza ejecución única y previene re-inicializaciones.

Introspección de Interfaces​

Implementa el estándar ERC165 para detección de interfaces. Permite consultar qué capacidades soporta un contrato:

bool soportaERC20 = contrato.supportsInterface(type(IERC20).interfaceId);

Los contratos registran automáticamente sus interfaces implementadas (ERC20, ERC721, AccessControl, etc.).

Control de Acceso (RBAC)​

Sistema de control de acceso basado en roles integrado con identidades descentralizadas (DIDs).

Protección de Funciones:

modifier onlyRole(bytes32 _role) {
_checkRole(_role);
_;
}

Gestión de Roles:

// Otorgar/revocar roles por dirección (EOA)
function _grantRole(bytes32 role, address account) internal;
function _revokeRole(bytes32 role, address account) internal;

// Otorgar/revocar roles por DID
function _grantDidRole(bytes32 role, bytes32 did) internal;
function _revokeDidRole(bytes32 role, bytes32 did) internal;

// Verificar roles
function _hasRole(bytes32 role, address account) internal view returns (bool);
function _hasDidRole(bytes32 role, bytes32 did) internal view returns (bool);

Ejemplo de Uso:

contract MiCasoDeUso is DidDocumentDetailedInternal {
bytes32 public constant OPERADOR_ROLE = keccak256("OPERADOR_ROLE");

function operar() external onlyRole(OPERADOR_ROLE) {
// Solo operadores pueden ejecutar
}
}

Nota: Los roles iniciales se configuran durante el despliegue del proxy (parámetros roles y members en deployUseCase). Las actualizaciones posteriores se realizan mediante AccessControlFacet (grantRole/revokeRole)

Integración DID: Los roles pueden asignarse tanto a direcciones Ethereum como a DIDs. Si una dirección tiene un DID asociado, se validan ambos automáticamente.

Gestión de Propiedad​

Mecanismo de propiedad única del contrato. Solo el propietario puede ejecutar funciones protegidas.

modifier onlyOwner() {
_checkOwner();
_;
}

Funciones:

function _owner() internal view returns (address);
function _transferOwnership(address newOwner) internal;

Pausabilidad​

Capacidad de pausar todas las operaciones del contrato en caso de emergencia.

modifier whenNotPaused() {
_requireNotPaused();
_;
}

Funciones:

function _paused() internal view returns (bool);
function _requireNotPaused() internal view;

Ejemplo:

function transfer(address to, uint256 amount) 
external
whenNotPaused
returns (bool)
{
// Bloqueado si el contrato está pausado
}

Todas las plantillas ISBE implementan pausabilidad automática en operaciones críticas.

Utilidades y Validaciones​

Funciones de contexto blockchain y validaciones comunes.

Contexto Blockchain:

function _blockTimestamp() internal view returns (uint256);
function _blockChainId() internal view returns (uint256);
function _msgSender() internal view returns (address);
function _msgSig() internal view returns (bytes4);

Validaciones:

// Validaciones de contenido
function _checkAddressIsNotZero(address addr) internal pure;
function _checkBytes32IsNotZero(bytes32 hash) internal pure;
function _checkEmptyBytes(bytes memory code) internal pure;
function _checkEmptyString(string memory str) internal pure;
function _checkUintIsNotZero(uint256 value) internal pure;

// Comparaciones
function _equalStrings(string memory a, string memory b) internal pure returns (bool);
function _equalBytes(bytes memory a, bytes memory b) internal pure returns (bool);

// Validación temporal
function _checkValidDates(uint256 before, uint256 after) internal pure;

Resumen Componentes Core​

ComponenteCapacidad
DidDocumentDetailedInternalClase base universal
Inicializacióninitializer(_businessID)
IntrospecciónsupportsInterface()
Control de AccesoonlyRole(), integración DID
PropiedadonlyOwner()
PausabilidadwhenNotPaused()
UtilidadesValidaciones y contexto blockchain

Al heredar de DidDocumentDetailedInternal, todos estos componentes están disponibles automáticamente.


Otros temas de la referencia técnica: