routing 0.3.0

A secured storage DHT failed to build routing-0.3.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure builds.
If you believe this is' fault, open an issue.
Visit the last successful build: routing-0.37.0


Primary Maintainer: Benjamin Bollen (

Secondary Maintainer: Peter Jankuliak (

Routing - a specialised storage DHT

Crate Linux ARM/Linux Windows OSX Coverage Issues
Build Status Build Status Build Status Build Status Coverage Status Stories in Ready
API Documentation - master branch SAFE Network System Documention MaidSafe website Safe Community site

#Important notice on 6 August 2015

The routing library is undergoing an important rewriting. The external API and the internal outlines have been laid out. The library is currently not in a functional state. To obtain the last functional state of Routing we refer to Routing version 0.2.8, as published on We expect it to be a few more days of work before routing will be published as version 0.3.1, the first expected functional version of the new routing API. The published version 0.3.0 should only be used by a user library to compile against, and prepare for the upcoming new interface.


A secured DHT, based on a kademlia-like implementation, but with some very stark differences. This is a recursive as opposed to iterative network, enabling easier NAT traversal and providing more efficient use of routers and larger networks. This also allows very fast reconfiguration of network changes, aleviating the requirement for a refresh algorithm. A recursive solution based on a network protocol layer that is 'connection oriented' also allows a close group to be aligned with security protocols.

This library makes use of Public-key cryptography to allow a mechanism to ensure nodes are well recognised and cryptographically secured. This pattern allows the creation of a DHT based PKI and this in turn allows a decentralised network to make use of groups as fixed in relation to any address. This is particularly useful in a continually fluid network as described here, creating a server-less and autonomous network.

This is a very under researched area. For a general introduction to some of the ideas behind the design related to XOR Space, watching The SAFE Network from First Principles series is recommended. The slides for XOR Distance Metric and Basic Routing lecture are also available here. The last video from the series on how the same ideas were applied to decentralised BitTorrent trackers is available here. A proper formalisation of the Routing algorithm is in progress.

###Pre-requisite: libsodium is a native dependency for sodiumxoide. Thus, install sodium by following the instructions here.

For windows, download and use the prebuilt mingw library. Extract and place the libsodium.a file in "bin\x86_64-pc-windows-gnu" for 64bit System, or "bin\i686-pc-windows-gnu" for a 32bit system.

##Todo Items

General note: please document code you touch, and introduce property-based unit tests where applicable.

RUST-3 Sprint tasks

[0.3.0] Unified Data

  • MAID-1158 Unified Data
    • MAID-1159 Implement PlainData
    • MAID-1160 Implement ImmutableData
    • MAID-1163 Implement StructuredData
    • MAID-1165 StructuredData::is_valid_successor
    • MAID-1166 Unit Tests for PlainData and ImmutableData
    • MAID-1167 Unit Tests for StructuredData
    • MAID-1168 Unit Test IsValidSuccessor for StructuredData
    • MAID-1171 Implement UnifiedData enum
    • MAID-1172 Update with UnifiedData: GetData and GetDataResponse
    • MAID-1173 Update with UnifiedData: PutData and PutDataResponse
    • MAID-1175 Update with UnifiedData: RoutingMembrane RoutingClient Put and Get
    • MAID-1176 Update with UnifiedData: Interfaces and churn
  • MAID-1179 Implement Post and PostResponse
  • MAID-1178 Enable Churn in Routing simple_key_value_store
  • MAID-1181 Integration test for routing
  • MAID-1170 Update RoutingClient and relay node: RoutingMessage
  • MAID-1251 Remove option first from routing node

Use public key for all messages

  • MAID-1255 RFC 0001 - Use public key for id on all messages

[0.3.1] Sentinel

  • MAID-1152 Implement Sentinels into Routing (group task)
    • MAID-1154 Implement PureSentinel in RoutingMembrane::handle_put_data
    • MAID-1157 Implement KeySentinel for FindGroupResponse messages
    • MAID-1164 Refactor RoutingMembrane::handle_put_data as preparation for adding PureSentinel
    • MAID-1169 Refactor RoutingMembrane::handle_{get,put}_data_response as preparation for use with PureSentinel
    • MAID-1180 Modify GetDataResponse and PutDataResponse to also contain source group keys
    • MAID-1182 Implement PureSentinel in RoutingMembrane::handle_put_data_response
    • MAID-1183 Implement PureSentinel in RoutingMembrane::handle_get_data_response
    • MAID-1194 Create test for from_group PUT messages
    • MAID-1196 Create test for from_group PUT response messages
    • MAID-1197 Create test for from_group GET response messages
    • MAID-1207 Implement PureSentinel for POST and DELETE messages

Future sprints

Note 2015-06-22: below tasks will be affected by proposed RFC: Remove Transaction Managers (view draft)

Old tasks for reference

  • MAID-1063 replace MessageTypeTag with full enum.
  • MAID-1065 Return Result for Put Get Post-
  • MAID-1042 Sentinel Reference document
    • MAID-1045 Instantiate pure Sentinel for PUT GET (POST) / from node & from group
    • MAID-1048 Instantiate Key Sentinel for FindGroupResponse
    • MAID-1049 Instantiate Account Sentinel for orderable Refresh / AccountTransfer messages
    • MAID-1046 break down (header, body) into correct (request, claim) and dispatch
    • update signature of handler functions to request and claim
    • MAID-1051 update construction of message_header
    • MAID-1050 block messages at filter once Sentinel has resolved