Infraestructura y Almacenamiento
5 Gestión de almacenamiento y estado
El poder de Diamond viene con una gran restricción: todas las facetas comparten el almacenamiento. Para gestionar eso de forma segura, este repositorio utiliza librerías de almacenamiento.
Patrón de almacenamiento Diamond compartido
El patrón:
- Definir una
struct Layoutque contenga variables para un interés específico. - Fijar un depósito de almacenamiento (storage slot) mediante un hash constante
bytes32de una cadena única. - Proporcionar una función
layout()que devuelva una referencia de almacenamiento a ese diseño.
library SomeStorage {
bytes32 internal constant STORAGE_POSITION = keccak256("some.unique.storage.slot");
struct Layout {
uint256 value;
mapping(address => bool) allowed;
}
function layout() internal pure returns (Layout storage l) {
bytes32 position = STORAGE_POSITION;
assembly { l.slot := position }
}
}
Cómo las facetas acceden de forma segura al estado
Cada faceta con estado importa la librería de almacenamiento relevante y obtiene inmediatamente una referencia:
SomeStorage.Layout storage s = SomeStorage.layout();
Esto garantiza que cada interés (propiedad, loupe, índice, etc.) tenga su propio espacio de almacenamiento dedicado y que no se solape.
6 Runtime e Infraestructura
LibDiamond
Archivo: src/garden/libraries/LibDiamond.sol
Este es el núcleo de tiempo de ejecución (runtime kernel) para el Diamond. Posee el diseño de almacenamiento principal de Diamond (mapeo de selector a faceta) y proporciona funciones centrales para realizar cortes (cuts) y aplicar la propiedad.
Librerías de OpenZeppelin
Se utilizan intensamente para seguridad y estándares:
Ownable: Control de acceso.IERC20,IERC20Metadata: Interacciones con tokens.SafeERC20: Operaciones de transferencia seguras.Math,EnumerableSet: Operaciones matemáticas y de conjuntos de utilidad.
Qué es infraestructura frente a lógica de negocio
- Infraestructura: mecánicas como
LibDiamond, librerías de almacenamiento e interfaces DEX. No codifican reglas de protocolo. - Lógica de negocio: reglas para la construcción de índices, fijación de precios y reequilibrio.
Los constructores deben sentirse cómodos leyendo la infraestructura, pero ser cautos al cambiarla, ya que afecta a todo el sistema.
7 Cómo debe leer un constructor este repositorio
Si es nuevo en esta base de código, aquí tiene una ruta de lectura que coincide tanto con su diagrama como con el repositorio:
Paso 1 – Comenzar en el punto de entrada
src/garden/Garden.sol- Comprender:
- Que es un Diamond.
- Cómo enruta las llamadas usando
LibDiamond.
- Eche un vistazo al constructor para ver cómo se conectan las facetas iniciales.
- Comprender:
Paso 2 – Explorar las facetas base (núcleo)
src/garden/facets/baseFacets/ownership/*- Ver cómo se almacena y se aplica la propiedad.
src/garden/facets/baseFacets/cut/*y.../upgrade/*- Entender cómo funcionan los cortes (cuts) de diamante.
- Observar cómo se gestionan los selectores y las facetas.
src/garden/facets/baseFacets/loupe/*- Ver cómo se implementa la introspección.
En este punto sabrá:
“Quién es el dueño del Jardín, cómo se puede actualizar y cómo puedo descubrir sus capacidades.”
Paso 3 – Explorar las facetas de funciones
src/garden/facets/indexFacets/IIndex.sol- Observar el comportamiento externo: conectar, desconectar, reequilibrar, comprobar estado.
src/garden/facets/indexFacets/IndexBase.sol+IndexStorage.sol- Ver cómo:
- Extrae datos de registros y librerías matemáticas.
- Llama a utilidades DEX/GMX.
- Utiliza Chainlink para los precios.
- Ver cómo:
src/garden/facets/utilityFacets/arbitrumOne/*- Entender la lógica de ayuda de Uniswap / Camelot y GMX.
Aquí entenderá:
“Cómo una llamada de reequilibrio en el Jardín se convierte en un conjunto de operaciones / cambios de posición.”
Paso 4 – Explorar la capa de dominio
src/indices/Index.sol- Aprender qué es un índice en este protocolo.
src/indices/IndexFactory.sol- Ver cómo se despliegan y configuran los índices.
src/indices/IndexComponentRegistry.sol- Entender la lista blanca de tokens permitidos y los canales de precios (price feeds).
src/indices/IndexCalculationRegistry.sol- Ver cómo se registran y aplican las estrategias.
src/indices/libraries/IndexMath.sol- Inspeccionar las matemáticas que impulsan las ponderaciones y valoraciones.
Ahora sabrá:
“Qué es exactamente un índice, cómo está restringido y cómo se computan los valores.”
Paso 5 – Detalles de almacenamiento y tiempo de ejecución
- Librerías de almacenamiento:
DiamondLoupeStorage.solOwnershipStorage.solDiamondCutStorage.solIndexStorage.solGmxV2Storage.sol
src/garden/libraries/LibDiamond.sol
Aquí es donde consolidará su comprensión de cómo se distribuye el estado y cómo funciona internamente el Diamond. No necesita leer esto primero, pero debe leerlo antes de realizar cualquier cambio de bajo nivel.
Paso 6 – Integraciones externas y SBTs
src/interfaces/*IProtocolStatus.solICamelotRouterV3.solAggregatorV3Interface.solIERC173.sol
src/GardenSBT/CollectionRegistry/SBTRegistry.sol
Esta es la última capa: comprenderá cómo el protocolo se comunica con el mundo exterior y cómo encajan las funciones SBT.