-
Notifications
You must be signed in to change notification settings - Fork 0
OrbitDB
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.
Pubsub es un tipo de protocolo que apunta al envío de mensajes entre diferentes nodos.
- 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).
Existen dos implementaciones de este tipo de prototipo, y ambas pueden usarse con OrbitDB.
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 es una alternativa más reciente que crea una red más esparcida. [1]
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.
OrbitDB delega el tipo de almacenamiento a Helia, una implementación de IPFS en JS. [1]
- Blockstore
- Datastore
Ambas tienen el formato de dividir archivos en bloques, y son del estilo de key/value.
OrbitDB cuenta con distintos modelos de DB disponibles. Cada DB maneja solo un modelo.
Funciona como logging, solo appendea los valores, a los cuáles se acceden mediante hashing. Cada entry es inmutable.
- Funciones: add, get, iterator, all
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.
Igual a un diccionario/hash map.
- Funciones: put, del, get, iterator, all
Idem key/value pero indexado para queries más rápidas.
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'
}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.
Aplicación de mensajería trivial, que sirve para probar la conexión de dos clientes con una misma base de datos.

- 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/
Manual de OrbitDB: https://github.com/orbitdb/field-manual