Skip to content

OrbitDB

Joaquin Velazquez edited this page Oct 22, 2024 · 3 revisions

Del README oficial de OrbitDB:

OrbitDB is a serverless, distributed, peer-to-peer database. OrbitDB uses IPFS as its data storage and Libp2p Pubsub to automatically sync databases with peers. It's an eventually consistent database that uses Merkle-CRDTs for conflict-free database writes and merges making OrbitDB an excellent choice for p2p and decentralized apps, blockchain applications and local-first web applications.

Nota: OrbitDB fue originalmente creada para una aplicación de mensajería descentralizada llamada Orbit, que ya no está activa.

Libp2p Pubsub

Pubsub es un tipo de protocolo que apunta al envío de mensajes entre diferentes nodos.

Claves

  • Los mensajes se envían a topics.
  • Un nodo puede estar suscrito a distintos topics.
  • Cuando un nodo "publica" un mensaje, eventualmente le llega a todos los nodos suscritos a ese topic.

Nota: un protocolo pubsub no se ocupa del descubrimiento de peers. Asume que el nodo ya está conectado a peers (igualmente lista una serie de posibles soluciones a esto).

Implementaciones

Existen dos implementaciones de este tipo de prototipo, y ambas pueden usarse con OrbitDB.

Floodsub

Todos los nodos de floodsub de un topic están conectados con todos, cada vez que un nodo publica un mensaje, se lo envía a todos los demás. (versión naive) Actualmente está depreciada, pero sirve para entender su sucesor.

Ventajas:

  • Rápido (poca latencia) Desventajas:
  • Inunda la red de mensajes, por lo que no escala bien`.

Gossipsub

Gossipsub es una alternativa más reciente que crea una red más esparcida. [1]

Conceptos básicos

Cada nodo tiene una lista de nodos full-message y nodos metadata-only. Además, cada nodo tiene una cantidad establecida de nodos vecinos de cada tipo.

  • Conexión full message: se envían todos los mensajes que llegan.
  • Conexión metadata only: se envían una lista de mensajes que tienen, y usan eso para pedir mensajes que no tengan.

Ventajas:

  • Escala mucho mejor ya que la cantidad de mensajes que maneja cada nodo se mantiene constante. Desventajas:
  • Un mensaje puede no tomar el camino más corto, lo que lleva a mayor latencia.

Nota: si un nodo se desconecta, los nodos vecinos pueden cambiar una conexión de full message a metadata only, y viceversa. Se conoce como grafting y pruning.

Almacenamiento

OrbitDB delega el tipo de almacenamiento a Helia, una implementación de IPFS en JS. [1]

Tipos de almacenamiento

  • Blockstore
  • Datastore

Ambas tienen el formato de dividir archivos en bloques, y son del estilo de key/value.

Tipos de base de datos

OrbitDB cuenta con distintos modelos de DB disponibles. Cada DB maneja solo un modelo.

Events

Funciona como logging, solo appendea los valores, a los cuáles se acceden mediante hashing. Cada entry es inmutable.

  • Funciones: add, get, iterator, all

Documents

Documentos, similar a MongoDB, maneja documentos guardados con una clave.

  • Funciones: add, del, get, query, iterator, all
  • Al agregar un documento con el mismo "_id", reemplaza el anterior en la DB.

Key/Value

Igual a un diccionario/hash map.

  • Funciones: put, del, get, iterator, all

Key/Value Indexed

Idem key/value pero indexado para queries más rápidas.

Metadata

Al crear una DB de OrbitDB, se le asigna una dirección, por ejemplo /orbitdb/zdpuAmrcSRUhkQcnRQ6p4bphs7DJWGBkqczSGFYynX6moTcDL

Esta dirección también es la dirección IPFS para el manifiesto de la DB, que se ve algo así:

{
  name: 'my-db',
  type: 'events',
  accessController: '/ipfs/zdpuB1TUuF5E81MFChDbRsZZ1A3Kz2piLJwKQ2ddnfZLEBx64'
}

Seguridad/Permisos

OrbitDB provee diferentes features para limitar el acceso a la escritura en una base de datos.

Identidades: una public key que maneja OrbitDB para autenticación. Cada cambio en una DB está firmada con esta key. Access Controllers: un objeto que define quien puede escribir la DB. Por defecto solo el creador de la DB puede, pero también se le puede pasar por parámetro otras identities, o una wildcard para que cualquiera pueda escribir.

Mas alla de las features, OrbitDB admite que la seguridad no es su fuerte, y recomiendan encriptar la información antes de añadirla a la DB.

Ejemplos

Aplicación de mensajería trivial, que sirve para probar la conexión de dos clientes con una misma base de datos.

render1729118004392


Alternativas

  • Gun DB: es standalone (no usa IPFS), pero sigue usando libp2p pubsub como mecanismo para replicar información. Supuestamente es mejor para aplicaciones en tiempo real (a chequear). [1]

https://docs.textile.io/threads/

  • ThreadDB: base de datos alternativa creada en IPFS.

https://docs.textile.io/threads/


Referencias

Manual de OrbitDB: https://github.com/orbitdb/field-manual

Clone this wiki locally