README.md: Add examples for using gnunet-fs
[oweals/gnunet.git] / README.md
1 <p align="center">
2   <a href="https://gnunet.org"><img src="contrib/branding/logo/gnunet-logo-dark-text.svg" alt="GNUnet" width="300px"/></a>
3 </p>
4
5 > GNUnet is a *new* network protocol stack for building secure, distributed, and privacy-preserving applications. 
6
7 * [Install](#how-to-install-gnunet)
8   * [From Source](#from-source)
9   * [Using Docker](#docker)
10 * [Using GNUnet](#using-gnunet)
11 * [License](#license)
12
13 How to Install GNUnet
14 ---------------------
15
16 ### 1. From Source
17
18 **Dependencies**
19
20 Install these packages. Some of them may need to be installed from source depending on your OS.
21
22 ```
23 - libmicrohttpd      >= 0.9.42
24 - libgcrypt          >= 1.6
25 - libgnurl           >= 7.35.0      (recommended, available from https://gnunet.org/gnurl)
26 - libcurl            >= 7.35.0      (alternative to libgnurl)
27 - libunistring       >= 0.9.2
28 - gnutls             >= 3.2.12      (highly recommended: a gnutls linked against libunbound)
29 - libidn             >= 1.0
30 - libextractor       >= 0.6.1       (highly recommended)
31 - openssl            >= 1.0         (binary, used to generate X.509 certificate)
32 - libltdl            >= 2.2         (part of GNU libtool)
33 - sqlite             >= 3.8         (default database, required)
34 - mysql              >= 5.1         (alternative to sqlite)
35 - postgres           >= 9.5         (alternative to sqlite)
36 - Texinfo            >= 5.2         [*1]
37 - which                             (for the bootstrap script)
38 - gettext
39 - zlib
40 - pkg-config
41 ```
42
43
44 You can also install the dependencies with the [GNU Guix package manager:](https://https://www.gnu.org/software/guix/) by using the provided environment file: 
45
46 ```shell
47 guix package -l guix-env.scm
48 ```
49
50
51 **Using GNU Make**
52
53 ```shell
54 ./bootstrap # Run this to generate the configure files.
55 ./configure # See the various flags avalable to you.
56 make
57 make install
58 ```
59
60 **Using the [GNU Guix package manager:](https://https://www.gnu.org/software/guix/)**
61
62 ```shell
63 # To build, run tests, and install:
64 guix package -f guix-env.scm
65
66 # To skip the testing phase:
67 guix package -f guix-env.scm:notest
68 ```
69
70
71 ### 2. Docker
72
73 ```
74 cd docker
75 docker build -t gnunet .
76 ```
77
78
79
80 Using GNUnet
81 -------------
82
83 There are many possible ways to use the subsystems of GNUnet, so we will provide a few examples in this section.
84
85 <p align="center">
86   <a href="contrib/gnunet-arch-full.svg"><img src="contrib/gnunet-arch-full.svg" alt="GNUnet Modular Architecture" width="600px" border="1px"/></a>
87 </p>
88
89 >***GNUnet is composed of over 30 modular subsystems***
90
91
92 ### Start GNUnet Services
93
94 Before we can begin using most of the components we must start them.
95
96 ```shell
97 gnunet-arm --start
98 ```
99
100 Now we can open up another shell and try using some of the modules.
101
102 ### Cadet
103
104 #### Examples
105
106 Open a Cadet connection:
107
108 ```shell
109 # Node 1
110 gnunet-cadet -o <shared secret>
111 ```
112
113 Conect to peer:
114
115 ```shell
116 # Node 2
117 gnunet-cadet <peer-id of Node 1> <shared secret>
118 ```
119
120 #### Sharing Files
121
122 With the cli tool, you can also share files:
123
124 ```shell
125 # Node 1
126 gnunet-cadet -o <shared secret> > filename
127 ```
128
129 On the Node 2 we're going to send the file to Node 1, and to do this we need to make use of [coprocesses](https://www.gnu.org/software/bash/manual/html_node/Coprocesses.html).
130 The syntax for using coprocesses varies per shell. In our example we are assuming Bash. More info for different shells can be found [here](https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-various-shells)
131
132 ```shell
133 # Node 2
134 coproc gnunet-cadet <peer-id of Node 1> <shared secret>
135 cat <file> >&"${COPROC[1]}"
136 ```
137
138 Now this enables us to do some fun things, such as streaming video by piping to a media player:
139
140 ```shell
141 # Node 1
142 gnunet-cadet -o <shared secret> | vlc -
143 ```
144
145 ```shell
146 # Node 2
147 coproc gnunet-cadet <peer-id of Node 1> <shared secret>
148 cat <video-file> >&"${COPROC[1]}"
149 ```
150
151 ### Filesharing
152
153 You can use GNUnet as a content-addressed storage, much like IPFS: sharing immutable files in a decentralized fashion with added privacy.
154
155 For instance, you can get a nice cat picture with
156 ```sh
157 gnunet-download gnunet://fs/loc/CB0ZX5EM1ZNNRT7AX93RVHCN1H49242DWZ4AXBTCJBAG22Z33VHYMR61J71YJXTXHEC22TNE0PRWA6D5X7NFNY2J9BNMG0SFN5DKZ0G.R48JSE2T4Y3W2AMDHZYX2MMDJC4HR0BVTJYNWJT2DGK7EQXR35DT84H9ZRAK3QTCTHDBAE1S6W16P8PCKC4HGEEKNW2T42HXF9RS1J0.1906755.J5Z3BDEG2PW332001GGZ2SSKCCSV8WDM696HNARG49X9TMABC4DG.B6Y7BCJ6B5K40EXCXASX1HQAD8MBJ9WTFWPCE3F15Q3Q4Y2PB8BKVGCS5HA4FG4484858NB74PBEE5V1638MGG7NS40A82K7QKK3G0G.1577833200 --output cat.png
158 ```
159
160 You can also give files to the network, like so:
161
162 ```sh
163 $ echo "I love GNUnet" > ILoveGNUnet.txt
164 $ gnunet-publish ILoveGNUnet.txt
165
166 Publishing `/tmp/ILoveGNUnet.txt` done.
167 URI is `gnunet://fs/chk/SXA4RGZWDHE4PDWD2F4XG778J4SZY3E3SNDZ9AWFRZYYBV52W1T2WQNZCF1NYAT842800SSBQ8F247TG6MX7H4S1RWZZSC8ZXGQ4YPR.AZ3B5WR1XCWCWR6W30S2365KFY7A3R5AMF5SRN3Z11R72SMVQDX3F6GXQSZMWZGM5BSYVDQEJ93CR024QAAE65CKHM52GH8MZK1BM90.14`.
168 ```
169
170 The URI you get is what you can use to retrieve the file with `gnunet-download`.
171
172 ### GNS
173
174 *coming soon*
175
176
177 ### VPN
178
179 *coming soon*
180
181 ### Running a Hostlist Server
182
183 *coming soon*
184
185 GNUnet Configuration
186 --------------------------
187 ### Examples
188
189 ```yaml
190 [transport]
191 OPTIONS = -L DEBUG
192 PLUGINS = tcp
193 #PLUGINS = udp
194
195 [transport-tcp]
196 OPTIONS = -L DEBUG
197 BINDTO = 192.168.0.2
198 ```
199
200 TODO: *explain what this does and add more*
201
202
203 Philosophy
204 -------------------------
205
206
207 Related Projects
208 -------------------------
209
210
211
212  <a href="https://pep.foundation"><img src="https://pep.foundation/static/media/uploads/peplogo.svg" alt="pep.foundation" width="80px"/></a>  <a href="https://secushare.org"><img src="https://secushare.org/img/secushare-0444.png" alt="Secushare" width="80px"/></a>
213
214