Internet se está volviendo cada vez más centralizado. A medida que las empresas y los individuos dependen cada vez más de los proveedores de nube centralizados para el almacenamiento, las preocupaciones críticas sobre la privacidad, la censura y el control del usuario, así como sobre la concentración del poder económico en manos de unas pocas entidades, se vuelven más pronunciadas.
Si bien ha habido varios intentos de proporcionar alternativas, las redes de almacenamiento descentralizadas (DSN) modernas a menudo no cumplen con aspectos básicos, como tener sólidas garantías de durabilidad, ser eficientes para operar o proporcionar pruebas escalables de almacenamiento. Esto, a su vez, conduce a soluciones que son: i) no útiles, ya que pueden perder datos; ii) no amigables con la descentralización, ya que requieren hardware especializado o costoso; o iii) económicamente inviables, ya que sobrecargan a los proveedores con demasiados costos más allá de los del hardware de almacenamiento en sí.
En este artículo, presentamos Codex, una novedosa Red de Almacenamiento Descentralizada con Codificación de Borrado que intenta abordar esos problemas. Codex aprovecha la codificación de borrado como parte tanto de la redundancia como de las pruebas de almacenamiento, combinándola con pruebas de conocimiento cero y reparación diferida para lograr garantías de durabilidad ajustables, al tiempo que es modesta en cuanto a los requisitos de hardware y energía. Un concepto central de Codex es el Motor de Durabilidad Descentralizado (DDE), un marco que formalizamos para abordar sistemáticamente la redundancia de datos, la auditoría remota, la reparación, los incentivos y la dispersión de datos en los sistemas de almacenamiento descentralizados.
Describimos la arquitectura y los mecanismos de Codex, incluido su mercado y sus sistemas de prueba, y proporcionamos un análisis preliminar de la confiabilidad utilizando un modelo de Cadena de Markov de Tiempo Continuo (CTMC) para evaluar las garantías de durabilidad. Codex representa un paso hacia la creación de una capa de almacenamiento descentralizada, resiliente y económicamente viable que es fundamental para el ecosistema descentralizado más amplio.
## 1. Introducción
La producción de datos ha estado creciendo a un ritmo asombroso, con importantes implicaciones. Los datos son un activo crítico para las empresas, impulsando la toma de decisiones, la planificación estratégica y la innovación. Los individuos entrelazan cada vez más sus vidas físicas con el mundo digital, documentando meticulosamente cada aspecto de sus vidas, tomando fotos y videos, compartiendo sus puntos de vista y perspectivas sobre los acontecimientos actuales, utilizando medios digitales para la comunicación y la expresión artística, etc. Las identidades digitales se han vuelto tan importantes como sus contrapartes físicas, y esta tendencia solo está aumentando.
Sin embargo, la tendencia actual hacia la centralización en la web ha llevado a una situación en la que los usuarios tienen poco o ningún control sobre sus datos personales y cómo se utilizan. Las grandes corporaciones recopilan, analizan y monetizan los datos de los usuarios, a menudo sin consentimiento ni transparencia. Esta falta de privacidad deja a las personas vulnerables a la publicidad dirigida, la creación de perfiles, la vigilancia y el posible uso indebido de su información personal.
Además, la concentración de datos y poder en manos de unas pocas entidades centralizadas crea un riesgo significativo de censura: las plataformas pueden decidir unilateralmente eliminar, modificar o suprimir contenido que consideren indeseable, limitando efectivamente la libertad de expresión y el acceso a la información de los usuarios. Este desequilibrio de poder socava la naturaleza abierta y democrática de Internet, creando cámaras de eco y restringiendo el libre flujo de ideas.
Otro aspecto indeseable de la centralización es económico: a medida que el dominio de las grandes empresas tecnológicas en este espacio evoluciona hacia un oligopolio, todos los ingresos fluyen hacia las manos de unos pocos seleccionados, mientras que la barrera de entrada se vuelve cada vez más alta..
Para abordar estos problemas, existe una necesidad creciente de tecnologías descentralizadas. Las tecnologías descentralizadas permiten a los usuarios: i) poseer y controlar sus datos al proporcionar mecanismos seguros y transparentes para el almacenamiento y el intercambio de datos, y ii) participar en la economía del almacenamiento como proveedores, permitiendo a los individuos y organizaciones tomar su parte de los ingresos. Los usuarios pueden optar por compartir selectivamente sus datos con terceros de confianza, conservar la capacidad de revocar el acceso cuando sea necesario y monetizar sus datos y su hardware si así lo desean. Este cambio de paradigma hacia la propiedad de datos e infraestructura centrada en el usuario tiene el potencial de crear un ecosistema digital más equitativo y transparente.
A pesar de sus beneficios potenciales, sin embargo, la falta de almacenamiento descentralizado eficiente y confiable deja una brecha clave que debe abordarse antes de que se pueda contemplar seriamente cualquier noción de una pila de tecnología descentralizada.
En respuesta a estos desafíos, presentamos Codex: una novedosa Red de Almacenamiento Descentralizada con Codificación de Borrado que se basa en la codificación de borrado para la redundancia y las pruebas eficientes de almacenamiento. Este método proporciona una confiabilidad sin igual y permite el almacenamiento de grandes conjuntos de datos, más grandes que cualquier nodo individual en la red, de una manera duradera y segura. Nuestras pruebas de almacenamiento compactas y eficientes pueden detectar y prevenir la pérdida catastrófica de datos con gran precisión, al tiempo que incurren en requisitos de hardware y electricidad relativamente modestos – dos condiciones previas para lograr una verdadera descentralización. Además, introducimos y formalizamos en este artículo la noción de durabilidad en las redes de almacenamiento descentralizadas a través de un nuevo concepto que llamamos el Motor de Durabilidad Descentralizado (DDE).
El resto de este artículo está organizado de la siguiente manera. Primero, discutimos el contexto en el que se construye Codex (Sec. 2) mediante la ampliación de los problemas de almacenamiento en la nube centralizado, y proporcionando información básica sobre los enfoques previos a las alternativas descentralizadas - en concreto, las redes p2p, blockchains, y DSNs. Luego, introducimos el marco conceptual que sustenta Codex en la Sec. 3 - el Motor de Durabilidad Descentralizado (DDE) - seguido de una descripción más detallada de los mecanismos detrás de Codex y cómo se materializa como un DDE en la Sec. 4. Sec. 5, a continuación, presenta un análisis de fiabilidad preliminar, que sitúa los parámetros de almacenamiento de Codex junto con mayores garantías de durabilidad formales. Finalmente, la Sec. 6 proporciona las conclusiones y el trabajo en curso.
## 2. Antecedentes y Contexto
Codex pretende ser una alternativa útil y descentralizada para el almacenamiento centralizado. En esta sección, se analiza el contexto en el que surge esta necesidad, así como por qué los enfoques anteriores y actuales para la construcción y el razonamiento sobre el almacenamiento descentralizado resultaron incompletos. Esto sentará las bases para nuestra introducción del Motor de Durabilidad Descentralizado - nuestro enfoque para el razonamiento sobre el almacenamiento descentralizado - en la Sec. 3.
### 2.1. Almacenamiento en la Nube Centralizado
Durante las últimas dos décadas, el almacenamiento en la nube centralizado se ha convertido en el enfoque de facto para los servicios de almacenamiento en Internet, tanto para particulares como para empresas. De hecho, una investigación reciente sitúa el porcentaje de empresas que dependen de al menos un proveedor de servicios en la nube en el $94%$ [^zippia_cloud_report], mientras que la mayoría de los smartphones modernos realizan copias de seguridad de sus contenidos en un proveedor de almacenamiento en la nube de forma predeterminada.
El atractivo es claro: escalable, fácil de utilizar el almacenamiento elástico y la conexión en red junto con un modelo flexible de pago por uso y un fuerte enfoque en la durabilidad [^s3_reinvent_19] que se traduce en una infraestructura fiable que está disponible de inmediato y en la escala exacta requerida.
La centralización, sin embargo, conlleva una larga lista de inconvenientes, la mayoría de ellos debidos a tener un único actor en el control de todo el sistema. Esto coloca efectivamente a los usuarios a merced de los intereses comerciales del actor controlador, que puede que no coincidan con los intereses del usuario respecto a la forma en que se utilizan sus datos, así como su capacidad para permanecer a flote frente a la adversidad natural, política o económica. La intervención del gobierno y la censura son también importantes fuentes de preocupación [^liu_19]. Las organizaciones más grandes son muy conscientes de estos riesgos, con un $98%$ de los usuarios empresariales de la nube que adoptan entornos multi-nube para mitigarlos [^multicloud].
El último inconveniente es económico: ya que muy pocas empresas pueden proveer actualmente estos servicios a la escala y la calidad necesarias, los miles de millones de gasto de los clientes se canalizan a los bolsillos de un puñado de individuos. Oligopolios como estos pueden descarrilar a un mercado no competitivo que encuentra su equilibrio en un punto de precio que no está necesariamente en el mejor interés de los usuarios finales [^feng_14].
### 2.2. Alternativas Descentralizadas: Pasado y Presente
Teniendo en cuenta los inconvenientes del almacenamiento centralizado en la nube, es natural preguntarse si podría haber alternativas; y, de hecho, estos han sido investigados ampliamente desde principios de la década de 2000. No vamos a intentar cubrir todo ese espacio aquí, y en su lugar nos centraremos en lo que consideramos que son los tres principales avances tecnológicos que se produjeron en los sistemas descentralizados en estas últimas dos décadas, y por qué no han logrado avances significativos hasta el momento: Redes P2P, blockchains, y Redes de Almacenamiento de Datos (DSNs).
**Redes P2P.** Las redes P2P han existido durante más de dos décadas. Su premisa es que los usuarios pueden ejecutar software cliente en sus propias máquinas y formar una red autoorganizada que permite compartir recursos como ancho de banda, computación y almacenamiento para proporcionar servicios de nivel superior como búsqueda o intercambio de archivos descentralizado sin la necesidad de un actor controlador centralizado.
Las primeras redes como BitTorrent[^cohen_01], sin embargo, solo tenían incentivos rudimentarios basados en una forma de economía de trueque en la que los nodos que proporcionaban bloques a otros nodos serían recompensados con acceso a más bloques. Esto proporciona algunos incentivos básicos para que los nodos intercambien los datos que poseen, pero si un nodo decide o no mantener una determinada pieza de datos depende de si el operador del nodo estaba interesado en esos datos para empezar; es decir, un nodo probablemente no descargará una película si no está interesado en verla.
Por lo tanto, los archivos que no son populares tienden a desaparecer de la red, ya que nadie está interesado en ellos, y no hay forma de incentivar a los nodos para que hagan lo contrario. Esta falta de incluso garantías básicas de durabilidad significa que BitTorrent y, de hecho, la mayoría de las primeras redes de intercambio de archivos P2P, son adecuadas como redes de distribución en el mejor de los casos, pero no como redes de almacenamiento, ya que los datos pueden, y probablemente lo harán, perderse eventualmente. Incluso los intentos más recientes de intercambio de archivos descentralizado como IPFS[^ipfs_website] sufren de deficiencias similares: por defecto, IPFS no ofrece garantías de durabilidad, es decir, no hay forma de castigar a un servicio de pinning si no mantiene los datos disponibles.
**Blockchains.** Las blockchains se introdujeron como parte de Bitcoin en 2008[^nakamoto_08], y el siguiente actor principal, Ethereum[^buterin_13], entró en funcionamiento en 2013. Una blockchain consta de una serie de bloques, cada uno de los cuales contiene una lista de transacciones. Estos bloques están vinculados entre sí en orden cronológico a través de hashes criptográficos. Cada bloque contiene un hash del bloque anterior, lo que asegura la cadena contra la manipulación. Esta estructura asegura que una vez que se agrega un bloque a la blockchain, la información que contiene no se puede alterar sin rehacer todos los bloques subsiguientes, lo que la hace segura contra el fraude y las revisiones. Para todos los propósitos prácticos, una vez que se agrega un bloque, ya no se puede eliminar.
Esta permanencia aliada a la naturaleza totalmente replicada de la blockchain significa que proporciona garantías de durabilidad y disponibilidad muy sólidas, y esto se ha reconocido desde muy temprano. El modelo de replicación completa de las blockchains, sin embargo, también resulta ser lo que las hace poco prácticas para el almacenamiento de datos: en la fecha de esta redacción, almacenar tan solo un gigabyte de datos en una cadena como Ethereum sigue siendo prohibitivamente caro[^kostamis_24].
Las blockchains representan, sin embargo, una adición revolucionaria a los sistemas descentralizados, ya que permiten a los diseñadores de sistemas construir mecanismos de incentivos mucho más sólidos y complejos basados en economías monetarias, e implementar mecanismos clave como la seguridad criptoeconómica[^chaudhry_24] a través del slashing, que simplemente no eran posibles antes.
**Redes de Almacenamiento Descentralizadas (DSNs).** Las Redes de Almacenamiento Descentralizadas (DSNs) representan un paso natural en el almacenamiento descentralizado: al combinar la tecnología P2P tradicional con los sólidos mecanismos de incentivos que ofrecen las blockchains modernas y las nuevas primitivas criptográficas, proporcionan una visión mucho más creíble del almacenamiento descentralizado.
Al igual que las primeras redes P2P, las DSN consolidan las capacidades de almacenamiento de varios proveedores independientes y orquestan los servicios de almacenamiento y recuperación de datos para los clientes. A diferencia de las primeras redes P2P, sin embargo, las DSN emplean los mecanismos mucho más sólidos que ofrecen las blockchains para incentivar el funcionamiento correcto. Normalmente emplean técnicas de auditoría remota como pruebas de conocimiento cero para responsabilizar a los participantes, junto con mecanismos de staking/slashing que infligen pérdidas monetarias a los participantes malos cuando son atrapados.
En su artículo seminal[^protocol_17], el equipo de Filecoin caracteriza una DSN como una tupla $\Pi = \left(\text{Put}, \text{Get}, \text{Manage}\right)$, donde:
* $\text{Put(data)} \rightarrow \text{key}$: Los clientes ejecutan el protocolo Put para almacenar datos bajo una clave identificadora única.
* $\text{Get(key)} \rightarrow \text{data}$: Los clientes ejecutan el protocolo Get para recuperar los datos que están almacenados actualmente utilizando la clave.
* $\text{Manage()}$: La red de participantes se coordina a través del protocolo Manage para: controlar el almacenamiento disponible, auditar el servicio ofrecido por los proveedores y reparar posibles fallas. El protocolo Manage es ejecutado por los proveedores de almacenamiento, a menudo en conjunto con los clientes o una red de auditores.
Si bien es útil, argumentamos que esta definición es incompleta, ya que traslada una serie de elementos clave a un protocolo/primitiva de caja negra no especificada llamada $\text{Manage}()$. Estos incluyen:
* mecanismos de incentivos y slashing;
* protocolos de auditoría remota y reparación;
* estrategias para la redundancia y dispersión de datos.
Tales elementos son de particular importancia cuando uno intenta razonar sobre lo que se requeriría para construir una DSN que proporcione utilidad real. Al comenzar a diseñar Codex y hacernos esa pregunta, descubrimos que la clave para las DSN útiles está en la durabilidad; es decir, un sistema de almacenamiento sólo es útil si puede proporcionar garantías de durabilidad que se puedan razonar.
En la siguiente sección, exploramos una construcción que llamamos Decentralized Durability Engines (Motores de Durabilidad Descentralizados), que, argumentamos, conducen a un enfoque más fundamentado para diseñar sistemas de almacenamiento que proporcionen utilidad.
## 3. Motores de Durabilidad Descentralizados (DDE)
Un Motor de Durabilidad Descentralizado es una tupla $\Gamma = \text{(R, A, P, I, D)}$ donde:
* $R$ es un conjunto de mecanismos de redundancia, como la codificación de borrado y la replicación, que garantizan la disponibilidad de los datos y la tolerancia a fallos.
* $A$ es un conjunto de protocolos de auditoría remota que verifican la integridad y la disponibilidad de los datos almacenados.
* $P$ es un conjunto de mecanismos de reparación que mantienen el nivel deseado de redundancia y la integridad de los datos mediante la detección y corrección de la corrupción y la pérdida de datos.
* $I$ es un conjunto de mecanismos de incentivos que alientan a los nodos a comportarse de manera honesta y fiable, recompensando el buen comportamiento y penalizando las acciones maliciosas o negligentes.
* $D$ es un conjunto de algoritmos de dispersión de datos que distribuyen estratégicamente los fragmentos de datos en múltiples nodos para minimizar el riesgo de pérdida de datos debido a fallos localizados y para mejorar la disponibilidad y la accesibilidad de los datos.
Argumentamos que, al diseñar un sistema de almacenamiento que pueda conservar los datos, ninguno de estos elementos es opcional. Los datos deben ser redundantes ($R$), debe haber una manera de detectar fallos y comportamientos indebidos ($A$), debemos ser capaces de reparar los datos para que no se pierdan debido a la acumulación de fallos ($P$), los nodos que se comportan mal deben ser penalizados ($I$) y los datos deben colocarse de manera que se comprenda la correlación de fallos ($D$).
Este es un tratamiento un tanto informal por ahora, pero los parámetros reales que se ingresarían en cualquier análisis de fiabilidad de un sistema de almacenamiento dependerían de esas elecciones. En una publicación futura, exploraremos cómo la elección de cada uno de estos elementos afecta la durabilidad en un marco formal.
## 4. Codex: Un Motor de Durabilidad Descentralizado
Esta sección describe cómo funciona realmente Codex. La motivación principal detrás de Codex es proporcionar una solución de almacenamiento descentralizada escalable y robusta que aborde las limitaciones de las DSN existentes. Esto incluye: i) garantías de durabilidad mejoradas que se pueden razonar, ii) escalabilidad y rendimiento y iii) descentralización y resistencia a la censura.
Comenzamos esta sección exponiendo los conceptos clave necesarios para comprender cómo funciona Codex (Sec. 4.1). Luego, analizamos la redundancia ($R$), la auditoría remota ($A$) y los mecanismos de reparación ($P$) de Codex y cómo combinan los códigos de borrado y las pruebas de conocimiento cero en un sistema que es ligero, eficiente y susceptible a la descentralización. La Sec. 4.4 se desvía hacia la capa de red y proporciona una visión general de nuestros protocolos escalables de transferencia de datos. Finalmente, los incentivos ($I$) y la dispersión ($D$) se discuten en la Sec. 4.5 como parte del mercado de Codex.
### 4.1. Conceptos
En el contexto de Codex (y de los sistemas de almacenamiento en general), dos propiedades aparecen como fundamentales:
Disponibilidad. Se dice que un sistema está disponible cuando es capaz de proporcionar el servicio previsto, y no disponible en caso contrario. La disponibilidad de un sistema durante un intervalo de tiempo dado viene dada por [^tanembaum]:
$$
p_\text{avail} =\frac{t_a}{t_a + t_u}
$$
donde $t_a$ y $t_u$ son los tiempos totales en los que el sistema permaneció disponible y no disponible, respectivamente. Para mantener una alta disponibilidad, un sistema de almacenamiento necesita ser tolerante a fallos; es decir, debería ser capaz de atender correctamente las solicitudes de almacenamiento y recuperación en presencia de fallos de hardware y participantes maliciosos.
**Durabilidad.** Cuantificada como una probabilidad $p_\text{dur} = 1 - p_\text{loss}$ de que una unidad de datos dada no se pierda durante un período de tiempo dado; por ejemplo, la probabilidad de que algún archivo no se pierda en un período de 1 año. Esta probabilidad a veces se expresa como un porcentaje (por ejemplo, en S3).
Si este número es muy cercano a uno, por ejemplo, $p_\text{loss} \leq 10^{-6}$, entonces se dice que el sistema es altamente duradero. Los sistemas que no son altamente duraderos son aquellos que pueden perder datos con una probabilidad mayor o ilimitada, o que no cuantifican en absoluto sus probabilidades de pérdida.
Idealmente, nos gustaría que los sistemas de almacenamiento fueran altamente disponibles y altamente duraderos. Dado que lograr la disponibilidad demostrable no es posible en general[^bassam_18], Codex se centra en garantías más sólidas para la durabilidad y en incentivar la disponibilidad en su lugar.
**Conjunto de datos.** Un conjunto de datos $D = {c_1, \cdots c_b}$ se define en Codex como un conjunto ordenado de $b \in \mathbb{N}$ bloques de tamaño fijo. Los bloques suelen ser pequeños, del orden de $64\text{kB}$. A todos los efectos, se puede pensar en un conjunto de datos como un archivo normal.
**Cliente de almacenamiento (SC).** Un cliente de almacenamiento es un nodo que participa en la red Codex para comprar almacenamiento. Estos pueden ser individuos que buscan hacer una copia de seguridad del contenido de sus discos duros, u organizaciones que buscan almacenar datos comerciales.
**Proveedor de almacenamiento (SP).** Un proveedor de almacenamiento es un nodo que participa en Codex vendiendo espacio en disco a otros nodos.
### 4.2. Visión general
A un alto nivel, el almacenamiento de datos en Codex funciona de la siguiente manera. Siempre que un SC desea almacenar un conjunto de datos $D$ en Codex, este:
1. divide $D$ en $k$ particiones disjuntas ${S_1, \cdots, S_k}$ denominadas slots, donde cada slot contiene $s = \left\lceil \frac{b}{k} \right\rceil$ bloques;
2. codifica con borrado $D$ con un código Reed-Solomon[^reed_60] extendiéndolo a un nuevo conjunto de datos $D_e$ que añade un extra de $m \times s$ bloques de paridad a $D$ (Sec. 4.3). Esto añade efectivamente $m$ nuevos slots al conjunto de datos. Como utilizamos un código sistemático, $D$ sigue siendo un prefijo de $D_e$;
3. calcula dos raíces de árbol Merkle diferentes: una utilizada para las pruebas de inclusión durante el intercambio de datos, basada en SHA256, y otra para las pruebas de almacenamiento, basada en Poseidon2 (Sec 4.3);
4. genera un manifiesto direccionable por contenido para $D_e$ y lo anuncia en el Codex DHT (Sec. 4.4);
5. publica una solicitud de almacenamiento que contiene un conjunto de parámetros en el mercado de Codex (en la cadena), que incluye cosas como cuánto está dispuesto a pagar el SC por el almacenamiento, así como las expectativas que pueden afectar la rentabilidad de los SP candidatos y las garantías de durabilidad para $D_e$, para cada slot (Sec. 4.5).
El mercado de Codex (Sec. 4.5) luego asegura que los SP dispuestos a almacenar datos para una solicitud de almacenamiento determinada tengan una oportunidad justa de hacerlo. Eventualmente, para cada slot $S_i \in D_e$, algún SP:
1. declara su interés en él presentando una reserva de slot;
2. descarga los datos para el slot desde el SC;
3. proporciona una prueba inicial de almacenamiento y alguna garantía de staking para ello.
Una vez que este proceso se completa, decimos que el slot $S_i$ ha sido completado. Una vez que todos los slots en $D_e$ han sido completados, decimos que $D_e$ ha sido cumplido. Para el resto de esta sección, profundizaremos en la arquitectura y los mecanismos de Codex explicando con más detalle cada aspecto del flujo de almacenamiento.
### 4.3. Codificación de Borrado, Reparación y Pruebas de Almacenamiento
a codificación de borrado desempeña dos funciones principales en Codex: i) permitir que los datos se recuperen tras la pérdida de uno o más SP y los slots que poseen (redundancia) y ii) permitir pruebas de almacenamiento rentables. Revisaremos cada uno de estos aspectos por separado.
**Codificación de Borrado para la Redundancia.** Como se describió antes, un conjunto de datos $D$ se divide inicialmente en $k$ slots de tamaño $s = \left\lceil \frac{b}{k} \right\rceil$ (Figura 1). Dado que $b$ puede no ser realmente divisible por $k$, Codex añadirá bloques de relleno según sea necesario para que el número de bloques en $D$ sea $b_p = s \times k$.