Egal mit welcher Cryptowährung man hantiert, es empfiehlt sich immer eine eigene Kopie der Blockchain zu besitzen, nicht nur um - im Falle transparenter Transaktionen - Einsicht zu erhalten, sondern primär um sich vor potentiellen Angriffen zu schützen, sich unabhängig von remote nodes zu machen und natürlich um das Netzwerk zu unterstützen. Nur so kann man den großen Vorteil einer Blockchain - die Dezentralität - überhaupt erst sinnvoll nutzen.
Insbesondere bei privacy coins, wie Monero - aber natürlich auch bei allen anderen Cryptowährungen - lohnt es sich, seinen Node via TOR (oder einem anderen Anonymisierungsnetzwerks wie I2P ) als HiddenService bereitzustellen und sich auf diese Weise von seinem lokalen PC aus zu verbinden.
Die Verwendung eines Anonymisierungsnetzwerks unterbindet effektiv Angriffe auf die Privatsphäre beispielsweise durch Sybil attacks :
The Sybil attack in computer security is an attack wherein a reputation system is subverted by creating multiple identities. A reputation system’s vulnerability to a Sybil attack depends on how cheaply identities can be generated, the degree to which the reputation system accepts inputs from entities that do not have a chain of trust linking them to a trusted entity, and whether the reputation system treats all entities identically. Wikipedia (EN)
Mehr hierzu auch in einem tollen Video von Justin Ehrenhofer, indem er anschaulich erklärt, wie Sybil attacks in der Monero-Welt funktionieren:
## Einrichtung des Raspberry Pis und Kompilierung der Monero Quellen
Ich gehe davon aus, das der RPi4 unter ARM in 64bit läuft (aarch64). Offenbar aus lizenzrechtlichen Gründen bringt die CPU des Raspberry Pis keine Unterstützung für manche Crypto-Erweiterungen wie z.B. AES mit.
Dies bedeutet, dass ich nicht in der Lage bin die offizielle, vorkompilierte Binärdatei für armv8 von
https://github.com/monero-project/monero/releases
zu verwenden,
sondern meinen monerod selbst bauen muss, ohne die Verwendung der Hardwarebeschleunigung für AES.
Alle benötigten Abhängigkeiten für diverse Linux-Systeme sind im
Github Projekt
unter Compiling Monero from source -> Dependencies zu finden.
Wenn alles installiert wurde, erzeuge ich eine lokale Kopie des Git Repositories und lade die Module herunter:
1git clone --recursive https://github.com/monero-project/monero && cd monero
2git checkout release-v0.17
Danach kann ich die Programme kompilieren. Ich verwende n-1 der zur Verfügung stehenden Kerne, damit noch etwas Luft bleibt:
1make NO_AES=ON -j$(($(nproc)-1))
Auf meinem RPi4 mit 4 CPU Kernen @ 1.5GHz und 4GB RAM, brauchte der Kompilierungsprozess - unter Verwendung von 3 Kernen - über 12h.
Sollte der Build-Prozess nach sehr kurzer Zeit mit folgendem Fehler abbrechen:
Generating embedded translations header
make[6]: ./generate_translations_header: Permission denied
make[6]: *** [CMakeFiles/generate_translations_header.dir/build.make:105: generate_translations_header] Error 127
Muss sichergestellt sein, dass eure Partition mit dem execute flag gemountet ist: mount -o remount,rw,exec /monero
Wenn es später weitere Fehler geben sollte, ebenfalls erneut starten, aber diesmal ohne Parallelisierung der build jobs (via -j1).
Im Anschluss füge ich die Programme zum System-PATH hinzu:
1sudo cp bin/monero* /usr/local/bin/
Synchronisation der Blockchain
Im Januar 2019 wurde mit pruning ein neues Feature zum Monero Daemon hinzugefügt, das ermöglicht, die Größe der lokalen Blockchaindaten um etwa 2/3 zu verringern. Die so gestutzte Blockchain ist weiterhin voll intakt und unterstützt weiterhin das Netzwerk. Eine bereits bestehenden, volle Blockchaindatenbank kann zwar auch nachträglich gestutzt werden, effektiver ist es aber wohl, wenn man die Blockchain direkt mit entsprechenden Parameter synchronisiert.
Eine gestutzte Blockchain benötigt aktuell ca. 30 GB. Hierfür habe ich eine externe Festplatte via USB an den RPi4 angebunden:
grep monero /etc/fstab
UUID=da3c9d86-635e-4ea9-bb49-fbc00dea8053 /monero ext4 auto,nosuid,nodev,rw,user 0 2
Als Benutzer unter dem der Monero daemon laufen soll (bei mir: “monero:monero”), synchronisiere ich initial die komplette Blockchain:
1mkdir -p /monero/logs
2/usr/local/bin/monerod --log-file /monero/logs/monerod.log \
3 --data-dir /monero --prune-blockchain
Je nach Bandbreite, wird dies einige Zeit in Anspruch nehmen.
Installation von TOR und Konfiguration der Dienste
Als nächstes benötige ich tor und torsocks. Beides sollte über den Paketmanager der jeweiligen Linux Distribution verfügbar sein.
Dann füge ich mit root zwei Zeilen zur TOR-Konfiguration - je nach Distribution unter /etc/torrc oder /etc/tor/torrc - hinzu, um den HiddenService für den RCP-Dienst des Monero Daemons zu aktivieren:
1HiddenServiceDir /var/lib/tor/monero-node/
2HiddenServicePort 18081 127.0.0.1:18081
Anschließend kann der TOR Daemon aktiviert und gestartet werden:
1sudo systemctl enable --now tor.service
Sobald der tor Daemon mit dem TOR-Netzwerk verbunden ist, kann ich mir die Onion-Adresse meines HiddenService anzeigen lassen:
1sudo cat /var/lib/tor/monero-node/hostname
Optional: Um den Zugriff auf den RPC Port des Monero Daemons mit einem Passwort zu schützen, kann ich eine Konfigurationsdatei anlegen.
/var/lib/monero ist das Heimatverzeichnis meines Benutzers unter dem der Daemon läuft, $USER und $PASS müssen ersetzt werden:
1cat << EOF > /var/lib/monero/bitmonero.conf
2restricted-rpc=1
3rpc-login=$USER:$PASS
4EOF
Anschließend kann ich auch ein systemd unitfile für meinen Monero Daemon erzeugen, aktivieren und starten.
1systemctl cat monerod
2
3# /etc/systemd/system/monerod.service
4[Unit]
5Description=Monero Full Node
6After=network.target
7
8[Service]
9User=monero
10Group=monero
11WorkingDirectory=/var/lib/monero
12RuntimeDirectory=monero
13StateDirectory=monero
14LogsDirectory=monero
15
16Type=simple
17Environment=DNS_PUBLIC=tcp
18Environment=TORSOCKS_ALLOW_INBOUND=1
19ExecStart=/usr/bin/torsocks /usr/local/bin/monerod \
20 --config-file /var/lib/monero/bitmonero.conf --non-interactive \
21 --data-dir /monero --log-file /monero/logs/monerod.log --log-level 0 \
22 --prune-blockchain --no-igd
23
24Restart=always
25
26[Install]
27WantedBy=multi-user.target
Mit folgendem RPC-Call kann die Verbindung und Funktionalität des Daemons getestet werden:
1NODE_HIDDEN_SERVICE="$(sudo cat /var/lib/tor/monero-node/hostname)"
2curl --socks5-hostname 127.0.0.1:9050 -u $USER:$PASS --digest \
3 -X POST http://${NODE_HIDDEN_SERVICE}:18081/json_rpc \
4 -d '{"jsonrpc":"2.0","id":"0","method":"get_info"}' \
5 -H 'Content-Type: application/json'
Anbindung des eigenen Monero Nodes
Um den eigenen remote node nun zu verwenden, muss man beim offiziellen Konsolen-Client monero-wallet-cli folgende Parameter angeben.
Selbstverständlich muss auch lokal tor installiert und mit dem Onion-Routing Netzwerk verbunden sein.
1monero-wallet-cli --wallet-file /Pfad/zur/Wallet/Datei \
2 --proxy 127.0.0.1:9050 \
3 --trusted-daemon --daemon-address $NODE_HIDDEN_SERVICE:18081 \
4 --daemon-login $USER:$PASS
