Skip to content

Freechains/README

Repository files navigation

Freechains: Peer-to-peer Content Dissemination

Freechains is a permissionless social media protocol with integrated reputation.

  • Local-first publish-subscribe topic-based model
  • Unstructured peer-to-peer gossip dissemination
  • Multiple flavors of public and private communication (1->N, 1<-N, N<->N, 1<-)
  • Per-topic reputation system for healthiness
  • Consensus via authoring reputation (human work)
  • 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 other users subscribed to the same chain eventually receive the message. Users spend reputation tokens, known as reps, to post new messages and gain reps as they consolidate. Users can like and dislike messages from other users, which transfer reps between them.

Install

First, you need to install java and libsodium:

$ sudo apt install default-jre libsodium23

Then, you are ready to install freechains:

$ wget https://github.com/Freechains/README/releases/download/v0.10.1/install-v0.10.1.sh

# choose one:
$ sh install-v0.10.1.sh .                    # either unzip to current directory (must be in the PATH)
$ sudo sh install-v0.10.1.sh /usr/local/bin  # or     unzip to system  directory

Basics

The basic API of Freechains is very straightforward:

  • freechains-host start ...: starts the local peer to serve requests (execute on every restart)
  • freechains keys ...: creates a cryptographic key
  • 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 consensus: shows all posts in consensus order
  • 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 keys shared "My very strong passphrase"  # returns shared key
96700ACD1128035FFEF5DC264DF87D5FEE45FF15E2A880708AE40675C9AD039E
  • Join the private chain $chat:
$ 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 freechains host.
    • Join the same private chain $chat.
    • Synchronize with the first host.
$ 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 8330 to 8331.

  • Iterate over posts in a chain:
    • Shows the consensus order of posts in the chain.
    • Reads the posts payloads.
$ freechains --host=localhost:8331 chain '$chat' consensus
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!