Freechains: Peer-to-peer Content Dissemination
- Local-first publish-subscribe topic-based model
- Unstructured peer-to-peer gossip dissemination
- Happened-before best-effort partial order
- Per-topic reputation system for healthiness
- Multiple flavors of public and private communication (
- Free in all senses
(In bold we highlight what we believe is particular to Freechains.)
A user posts a message to a chain (a topic) and all other users subscribed to the same chain eventually receive the message. Users spend their reputation to post new messages and gain reputation from consolidated posts. Users can like and dislike messages from other users, which transfer reputation between them.
- Other systems: comparison with other systems
- Commands: list of all protocol commands
- Main concepts:
- Google group: discussion group about Freechains
- Resources: publicly available chains, identities and peers
- Source code:
- Tools (
- Introductory videos: 1/3 | 2/3 | 3/3
First, you need to install
$ sudo apt install default-jre libsodium23
Then, you are ready to install
$ wget https://github.com/Freechains/README/releases/download/v0.8.3/install-v0.8.3.sh # choose one: $ sh install-v0.8.3.sh . # either unzip to current directory (must be in the PATH) $ sudo sh install-v0.8.3.sh /usr/local/bin # or unzip to system directory
The basic API of Freechains is very straightforward:
freechains-host start ...: starts the local peer to serve requests (execute on every restart)
freechains crypto ...: creates a cryptographic identity
freechains chains join ...: joins a chain locally to post and read content
freechains chain post ...: posts to a chain locally
freechains chain get ...: reads a post locally
freechains chain traverse ...: iterates over (discovers) local posts
freechains peer send/recv ...: synchronizes a local chain with a remote peer
Follows a step-by-step execution:
- Start host:
$ freechains-host start /tmp/myhost
Switch to another terminal.
Create an identity:
$ freechains crypto shared "My very strong passphrase" # returns shared key 96700ACD1128035FFEF5DC264DF87D5FEE45FF15E2A880708AE40675C9AD039E
- Join the private chain
$ freechains chains join '$chat' 96700A... # type the full shared key above C40DBB...
- Post some content:
$ freechains chain '$chat' post inline "Hello World!" 1_DE2EF0... $ freechains chain '$chat' post inline "I am here!" 2_317441...
- Communicate with other peers:
- Start another
- Join the same private chain
- Synchronize with the first host.
- Start another
$ freechains-host --port=8331 start /tmp/othost # switch to another terminal $ freechains --host=localhost:8331 chains join '$chat' 96700A... # type same key C40DBB... $ freechains --host=localhost:8330 peer localhost:8331 send '$chat' 2 / 2
The last command sends all new posts from
8331, which can
then be traversed as follows:
$ freechains --host=localhost:8331 chain '$chat' traverse 0_C40DBB... 1_DE2EF0... 2_317441... $ freechains --host=localhost:8331 chain '$chat' get payload 1_DE2EF0... Hello World! $ freechains --host=localhost:8331 chain '$chat' get payload 1_DE2EF0... I am here!