In DarkFi, we organize our communication using resilient and
censorship-resistant infrastructure. For chatting, ircd is a
peer-to-peer implementation of an IRC server in which any user can
participate anonymously using any IRC frontend and by running the
IRC daemon. ircd uses the DarkFi P2P engine to synchronize chats
between hosts.
/nick foo. This means all messages are unlinkable.Therefore this is the world's most strongly anonymous chat in existence. Nothing else exists like it.
Follow the instructions in the README to ensure you have all the necessary dependencies.
% git clone https://github.com/darkrenaissance/darkfi.git
% cd darkfi && git checkout v0.4.1
% make ircd
This is for Android 64 bit (which is most phones).
cd bin/ircd/ && make android. The resulting file will be called
ircd.aarch64-android. Copy this to your phone./sdcard/ and copy the file
into the Termux home.termux-wake-lock. This stops Android suspending the daemon.Upon compiling ircd as described above, the preconfigured defaults
will allow you to connect to the network and start chatting with the
rest of the DarkFi community.
First, try to start ircd from your command-line so it can spawn its
configuration file in place. The preconfigured defaults will autojoin
you to several default channels one of which is #dev where we have
weekly meetings, and where the community is most active and talks
about DarkFi development.
% ./ircd
ircd will create a configuration file ircd_config.toml by
default in ~/.config/darkfi/ you can review and potentially edit. It
might be useful if you want to add other channels you want to autojoin
(like #philosophy and #memes), or if you want to set a shared
secret for some channel in order for it to be encrypted between its
participants.
When done, you can run ircd for the second time in order for it to
connect to the network and start participating in the P2P protocol:
% ./ircd
In this section, we'll briefly cover how to use the Weechat IRC
client to connect and chat with
ircd.
Normally, you should be able to install weechat using your distribution's package manager. If not, have a look at the weechat git repository for instructions on how to install it on your computer.
Once installed, we can configure a new server which will represent our
ircd instance. First, start weechat, and in its window - run the
following commands (there is an assumption that irc_listen in the
ircd config file is set to 127.0.0.1:6667):
/server add darkfi localhost/6667 -notls -autoconnect
/save
/quit
Note: if you have other IRC servers added in your client
then you probably know this but you can ommit -autoconnect part.
This will set up the server, save the settings, and exit weechat. You are now ready to begin using the chat. Simply start weechat and everything should work.
When you join, you will not see any users displayed. This is normal since there is no concept of nicknames or registration on this p2p anonymous chat.
You can change your nickname using /nick foo, and navigate channels
using F5/F6 or ALT+X where X is the channel number displayed.
Nodes have knowledge of their peers, including the IP addresses of connected hosts.
DarkFi supports the use of pluggable transports, including Tor and Nym,
to provide network-level privacy. As long as there are live seed nodes
configured to support a Tor or Nym connection, users can connect to
ircd and benefit from the protections offered by these protocols.
Other approaches include connecting via a cloud server or VPN. Research the risks involved in these methods before connecting.
These steps below are only for developers who wish to make a testing deployment. The previous sections are sufficient to join the chat.
First you must run a seed node. The seed node is a static host which
nodes can connect to when they first connect to the network. The
seed_session simply connects to a seed node and runs protocol_seed,
which requests a list of addresses from the seed node and disconnects
straight after receiving them.
The first time you run the program, a config file will be created in
~/.config/darkfi if you are using Linux or in
~/Library/Application Support/darkfi/ on MacOS.
You must specify an inbound accept address in your config file to configure a seed node:
## P2P accept addresses
inbound=["127.0.0.1:11001"]
Note that the above config doesn't specify an external address since the seed node shouldn't be advertised in the list of connectable nodes. The seed node does not participate as a normal node in the p2p network. It simply allows new nodes to discover other nodes in the network during the bootstrapping phase.
This is a node accepting inbound connections on the network but which is not making any outbound connections.
The external addresses are important and must be correct.
To run an inbound node, your config file must contain the following info:
## P2P accept addresses
inbound=["127.0.0.1:11002"]
## P2P external addresses
external_addr=["127.0.0.1:11002"]
## Seed nodes to connect to
seeds=["127.0.0.1:11001"]
This is a node which has 8 outbound connection slots and no inbound connections. This means the node has 8 slots which will actively search for unique nodes to connect to in the p2p network.
In your config file:
## Connection slots
outbound_connections=8
## Seed nodes to connect to
seeds=["127.0.0.1:11001"]
Assuming you have run the above 3 commands to create a small model testnet, and both inbound and outbound nodes above are connected, you can test them out using weechat.
To create separate weechat instances, use the --dir command:
weechat --dir /tmp/a/
weechat --dir /tmp/b/
Then in both clients, you must set the option to connect to temporary servers:
/set irc.look.temporary_servers on
Finally you can attach to the local ircd instances:
/connect localhost/6667
/connect localhost/6668
And send messages to yourself.
See the script script/run_node.sh for an example of how to deploy
a full node which does seed session synchronization, and accepts both
inbound and outbound connections.
Copy this script
to ~/.weechat/python/autoload/, and you will create a single buffer
which aggregates messages from all channels. It's useful to monitor
activity from all channels without needing to flick through them.