This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
content:tech:rhizome [20/03/2013 18:37] Andrew Bettison [Rhizome applications] add sensor logger, improve other text |
content:tech:rhizome [21/02/2016 22:52] (current) Andrew Bettison Re-word [Technical documentation] section; remove link to GitHub (maintenance burden) |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Rhizome ====== | ====== Rhizome ====== | ||
- | **Rhizome** is a file distribution system developed by [[:|The Serval Project]] | + | **Rhizome** is a resilient content |
+ | |||
+ | ==== Technical documentation==== | ||
+ | |||
+ | **[[Rhizome | ||
+ | |||
+ | Other relevant information: | ||
+ | |||
+ | * [[Security Framework]] describes the cryptographic features of Rhizome | ||
+ | * [[: | ||
==== Purpose and features ==== | ==== Purpose and features ==== | ||
* Rhizome is a **[[http:// | * Rhizome is a **[[http:// | ||
- | * Rhizome is designed for [[http:// | + | * Rhizome is designed for [[http:// |
* Rhizome guarantees that payloads will remain intact wherever they are transported | * Rhizome guarantees that payloads will remain intact wherever they are transported | ||
* Rhizome makes no guarantees about delivery time or eventual arrival | * Rhizome makes no guarantees about delivery time or eventual arrival | ||
* Rhizome makes its best effort to transport payloads to wherever they are wanted, subject to the constraints of the network (topology, bandwidth) and its nodes (storage, battery), without favouring any payloads above others of equal kind | * Rhizome makes its best effort to transport payloads to wherever they are wanted, subject to the constraints of the network (topology, bandwidth) and its nodes (storage, battery), without favouring any payloads above others of equal kind | ||
- | * Rhizome is neutral with respect to originating and receiving nodes and applications | + | * Rhizome is neutral with respect to originating and receiving nodes, applications, and payload content |
- | * Rhizome uses cryptography to guarantee | + | * Rhizome uses cryptography to preserve |
* Rhizome protects anonymous senders by not storing or transmitting information that may allow senders to be traced, even on the originating device | * Rhizome protects anonymous senders by not storing or transmitting information that may allow senders to be traced, even on the originating device | ||
+ | * Rhizome functions without centralised infrastructure such as well-known servers or a persistent network connection | ||
+ | * Rhizome can be configured to use central servers to improve efficiency and reach | ||
==== Rhizome applications ==== | ==== Rhizome applications ==== | ||
* Users do not use Rhizome directly, but // | * Users do not use Rhizome directly, but // | ||
* Current Rhizome applications: | * Current Rhizome applications: | ||
- | * [[: | + | * [[MeshMS]], the simple text messaging service of the [[: |
* [[: | * [[: | ||
- | * the [[:content: | + | * the [[: |
- | * the file sharing service of the [[:content: | + | * the file sharing service of the [[: |
- | * [[: | + | * [[Serval SAM]] is a crowd survey app for Android that allows the user to fill in an [[http:// |
- | * [[: | + | * [[Sensor Logger]], an Android app produced by [[:content: |
* Future applications may include: | * Future applications may include: | ||
* voice mail | * voice mail | ||
Line 38: | Line 49: | ||
==== Rhizome' | ==== Rhizome' | ||
- | * Every Rhizome payload is accompanied by some structured meta data called a **manifest**: | + | Every file distributed by Rhizome |
- | * some meta data is supplied by the originating application, | + | |
- | * most meta data is created by Rhizome | + | A payload plus a [[Rhizome manifest|manifest]] together form a **[[Rhizome bundle]]**. |
- | * A manifest together with its payload is called a **bundle** | + | |
- | * A manifest may be present | + | ==== Rhizome' |
- | * A payload may be present | + | |
+ | * A **Rhizome node** | ||
+ | * A Rhizome | ||
+ | * Rhizome bundles are transferred between nodes automatically and autonomously, ie, without user intervention, using any available network connection | ||
+ | * A manifest may be stored | ||
+ | * A payload may be stored | ||
* A manifest may persist for any length of time on any node | * A manifest may persist for any length of time on any node | ||
* A payload may persist for any length of time on any node | * A payload may persist for any length of time on any node | ||
- | * Rhizome | + | * Each Rhizome |
- | * Rhizome does not modify any payload | + | |
- | * A bundle may indicate the [[: | + | |
- | * A payload may indicate the [[: | + | |
- | * Rhizome enforces a set of logical conditions on every bundle it receives from any source: | + | |
- | * certain fields must always be present | + | |
- | * each field must have a certain length and/or format | + | |
- | == Rhizome | + | == Rhizome |
- | The Rhizome | + | * A Rhizome |
+ | * A Rhizome store is a database containing payloads indexed by PH (Payload Hash) and manifests indexed by BID (Bundle ID) | ||
+ | * A Rhizome store may reside in volatile (RAM) or non-volatile (Flash, disk) local storage | ||
+ | * The original implementation of the Rhizome store used [[http:// | ||
- | The Rhizome | + | == Rhizome |
- | * Every Rhizome node uses the manifest fields it recognises and silently ignores those it does not | + | |
- | * Every Rhizome node preserves all manifest fields intact when it stores the manifest and when it transmits the manifest to other nodes | + | |
- | ==== Rhizome nodes ==== | + | * Every Rhizome |
+ | * Every Rhizome node attempts to fetch missing payloads from neighbouring nodes, in order of rank | ||
+ | * Every Rhizome node recovers local storage space by evicting its lowest ranked payloads | ||
+ | * A bundle' | ||
+ | * own Serval Identities | ||
+ | * Serval Identities of recently reachable | ||
+ | * current time | ||
+ | * current or recent geographic location | ||
- | * A **Rhizome | + | == Network connections == |
- | | + | |
- | | + | |
- | * Each Rhizome | + | * Adjacent |
- | | + | |
- | * Each Rhizome node attempts | + | |
- | * Each Rhizome node recovers local storage space by evicting its lowest ranked payloads and manifests | + | |
==== Neutrality ==== | ==== Neutrality ==== | ||
Line 80: | Line 95: | ||
* Rhizome does not rank (prioritise) based on the content of payloads | * Rhizome does not rank (prioritise) based on the content of payloads | ||
- | ==== Bundle integrity ==== | ||
- | * Rhizome creates a random 256-bit Elliptic Curve private key for every bundle, called the **Bundle Secret** or **BS** | ||
- | * The 256-bit public key derived from the Bundle Secret is called the **Bundle ID** or **BID** | ||
- | * Rhizome does not reveal the Bundle Secret to any other application or node | ||
- | * Rhizome computes the 512-bit SHA512 hash of the payload, called the **Payload Hash** or **PH** (also **File Hash** or **FH**) | ||
- | * At injection, Rhizome inserts the Payload Hash into the bundle' | ||
- | * Rhizome signs every complete manifest using the Bundle Secret | ||
- | * Rhizome nodes will only store and transmit manifests with valid signatures | ||
- | * Only an application possessing the original Bundle Secret can alter the manifest or payload | ||
- | |||
- | The net result of Rhizome' | ||
- | * any party may create a new bundle (with a new Bundle ID) | ||
- | * only the originating party may modify the manifest or payload of an existing bundle (keeping the same Bundle ID) | ||
- | * thus, once a bundle is created, all new payloads with the same Bundle ID are guaranteed to be from the same original sender | ||
- | |||
- | ==== Payload security ==== | ||
- | |||
- | * Rhizome can optionally **encrypt** a payload during injection with a one-way asymmetric cipher using the recipient' | ||
- | * Rhizome can optionally **encrypt** a payload during injection with a two-way session cipher constructed using the sender' | ||
- | * Rhizome will **decrypt** an encrypted payload during extraction if the node possesses the recipient' | ||
- | * The Payload Hash of an encrypted payload is the SHA512 hash of the encrypted form, not the clear text form | ||
- | |||
==== User intervention ==== | ==== User intervention ==== | ||
* Users may improve the local capacity of Rhizome by operating nodes with high storage capacity | * Users may improve the local capacity of Rhizome by operating nodes with high storage capacity | ||
* Users may improve the reach of Rhizome by periodically moving a node between distant locations | * Users may improve the reach of Rhizome by periodically moving a node between distant locations | ||
- | |||
- | ==== Network connections ==== | ||
- | |||
- | * Rhizome nodes may communicate using **[[http:// | ||
- | * Adjacent Rhizome nodes may communicate over **[[http:// | ||
==== Architecture ==== | ==== Architecture ==== | ||
- | Rhizome is currently implemented as part of the [[:content: | + | Rhizome is currently implemented as part of the [[: |
==== The name " | ==== The name " | ||
Line 121: | Line 109: | ||
Once a file is inserted into Rhizome, it can be notoriously difficult to eradicate. | Once a file is inserted into Rhizome, it can be notoriously difficult to eradicate. | ||
- | Curiously (but not coincidentally) some of the principles of the [[http:// | + | ==== Prototypes ==== |
+ | |||
+ | The [[Rhizome Retriever]] was the first prototype | ||