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: