This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
content:tech:rhizome [07/04/2013 19:26] Andrew Bettison [Purpose and features] neutral to payload content, encryption for privacy, decentralised |
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 the resilient | + | **Rhizome** is a resilient |
+ | ==== Technical documentation==== | ||
+ | |||
+ | **[[Rhizome API]]** contains links to the authoritative [[: | ||
+ | |||
+ | 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 | ||
Line 20: | Line 28: | ||
* 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 41: | 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 83: | 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 124: | 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 | ||