Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


An experimental democratic Byzantine Fault Tolerant datastore for consortia.

This program is highly experimental and should not be used in production.


Pnyxdb requires Go 1.11+ for module support. It is highly suggested to clone that project outside your GOPATH to install supported dependencies automatically.

go get ./...

Cluster setup

In this short tutorial, we will create a 4 nodes network on a single machine. For simplicity, we will create 4 directories for our 4 nodes.

$ mkdir alice bob carol dave

In the following snippets, we will explicitly state in which directory commands should be launched.

First, let's generate nodes configuration and keyrings. You may need to setup a PASSWORD environment variable for the next commands. Do not forget to change the identity of each node during the prompted questions!

alice $ pnyxdb init && pnyxdb keys init
bob   $ pnyxdb init && pnyxdb keys init
carol $ pnyxdb init && pnyxdb keys init
dave  $ pnyxdb init && pnyxdb keys init

The next step is to modify configuration files to affect different port numbers per node (since they are on the same machine). For instance, update bob/config.yaml to use port 4101 instead of 4100 in p2p.listen and 4201 instead of 4200 in api.listen.

Now, a connected web of trust must be established between nodes. At this stage, nodes need to know the other nodes in the network to establish trust.

For instance, if alice wants to trust bob's public key at a high level:

bob   $ pnyxdb keys export > /tmp/key
alice $ pnyxdb keys import bob --trust high < /tmp/key
alice $ pnyxdb keys ls # check that we know trust bob

One node may also want to export another public key in which it has put some trust. For instance, if carol does only trust alice, alice can export some information about bob to enrich carol's view of the web of trust.

alice $ pnyxdb keys export > /tmp/bob     # Export bob's public key from alice keyring
alice $ pnyxdb keys sign bob              # Endorse bob's public key
alice $ pnyxdb keys export > /tmp/alice   # Export new public key containing this endorsement

carol $ pnyxdb keys import bob --trust none < /tmp/bob
carol $ pnyxdb keys import alice --trust high < /tmp/alice
carol $ pnyxdb keys show bob
  Identity    : bob
  Trust       : none
  Fingerprint : EF:6F:E2:56:33
  Public key  : 9074D820FA6562C0FB904FDBD9D7A8068A37FCA7F2F5AFD64FF408EF6FE25633
  Status      : Certified
  Approved by : alice (high)

After having established the web of trust (each node should 4 Certified keys in its keystore), it is time to build some connectivity between nodes. For now, links must be specified in the config.yaml files.

To start a node, simply execute:

alice $ pnyxdb server start
INFO	Listening	{"type": "P2P", "address": "/ip4/"}
INFO	Listening	{"type": "P2P", "address": "/ip4/"}
INFO	Recovery	{"handler": "ready"}
INFO	Listening	{"type": "API", "address": ""}

Here, P2P endpoints are printed for each available interface. Copy those addresses, including the hash of public keys, and send them to your peers! They can be put in the p2p.peers section of the configuration file.

Ok, so let's say that you managed to setup a cluster by connecting your nodes. There is no need to establish full connectivity between every node: PnyxDB internally relies on a very efficient gossip broadcast algorithm that propagates messages to the whole accessible network.

You can connect a client to one of your node by issuing the following command:

$ pnyxdb client -s    # With port maching api.listen configuration option>

A prompt is available for operations, just type help for more information. For instance, a very basic set/get transaction could be:> SET myVar 42
e7dc2197-1c65-4416-9fd2-10a92e0913e3> GET myVar
42> ADD myVar 12
87d0f4a1-3ebc-41e7-85e6-9d49c67724a4> GET myVar


This project is licensed under the terms of BSD 3-clause Clear license. by downloading this program, you commit to comply with the license as stated in the file.


An experimental democratic Byzantine Fault Tolerant datastore for consortia.







No releases published


No packages published