IOTA ICT Installation tutorial

THIS GUIDE NO LONGER WORKS. ICT development is now pursued by the Foundation and not CfB only. As CfB repository was removed, the commands regarding ICT install will raise errors and installation will not be possible. A new version of the tutorial will be posted shortly to install the foundation version of ICT, or upgrade the old install.


ICT is a project currently developed by CfB (Come_From_Beyond, aka Sergey Ivancheglo), co-founder et co-director of IOTA.

Mesh of current ICT network

There is currently few information about the exact nature of ICT and its role in IOTA’s ecosystem. One of its main characteristics seems to be that it relies on sharding. That means it should be constituted of many small edge nodes (e.g. Raspberry Pis) that work together and act as it they were one single full node. Anyway, more information and explanation will be given by CfB in due time, once the system finalized. Currently, ICT is still in testing phase. Therefore, we need as many Raspberries as possible to extend the network. So if you have one or two lying around and want to participate keep reading, it is not that difficult.

Preparation of your Raspberry

For this guide, we assume that you have a Pi running and connected to the internet. We also assume you know it’s IP on your local network and you can access it headlessly of directly.

Obtaining a static IP

ICT requires you to use a static IP to connect with your neighbors. Unfortunately, ISP often provied dynamics IP. Therefore, you will need to use a dynamic dns service to have a static way of accessing your dynamic IP. Every few minutes, your Pi will simply report the actual public IP to the dynDNS server so it can trace back to you. If you already have a static IP, this step is obviously not requested.

Start by going on noip.com, or any other dyndns provider of your choice. Create an account the chose a domain name for easier access. Now you need to install some scripts on the raspberry that will send your IP to your dyndns provider. The following commands are for noip. You can see in depth what each line does on their documentation website. (You have to type them one at a time and pressing Enter after each one).

mkdir /home/pi/noip
cd /home/pi/noip
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar vzxf noip-duc-linux.tar.gz
cd noip-2.1.9–1
sudo make
sudo make install

After that last line, you have to enter your login and password (the ones that you used for noip.com)
The terminal will then ask you for the time interval between each update. Chose something strictly above 5, otherwise it will complain. Finally, enter Nto the next question.

You can now run noip using

sudo /usr/local/bin/noip2

Now simply type cd to return to the home directory before continuing the installation.

Opening port for ICT in your home router

ICT requires the port 14265 to be open in your router. Head to its configuration interface (usually details are printed on a label attached to it). Locate the port forwarding or portmapping tab and link port 14265 to your raspberry local IP and its 14265 port as well. Make sure that you use UDP , otherwise it will not work properly.

Setup of ICT

ICT setup is quite simple, thanks to discord user ixuz#6751 that compiled the commands in easy-to-use scripts.

ICT Installation

First, we will create a script that will install ICT using

sudo nano setup-ict.sh

Then copy/paste the following in the editor

#!/bin/bash
apt-get --assume-yes install git oracle-java8-jdk
git clone https://github.com/Come-from-beyond/Ict.git
cd Ict
javac src/cfb/ict/*.java
PROPERTIES_FILE="ict.properties"
echo "host = 0.0.0.0" > $PROPERTIES_FILE
echo "port = 14265" >> $PROPERTIES_FILE
echo "" >> $PROPERTIES_FILE
echo "//Discord neighbor: <username>#<userid>" >> $PROPERTIES_FILE
echo "neighborAHost = ?.?.?.?" >> $PROPERTIES_FILE
echo "neighborAPort = 14265" >> $PROPERTIES_FILE
echo "" >> $PROPERTIES_FILE
echo "//Discord neighbor: <username>#<userid>" >> $PROPERTIES_FILE
echo "neighborBHost = ?.?.?.?" >> $PROPERTIES_FILE
echo "neighborBPort = 14265" >> $PROPERTIES_FILE
echo "">> $PROPERTIES_FILE
echo "//Discord neighbor: <username>#<userid>" >> $PROPERTIES_FILE
echo "neighborCHost = ?.?.?.?" >> $PROPERTIES_FILE
echo "neighborCPort = 14265" >> $PROPERTIES_FILE
echo "ICT app installed!"
echo "Open 'ict.properties' and add three neighbor ip-addresses"
echo "Extra note: You may need to ensure that your firewall doesn't block UDP-traffic on port 14265."
echo "Start ICT with command: './run-ict.sh'"

Save by pressing ctrl + O then Enter then exit with ctrl + X . You can now run this install script by using

sudo bash setup-ict.sh

Find neighbors for your ICT

ICT requires at least one neighbor to operate properly. You can add up to three of them. Go in the #ICT channel of IOTA’s Discord server and ask for neighbors. Start private discussion with the ones interested and exchange your public IP if it is static or your DNS (that you chose with No-IP for instance). When you have found your neighbors, you need to add them in the ict.properties files. To do that, use

sudo nano Ict/ict.properties

Replace the ?.?.?.? with your neighbors IP or DNS (e.g. something like 12.34.56.789 or myNeighbor.ddns.net ). Note that you can also edit the fields <username>#<userID> with the discord handle of the neighbors to keep track of them easily. Once your neighbors added, save and exit using ctrl + O then Enter then ctrl + X .

Update ICT

We can now create a script that will update easily ICT when needed. Create the script using

sudo nano update-ict.sh

And copy/past the following

#!/bin/bash
cd Ict
git pull
javac src/cfb/ict/*.java
echo "ICT app updated!"
echo "Start ICT with command: './run-ict.sh'"

As always, save and exit using ctrl + O then Enter then ctrl + X .

When a new update of ICT will be out, you will simply have to type

sudo bash update-ict.sh

to update, and then restart ICT after that.

Note that this update script may run into problems in the future, depending on the changes made to the ICT source code. If you are experimenting some problems with the update, do not hesitate to visit the #ICT channel on IOTA’s discord.

Run ICT

The last script to create will run ICT. Type in

sudo nano run-ict.sh

And then copy/paste the following :

#!/bin/bash
cd Ict/src
java cfb.ict.Ict ../ict.properties

Do not forget to save and exit using ctrl + O then Enter then ctrl + X .

You can now run that script with sudo bash run-ict.sh . However, that script will need you to stay connected to your Pi. So, as an extra step, we can use a systemd service to control the execution of ICT in a more convenient way.

Create a service to run ICT automatically

First, we to be sure of your working directory. Type pwdand note the response (should be something like /home/pi ). Then we need to create the service using

sudo nano /lib/systemd/system/ict.service

Then copy/paste what follows and replace <YOUR_WORKING_DIRECTORY> with the one you got using pwd . That would give something like WorkingDirectory=/home/pi .

[Unit]
Description=IOTA ICT
After=network.target
[Service]
ExecStart=/bin/bash -u run-ict.sh
WorkingDirectory=<YOUR_WORKING_DIRECTORY>
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target

Save and exit as previously.

Finally, type the following to change permissions of the relevant files, reload the services daemon and enable the newly created service for running ICT. Note that for the second line you will once again need to replace <YOUR_WORKING_DIRECTORY> . So for instance, that could be sudo chmod +x /home/pi/run-ict.sh .

sudo chmod 644 /lib/systemd/system/ict.service
sudo chmod +x <YOUR_WORKING_DIRECTORY>/run-ict.sh
sudo systemctl daemon-reload
sudo systemctl enable ict.service

That is it, you can now start ICT with

sudo systemctl start ict.service

Display it’s status with

sudo systemctl status ict.service

Stop ICT with

sudo systemctl stop ict.service

Display the logs with (type ctrl+C to quit those logs)

sudo journalctl -f -u ict.service

Add a cronjob to force restart every day (optional)

With the current implementation, every ICT transaction will be stored in memory. After a few days of continuous activity, the java process will run out of memory and print an error similar to this : Exception in threa "Receiver" java.lang.OutOfMemoryError: Java heap space.

To avoid this error, we can ask the raspeberry to restart ict service every day (at midnight in our case). That way, each day the memory will be flushed and ICT will never stop running. To do that, type

sudo crontab -e then type 2 and Enter to open the text editor.
At scroll to the end of the text and paste 0 0 * * * systemctl restart ict .
Save and exit as usual.

Your ICT instance should now run without interruption and will never encounter memory errors thanks to the cronjob.


I hope this tutorial will help you setting up an ICT instance on your pi. Thanks a lot to discord users ixuz#6751 and Mammoth#3769 for the help in debugging and improving it. If you want, tip in IOTA are always welcomed :

XSTZVGRXPDEBVHL9ZFDBUBCZOAPNRSWZBMNACARQFMFXMLTEVCHHZHSLSH9FGYJIOZOXMNULGNNLJYEIDURJRDHN9W