orbit-db/README.md

282 lines
12 KiB
Markdown
Raw Normal View History

2017-12-31 09:45:05 +02:00
# OrbitDB
2015-12-26 19:05:51 +02:00
2019-01-04 16:22:41 -05:00
<p align="left">
2020-12-21 21:32:54 -06:00
<img src="images/orbit_db_logo_color.png" width="256" />
2019-01-04 16:16:49 -05:00
</p>
2021-12-09 20:50:23 -06:00
[![Matrix](https://img.shields.io/matrix/orbit-db:matrix.org?label=chat%20on%20matrix)](https://app.element.io/#/room/#orbit-db:matrix.org) [![CircleCI Status](https://circleci.com/gh/orbitdb/orbit-db.svg?style=shield)](https://circleci.com/gh/orbitdb/orbit-db) [![npm version](https://badge.fury.io/js/orbit-db.svg)](https://www.npmjs.com/package/orbit-db) [![node](https://img.shields.io/node/v/orbit-db.svg)](https://www.npmjs.com/package/orbit-db)
2016-08-09 16:56:51 +02:00
2021-12-09 21:08:33 -06:00
OrbitDB is a **serverless, distributed, peer-to-peer database**. OrbitDB uses [IPFS](https://ipfs.io) as its data storage and [IPFS Pubsub](https://github.com/ipfs/go-ipfs/blob/master/core/commands/pubsub.go#L23) to automatically sync databases with peers. It's an eventually consistent database that uses [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) for conflict-free database merges making OrbitDB an excellent choice for decentralized apps (dApps), blockchain applications and [local-first](https://www.inkandswitch.com/local-first/) web applications.
2015-12-26 19:05:51 +02:00
2021-04-12 10:13:04 -05:00
**Test it live at [Live demo 1](https://ipfs.io/ipfs/QmUsoSkGzUQnCgzfjL549KKf29m5EMYky3Y6gQp5HptLTG/), [Live demo 2](https://ipfs.io/ipfs/QmasHFRj6unJ3nSmtPn97tWDaQWEZw3W9Eh3gUgZktuZDZ/), or [P2P TodoMVC app](https://ipfs.io/ipfs/QmVWQMLUM3o4ZFbLtLMS1PMLfodeEeBkBPR2a2R3hqQ337/)**!
2016-06-08 16:43:09 +02:00
2016-06-08 16:44:39 +02:00
2018-07-12 15:07:30 -04:00
OrbitDB provides various types of databases for different data models and use cases:
2016-10-04 18:40:22 +02:00
2018-07-12 15:51:36 -04:00
- **[log](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdblognameaddress)**: an immutable (append-only) log with traversable history. Useful for *"latest N"* use cases or as a message queue.
2019-02-06 07:19:48 -08:00
- **[feed](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbfeednameaddress)**: a mutable log with traversable history. Entries can be added and removed. Useful for *"shopping cart"* type of use cases, or for example as a feed of blog posts or "tweets".
2018-07-12 15:51:36 -04:00
- **[keyvalue](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbkeyvaluenameaddress)**: a key-value database just like your favourite key-value database.
- **[docs](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbdocsnameaddress-options)**: a document database to which JSON documents can be stored and indexed by a specified key. Useful for building search indices or version controlling documents and data.
- **[counter](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbcounternameaddress)**: Useful for counting events separate from log/feed data.
2017-09-18 09:11:01 +02:00
2018-07-20 09:22:53 -04:00
All databases are [implemented](https://github.com/orbitdb/orbit-db-store) on top of [ipfs-log](https://github.com/orbitdb/ipfs-log), an immutable, operation-based conflict-free replicated data structure (CRDT) for distributed systems. If none of the OrbitDB database types match your needs and/or you need case-specific functionality, you can easily [implement and use a custom database store](https://github.com/orbitdb/orbit-db/blob/master/GUIDE.md#custom-stores) of your own.
2016-06-08 16:44:39 +02:00
2018-07-12 15:07:30 -04:00
#### Project status & support
* Status: **in active development**
2020-12-17 22:43:44 -05:00
* Compatible with **js-ipfs versions <= 0.52** and **go-ipfs versions <= 0.6.0**
2021-12-10 00:23:04 -06:00
***NOTE!*** *OrbitDB is **alpha-stage** software. It means OrbitDB hasn't been security audited and programming APIs and data formats can still change. We encourage you to [reach out to the maintainers](https://app.element.io/#/room/#orbit-db:matrix.org) if you plan to use OrbitDB in mission critical systems.*
2020-12-17 22:43:44 -05:00
This is the Javascript implementation and it works both in **Browsers** and **Node.js** with support for Linux, OS X, and Windows. LTS versions (even numbered versions 8, 10, etc) are supported.
To use with older versions of Node.js, we provide an ES5-compatible build through the npm package, located in `dist/es5/` when installed through npm.
2017-03-21 18:27:40 +01:00
2016-10-10 08:49:38 -04:00
## Table of Contents
<!-- toc -->
2016-10-10 08:49:38 -04:00
- [Usage](#usage)
2020-06-09 14:41:37 +02:00
* [Database browser UI](#database-browser-ui)
* [Module with IPFS Instance](#module-with-ipfs-instance)
* [Module with IPFS Daemon](#module-with-ipfs-daemon)
2016-10-10 08:49:38 -04:00
- [API](#api)
- [Examples](#examples)
* [Install dependencies](#install-dependencies)
* [Browser example](#browser-example)
* [Node.js example](#nodejs-example)
2019-12-07 06:14:42 +00:00
* [Workshop](#workshop)
2018-07-12 15:07:30 -04:00
- [Packages](#packages)
* [OrbitDB Store Packages](#orbitdb-store-packages)
2016-10-10 08:49:38 -04:00
- [Development](#development)
* [Run Tests](#run-tests)
* [Build](#build)
* [Benchmark](#benchmark)
* [Logging](#logging)
- [Frequently Asked Questions](#frequently-asked-questions)
2019-12-07 06:14:42 +00:00
* [Are there implementations in other languages?](#are-there-implementations-in-other-languages)
2016-10-10 08:49:38 -04:00
- [Contributing](#contributing)
- [Sponsors](#sponsors)
2016-10-10 08:49:38 -04:00
- [License](#license)
<!-- tocstop -->
2016-10-04 22:07:24 +02:00
## Usage
2016-11-02 13:50:15 +01:00
2019-10-08 11:30:02 +01:00
Read the **[GETTING STARTED](https://github.com/orbitdb/orbit-db/blob/master/GUIDE.md)** guide for a quick tutorial on how to use OrbitDB.
For a more in-depth tutorial and exploration of OrbitDB's architecture, please check out the **[OrbitDB Field Manual](https://github.com/orbitdb/field-manual)**.
2020-06-09 14:41:37 +02:00
### Database browser UI
OrbitDB databases can easily be managed using a web UI, see **[OrbitDB Control Center](https://github.com/orbitdb/orbit-db-control-center)**.
Install and run it locally:
```
git clone https://github.com/orbitdb/orbit-db-control-center.git
cd orbit-db-control-center/
npm i && npm start
```
2018-07-12 15:07:30 -04:00
### Module with IPFS Instance
2019-12-18 15:21:05 -06:00
If you're using `orbit-db` to develop **browser** or **Node.js** applications, use it as a module with the javascript instance of IPFS
2017-09-18 09:11:01 +02:00
Install dependencies:
2017-09-18 09:11:01 +02:00
2016-08-09 16:56:51 +02:00
```
2020-09-17 21:45:43 -04:00
npm install orbit-db ipfs
2016-08-09 16:56:51 +02:00
```
2016-07-26 11:45:12 +01:00
```javascript
const IPFS = require('ipfs')
2016-08-09 16:56:51 +02:00
const OrbitDB = require('orbit-db')
2021-12-09 21:08:33 -06:00
;(async function () {
const ipfs = await IPFS.create()
const orbitdb = await OrbitDB.createInstance(ipfs)
// Create / Open a database
2021-12-09 21:08:33 -06:00
const db = await orbitdb.log("hello")
await db.load()
// Listen for updates from peers
db.events.on("replicated", address => {
2021-12-09 21:08:33 -06:00
console.log(db.iterator({ limit: -1 }).collect())
})
// Add an entry
2021-12-09 21:08:33 -06:00
const hash = await db.add("world")
console.log(hash)
// Query
2021-12-09 21:08:33 -06:00
const result = db.iterator({ limit: -1 }).collect()
console.log(JSON.stringify(result, null, 2))
})()
2016-07-26 11:45:12 +01:00
```
2018-07-12 15:07:30 -04:00
### Module with IPFS Daemon
Alternatively, you can use [ipfs-http-client](https://www.npmjs.com/package/ipfs-http-client) to use `orbit-db` with a locally running IPFS daemon. Use this method if you're using `orbitd-db` to develop **backend** or **desktop** applications, eg. with [Electron](https://electron.atom.io).
2016-11-02 13:50:15 +01:00
2018-07-12 15:07:30 -04:00
Install dependencies:
2016-11-02 13:50:15 +01:00
2018-07-12 15:07:30 -04:00
```
2020-09-17 21:45:43 -04:00
npm install orbit-db ipfs-http-client
2018-07-12 15:07:30 -04:00
```
```javascript
2019-02-20 14:36:38 +00:00
const IpfsClient = require('ipfs-http-client')
2018-07-12 15:07:30 -04:00
const OrbitDB = require('orbit-db')
2019-02-20 14:36:38 +00:00
const ipfs = IpfsClient('localhost', '5001')
const orbitdb = await OrbitDB.createInstance(ipfs)
const db = await orbitdb.log('hello')
// Do something with your db.
2019-05-01 15:11:23 -04:00
// Of course, you may want to wrap these in an async function.
2018-07-12 15:07:30 -04:00
```
2016-10-10 08:49:38 -04:00
## API
See [API.md](https://github.com/orbitdb/orbit-db/blob/master/API.md) for the full documentation.
2018-07-12 15:07:30 -04:00
2016-02-26 13:39:51 +01:00
## Examples
2016-04-15 16:28:56 +02:00
### Install dependencies
2016-10-04 22:07:24 +02:00
```
2017-03-31 11:53:01 +02:00
git clone https://github.com/orbitdb/orbit-db.git
2016-10-04 22:07:24 +02:00
cd orbit-db
2016-07-31 11:11:33 +02:00
npm install
2016-10-04 22:07:24 +02:00
```
2018-07-12 15:07:30 -04:00
Some dependencies depend on native addon modules, so you'll also need to meet [node-gyp's](https://github.com/nodejs/node-gyp#installation) installation prerequisites. Therefore, Linux users may need to
```
2021-03-20 14:29:07 -05:00
make clean-dependencies && make deps
```
2018-07-12 15:07:30 -04:00
to redo the local package-lock.json with working native dependencies.
2016-10-04 22:07:24 +02:00
### Browser example
```
npm run build
2021-03-20 14:29:07 -05:00
npm run examples:browser
```
2021-03-20 14:29:07 -05:00
Using Webpack:
2016-10-04 22:07:24 +02:00
```
npm run build
2021-03-20 14:29:07 -05:00
npm run examples:browser-webpack
2016-04-15 16:28:56 +02:00
```
<p align="left">
<img src="https://raw.githubusercontent.com/orbitdb/orbit-db/master/images/example1.png" width="33%">
</p>
2016-10-04 22:07:24 +02:00
Check the code in [examples/browser/browser.html](https://github.com/orbitdb/orbit-db/blob/master/examples/browser/browser.html) and try the [live example](https://ipfs.io/ipfs/QmRosp97r8GGUEdj5Wvivrn5nBkuyajhRXFUcWCp5Zubbo/).
2016-10-04 22:07:24 +02:00
2016-10-04 18:40:22 +02:00
### Node.js example
2016-07-31 11:16:14 +02:00
2016-10-04 22:07:24 +02:00
```
2016-10-04 18:40:22 +02:00
npm run examples:node
2016-07-31 11:16:14 +02:00
```
<img src="https://raw.githubusercontent.com/orbitdb/orbit-db/master/images/orbit-db-demo3.gif" width="66%">
2016-10-04 22:07:24 +02:00
**Eventlog**
See the code in [examples/eventlog.js](https://github.com/orbitdb/orbit-db/blob/master/examples/eventlog.js) and run it with:
2016-10-04 22:07:24 +02:00
```
node examples/eventlog.js
2016-07-31 11:16:14 +02:00
```
### Workshop
2019-11-15 15:36:31 +00:00
We have a field manual which has much more detailed examples and a run-through of how to understand OrbitDB, at [orbitdb/field-manual](https://github.com/orbitdb/field-manual). There is also a workshop you can follow, which shows how to build an app, at [orbit-db/web3-workshop](https://github.com/orbitdb/web3-workshop).
More examples at [examples](https://github.com/orbitdb/orbit-db/tree/master/examples).
2016-04-15 15:53:17 +02:00
2018-07-12 15:07:30 -04:00
## Packages
2018-07-12 15:07:30 -04:00
OrbitDB uses the following modules:
2018-07-12 15:07:30 -04:00
- [ipfs](https://github.com/ipfs/js-ipfs)
- [ipfs-log](https://github.com/orbitdb/ipfs-log)
2018-07-19 08:54:33 -04:00
- [ipfs-pubsub-room](https://github.com/ipfs-shipyard/ipfs-pubsub-room)
2018-07-12 15:07:30 -04:00
- [crdts](https://github.com/orbitdb/crdts)
- [orbit-db-cache](https://github.com/orbitdb/orbit-db-cache)
2018-07-12 15:51:36 -04:00
- [orbit-db-pubsub](https://github.com/orbitdb/orbit-db-pubsub)
2019-02-20 14:36:38 +00:00
- [orbit-db-identity-provider](https://github.com/orbitdb/orbit-db-identity-provider)
- [orbit-db-access-controllers](https://github.com/orbitdb/orbit-db-access-controllers)
### OrbitDB Store Packages
2018-07-12 15:07:30 -04:00
- [orbit-db-store](https://github.com/orbitdb/orbit-db-store)
- [orbit-db-eventstore](https://github.com/orbitdb/orbit-db-eventstore)
- [orbit-db-feedstore](https://github.com/orbitdb/orbit-db-feedstore)
- [orbit-db-kvstore](https://github.com/orbitdb/orbit-db-kvstore)
- [orbit-db-docstore](https://github.com/orbitdb/orbit-db-docstore)
- [orbit-db-counterstore](https://github.com/orbitdb/orbit-db-counterstore)
2019-01-09 10:53:43 -05:00
Community-maintained Typescript typings are available here: https://github.com/orbitdb/orbit-db-types
2019-01-08 17:40:23 -05:00
2016-10-04 18:40:22 +02:00
## Development
2015-12-27 17:27:17 +02:00
### Run Tests
2016-10-04 22:07:24 +02:00
```
2016-10-04 18:40:22 +02:00
npm test
```
2016-02-12 09:27:57 +01:00
### Build
2016-10-04 22:07:24 +02:00
```
2016-10-04 18:40:22 +02:00
npm run build
```
2015-12-27 17:27:17 +02:00
### Benchmark
```
node benchmarks/benchmark-add.js
```
2018-07-12 15:33:28 -04:00
See [benchmarks/](https://github.com/orbitdb/orbit-db/tree/master/benchmarks) for more benchmarks.
2017-11-28 13:22:44 +01:00
### Logging
To enable OrbitDB's logging output, set a global ENV variable called `LOG` to `debug`,`warn` or `error`:
```
LOG=debug node <file>
```
2016-01-19 21:59:53 +08:00
## Frequently Asked Questions
We have an FAQ! [Go take a look at it](FAQ.md). If a question isn't there, open an issue and suggest adding it. We can work on the best answer together.
### Are there implementations in other languages?
2019-11-11 08:23:50 -05:00
Yes! Take a look at these implementations:
- Golang: [berty/go-orbit-db](https://github.com/berty/go-orbit-db)
- Python: [orbitdb/py-orbit-db-http-client](https://github.com/orbitdb/py-orbit-db-http-client)
2021-12-09 21:08:33 -06:00
The best place to find out what is out there and what is being actively worked on is likely by asking in the [Matrix](https://app.element.io/#/room/#orbit-db:matrix.org). If you know of any other repos that ought to be included in this section, please open a PR and add them.
2016-10-04 18:40:22 +02:00
## Contributing
**Take a look at our organization-wide [Contributing Guide](https://github.com/orbitdb/welcome/blob/master/contributing.md).** You'll find most of your questions answered there. Some questions may be answered in the [FAQ](FAQ.md), as well.
2019-02-05 12:10:19 -05:00
If you want to code but don't know where to start, check out the issues labelled ["help wanted"](https://github.com/orbitdb/orbit-db/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+sort%3Areactions-%2B1-desc).
2016-10-04 22:07:24 +02:00
## Sponsors
The development of OrbitDB has been sponsored by:
* [Haja Networks](https://haja.io)
* [Protocol Labs](https://protocol.ai/)
* [Maintainer Mountaineer](https://maintainer.io)
If you want to sponsor developers to work on OrbitDB, please reach out to [@haadcode](https://github.com/haadcode).
2016-10-04 18:40:22 +02:00
## License
2019-10-08 11:42:15 +01:00
[MIT](LICENSE) © 2015-2019 Protocol Labs Inc., Haja Networks Oy