Skip to content

Anonymous decentralized message broadcasting based on Libp2p and Dandelion++

License

Notifications You must be signed in to change notification settings

rairyx/raven

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

91 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Raven

Anonymous decentralized messaging network

Blockchain has enabled decentralized value transfer. A bigger future is decentralized messaging. One unresolved area is anonymous message broadcasting which provides metadata privacy(who is sender, who is receiver, who send to whom, IP address, location, et cetera).

Raven is an anonymous message broadcasting network which is decentralized, censorship resistance, privacy preserving and scalable. Anyone can send/receive, broadcast messages anonymously without revealing message metadata.

It has two main use cases, one is decentralized messaging applications for humans, e.g., whistleblowing, anonymous group chat, anonymous survey, privacy preserved message broadcasting for decentralized applications. The other use case is for protecting blockchain against deanonymization attacks thereby DoS attacks in which network adversary links transaction/block/attestation to IP addresses and other sensitive metadata.

Anonymity is achieved by implementing Dandelion++ protocol on top of libp2p's Gossipsub module, Dandelion is a privacy preserving protocol to enable message sender anonymity, it has two phases. The first phase is stem phase, where messages go through a psuedo-random path. The second phase is fluffing. At a random time during the stem phase, the message is diffused to its surrounding peers, so the third party observer cannot track back the message to the original node who send the message, because the message is relayed through an anonymous graph. Message broadcasting is implemented by libp2p's gossipsub. Dandelion++ is an improved version of Dandelion.

Dandelion++ implementation on libp2p-pubsub: https://github.com/rairyx/go-libp2p-pubsub/

Demo

Directory: pubsub

What it demonstrates: Three Go peers, one JS peer are all created and run a chat server using a shared PubSub topic. Typing text in any peer sends it to all the other peers.

Quick test: cd pubsub and then run ./test/test.sh. Requires Terminator (eg, sudo apt-get install terminator). The rest of this section describes how to test manually.

First terminal: Create the bootstrapper node

cd pubsub
./raven ../util/private_key.bin.bootstrapper.Wa --bootstrapper

The bootstrapper creates a new libp2p node, subscribes to the shared topic string, spawns a go routine to emit any publishes to that topic, and then waits forever.

(Note that the node ID of raven is going to be Qm...6aJ9oRuEzWa. Node IDs in libp2p are just public keys, and the public key Qm...6aJ9oRuEzWa is derived from the private key file ../util/private_key.bin.bootstrapper.Wa. That file is just an X.509 keypair generated by the included program util/private-key-gen). We use fixed public/private keypairs for each node in this example to keep things simple.)

Second terminal: Create a go peer to connect to bootstrapper and publish on the topic

cd pubsub
./raven ../util/private_key.bin.peer.Sk

This peer, which is not in bootstrapper mode, creates a node, subscribes to the shared topic string, spawns the same go routine, and then loops forever requesting user input and publishing each line to the topic.

Third terminal: Create another go peer to connect to bootstrapper and publish on the topic

cd pubsub
./raven ../util/private_key.bin.peer.w6 6001

Fourth terminal: Create a third go peer to connect to bootstrap and publish on topic

cd pubsub
./raven ../util/private_key.bin.peer.d9 6002

If you return to the second, third or fourth terminals and type a message, the bootstrapper and the other 2 peers will all print your message.

Conclusion

You now have a chat app on a private libp2p network where each node can exchange messages anonymously using PubSub.

Debugging Notes

JS To see debug messages from the Node.js program, use the DEBUG environment variable:

DEBUG="libp2p:floodsub*,libp2p:switch*,mss:*" node index.js [args...]

Go To see debug messages in Go programs, do this at runtime:

IPFS_LOGGING=debug ./raven [args...]

(TODO: describe custom instrumenting the local go code for complex debugging)

If you instrument your go code with custom fmt.Println's, then revert back like this:

cd $GOPATH
go get -u ./...

Other useful commands:

go get -u github.com/libp2p/go-libp2p-kad-dht   # fetch just Kad DHT repo

Acknowledgements: @jhiesey for DHT (content & peer routing) JS+Go interop, @stebalien for PubSub

About

Anonymous decentralized message broadcasting based on Libp2p and Dandelion++

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 44.2%
  • Rust 37.2%
  • JavaScript 15.5%
  • Makefile 2.3%
  • Shell 0.8%