• Stars
    star
    791
  • Rank 57,558 (Top 2 %)
  • Language
    Python
  • License
    MIT License
  • Created almost 11 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A DHT in Python using asyncio

Python Distributed Hash Table

Build Status Docs Status

Documentation can be found at kademlia.readthedocs.org.

This library is an asynchronous Python implementation of the Kademlia distributed hash table. It uses the asyncio library in Python 3 to provide asynchronous communication. The nodes communicate using RPC over UDP to communiate, meaning that it is capable of working behind a NAT.

This library aims to be as close to a reference implementation of the Kademlia paper as possible.

Installation

pip install kademlia

Usage

This assumes you have a working familiarity with asyncio.

Assuming you want to connect to an existing network:

import asyncio
from kademlia.network import Server

async def run():
    # Create a node and start listening on port 5678
    node = Server()
    await node.listen(5678)

    # Bootstrap the node by connecting to other known nodes, in this case
    # replace 123.123.123.123 with the IP of another node and optionally
    # give as many ip/port combos as you can for other nodes.
    await node.bootstrap([("123.123.123.123", 5678)])

    # set a value for the key "my-key" on the network
    await node.set("my-key", "my awesome value")

    # get the value associated with "my-key" from the network
    result = await node.get("my-key")
    print(result)

asyncio.run(run())

Initializing a Network

If you're starting a new network from scratch, just omit the node.bootstrap call in the example above. Then, bootstrap other nodes by connecting to the first node you started.

See the examples folder for a first node example that other nodes can bootstrap connect to and some code that gets and sets a key/value.

Logging

This library uses the standard Python logging library. To see debut output printed to STDOUT, for instance, use:

import logging

log = logging.getLogger('kademlia')
log.setLevel(logging.DEBUG)
log.addHandler(logging.StreamHandler())

Running Tests

To run tests:

pip install -r dev-requirements.txt
pytest

Reporting Issues

Please report all issues on github.

Fidelity to Original Paper

The current implementation should be an accurate implementation of all aspects of the paper save one - in Section 2.3 there is the requirement that the original publisher of a key/value republish it every 24 hours. This library does not do this (though you can easily do this manually).

More Repositories

1

gender_detector

Get gender from first name in Ruby.
Ruby
422
star
2

twistar

Twistar is an object-relational mapper (ORM) for Python that uses the Twisted library to provide asynchronous DB interaction.
Python
133
star
3

bandit

A multi-armed bandit optimization framework for Rails
Ruby
129
star
4

ankusa

Text classifier in Ruby that uses Hadoop/HBase, Mongo, or Cassandra for storage. New location for http://github.com/livingsocial/ankusa
Ruby
100
star
5

rpcudp

Python library for RPC over UDP
Python
89
star
6

mod_auth_openid

mod_auth_openid is an authentication module for the Apache 2 webserver. It handles the functions of an OpenID consumer as specified in the OpenID 2.0 specification.
C++
74
star
7

arrow

Date interaction for Golang, with strftime formatting for time
Go
41
star
8

hbaserb

HBase Thrift interface for Ruby
Ruby
34
star
9

gatling_gun

A Ruby library wrapping SendGrid's Newsletter API.
Ruby
33
star
10

pundit-elixir

Simple authorization helpers for Elixir stucts, like Ruby's Pundit
Elixir
29
star
11

abanalyzer

A/B test analysis library for Ruby - performs Chi-Square tests and G-tests on A/B results - New location for https://github.com/livingsocial/abanalyzer
Ruby
29
star
12

fastimage

Python library that finds the size / type of an image given its URI by fetching as little as needed
Python
28
star
13

StactiveRecord

StactiveRecord is a C++ ORM library designed to make simple database use as simple as possible. It was inspired by Ruby on Rail's Active Record, however, no similar look, feel, or performance is guaranteed. It uses an Object-relational mapping pattern to represent records as objects. It also provides persistent object relationships (one to many, many to many, one to one).
C++
26
star
14

pymur

pymur is a Python interface to The Lemur Toolkit.
C++
19
star
15

fake

Make Python's Fabric act like Ruby's Capistrano
Python
19
star
16

telemetry_metrics_cloudwatch

Provides an AWS CloudFront reporter for Elixir Telemetry.Metrics definitions
Elixir
19
star
17

robostrippy

Python lib to strip websites. Like a robot.
Python
17
star
18

campfirer

Jabber to Campfire gateway
Python
13
star
19

imgproxy

Elixir module to generate imgproxy URLs
Elixir
12
star
20

genderator

A Python library to determine gender based on first name, with i18n support.
Python
12
star
21

toquen

Capistrano + AWS + Chef-Zero
Ruby
11
star
22

gridcli

A command line client for The Grid
Ruby
11
star
23

txyam

Yet Another Memcached (YAM) client for Python Twisted
Python
10
star
24

endon

ActiveRecord type helpers for Elixir's Ecto 3+
Elixir
8
star
25

hubot-aws-sesame

Hubot script to open/close AWS EC2 ports automagically based on chat presence
CoffeeScript
8
star
26

readembedability

Turn unstructured webpages into structured content. Readability + oembed
Python
6
star
27

pubsub.in

Async pubsub broker between twitter/xmpp/email/identi.ca/sms/etc using Python's Twisted
Python
5
star
28

aioipfs-api

IPFS API Bindings for Python 3 using asyncio
Python
5
star
29

clive

Clojure library for interacting with Hive via Thrift
Clojure
4
star
30

pubsubd

Distributed PubSub using Node.js
JavaScript
3
star
31

SassyPy

More featureful CSV handling
Python
3
star
32

aws-sesame

node package to open/close access to servers on AWS by IP like a boss
CoffeeScript
3
star
33

configulator

Generate config files from a template
Ruby
2
star
34

debmeo

oEmbed for Python3
Python
2
star
35

grid-plugin-echo

An example plugin for the grid
Ruby
2
star
36

txairbrake

Report exceptions in Twisted code to an airbrake server
Python
2
star
37

doop

A Hadoop command line utility that acts like a shell.
Shell
2
star
38

ex_aws_s3_crypto

AWS S3 client-side encryption support for Elixir
Elixir
2
star
39

twistler

Controller class extensions for Divmod's Nevow
Python
2
star
40

bizratr

Synthesize business information from many sources
Ruby
1
star
41

Sane.R

A library for making R act sane.
R
1
star
42

robostrippure

Clojure lib to strip websites. Like a robot.
Clojure
1
star
43

blobber

A program that tracks points of light (lasers, LEDs) and projects reactions. The results range from graffiti to various games.
C++
1
star
44

dorsey

A microframework for Go. There are many like it, but this one is mine.
Go
1
star
45

onionvpn

Docker image for a OpenVPN => Tor gateway
Shell
1
star
46

gossipr

Jabber chatroom logger (logs XMPP MUC rooms and provides web interface) using Python Twisted
JavaScript
1
star
47

bmuller.github.io

HTML
1
star
48

oper8r

DEPRECATED - See https://github.com/bmuller/toquen
Ruby
1
star
49

txque

Python library for running asynchronous background jobs using Twisted
Python
1
star
50

grid-plugin-osx-notifier

OSX notifier for new message on the grid http://griddoor.com
Ruby
1
star