Skip to content
A C++14 Distributed Hash Table implementation
C++ Python C Rust M4 CMake Other
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/workflows github: disable tests and examples when building asio Dec 12, 2019
MSVC msvc: fix compilation with VS 2019 16.0 Sep 18, 2019
argon2 @ 62358ba update argon2 Dec 2, 2019
c c wrapper: add dht_privatekey_export Dec 5, 2019
cmake http: implement secure connection Aug 7, 2019
doc build/autoconf: always build doc Makefile Dec 2, 2019
docker docker: build asio without tests and examples Dec 12, 2019
include proxy server: always depend on jsoncpp Dec 12, 2019
m4 autotools: update to C++14 Nov 27, 2019
python dht: allow to configure rate limiter Nov 7, 2019
resources opendht: add logo Sep 1, 2016
rust rust: infohash support == operator and from hex Oct 31, 2019
src cpp: include config.h when necessary Dec 12, 2019
tests cmake: make peer discovery build optional Dec 9, 2019
tools tools: add missing include Dec 12, 2019
.clang-tidy build: add clang-tidy configuration Mar 17, 2019
.gitignore gitignore: ignore files from vscode, eclipse Apr 8, 2019
.gitmodules Merge pull request #175 from sim590/argon2-submodule Mar 30, 2017
.travis.yml travis: update to xenial Nov 26, 2018
CMakeLists.txt dhtrunner: fix build without peer discovery Dec 11, 2019
COPYING Initial commit Nov 20, 2014
Makefile.am build/autoconf: always build doc Makefile Dec 2, 2019
README.md Update README.md Oct 22, 2019
autogen.sh Merge pull request #175 from sim590/argon2-submodule Mar 30, 2017
configure.ac configure: cleanup Dec 12, 2019
opendht-c.pc.in c wrapper: add pkg-config file Oct 16, 2019
opendht.pc.in pkg-config: add argon2 dependency when not using included version Jun 18, 2017

README.md


OpenDHT

A lightweight C++14 Distributed Hash Table implementation.

OpenDHT provides an easy to use distributed in-memory data store. Every node in the network can read and write values to the store. Values are distributed over the network, with redundancy.

  • Lightweight and scalable, designed for large networks and small devices
  • High resilience to network disruption
  • Public key cryptography layer providing optional data signature and encryption (using GnuTLS)
  • IPv4 and IPv6 support
  • Clean and powerful C++14 map API
  • Python 3 bindings
  • REST API

Documentation

See the wiki: https://github.com/savoirfairelinux/opendht/wiki

How-to build and install

Build instructions: https://github.com/savoirfairelinux/opendht/wiki/Build-the-library

How-to build a simple client app

g++ main.cpp -std=c++14 -lopendht -lgnutls

Examples

C++ example

The tools directory includes simple example programs :

  • dhtnode, a command line tool, allowing to run a DHT node and perform operations supported by the library (get, put etc.) with text values.
  • dhtchat, a very simple IM client working over the dht.

Example program launching a DHT node, connecting to the network and performing some basic operations:

#include <opendht.h>
#include <vector>

int main()
{
    dht::DhtRunner node;

    // Launch a dht node on a new thread, using a
    // generated RSA key pair, and listen on port 4222.
    node.run(4222, dht::crypto::generateIdentity(), true);

    // Join the network through any running node,
    // here using a known bootstrap node.
    node.bootstrap("bootstrap.ring.cx", "4222");

    // put some data on the dht
    std::vector<uint8_t> some_data(5, 10);
    node.put("unique_key", some_data);

    // put some data on the dht, signed with our generated private key
    node.putSigned("unique_key_42", some_data);

    // get data from the dht
    node.get("other_unique_key", [](const std::vector<std::shared_ptr<dht::Value>>& values) {
        // Callback called when values are found
        for (const auto& value : values)
            std::cout << "Found value: " << *value << std::endl;
        return true; // return false to stop the search
    });

    // wait for dht threads to end
    node.join();
    return 0;
}

Python 3 example

import opendht as dht

node = dht.DhtRunner()
node.run()

# Join the network through any running node,
# here using a known bootstrap node.
node.bootstrap("bootstrap.ring.cx", "4222")

# blocking call (provide callback arguments to make the call non-blocking)
node.put(dht.InfoHash.get("unique_key"), dht.Value(b'some binary data'))

results = node.get(dht.InfoHash.get("unique_key"))
for r in results:
    print(r)

Dependencies

  • msgpack-c 1.2+, used for data serialization.
  • GnuTLS 3.3+, used for cryptographic operations.
  • Nettle 2.4+, a GnuTLS dependency for crypto.
  • (optional) restinio used for the REST API.
  • (optional) jsoncpp 1.7.4-3+, used for the REST API.
  • Build tested with GCC 5.2+ (GNU/Linux, Windows with MinGW), Clang/LLVM (GNU/Linux, Android, macOS, iOS).
  • Build tested with Microsoft Visual Studio 2015, 2017, 2019

Contact

IRC: join us on Freenode at #opendht.

License

Copyright (C) 2014-2019 Savoir-faire Linux Inc.

OpenDHT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

See COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html for the full GPLv3 license.

Acknowledgements

This project was originally based on https://github.com/jech/dht by Juliusz Chroboczek. It is independent from another project called OpenDHT (Sean Rhea. Ph.D. Thesis, 2005), now extinct.

Donations

We gratefully accept Bitcoin donations to support OpenDHT development at: bitcoin:3EykSd1An888efq4Bq3KaV3hJ3JQ4FPnwm.

You can’t perform that action at this time.