Lezioni online Bitcoin-only
This project is maintained by valerio-vaccaro
Officine Bitcoin Bitcoin-only-Lektion Dieses Projekt wird von valerio-vaccaro gepflegt
🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto
Einen Bitcoin-Node zu betreiben ist grundlegend, weil er mit maximaler Privatsphäre ermöglicht:
Ein alter Computer kann als Node recycelt werden. Bei einem Laptop empfiehlt es sich, den Akku zu entfernen, weil ein dauerhaft geladener Akku ein Risiko darstellen kann. Der große Vorteil sind Kosten von null oder nur die Kosten für einen größeren Datenträger.
Der Raspberry Pi ist ein ARM-Board, das häufig für IoT-Systeme und Nodes verwendet wird. Der hohe Preis und die Notwendigkeit eines Datenträgers über USB machen ihn jedoch hinsichtlich Leistung und Stabilität nicht zur besten möglichen Wahl.
Odroid-M1 ist ein leistungsfähiges ARM-Board mit einem internen Steckplatz für zusätzlichen Massenspeicher.
Mit einem sehr kleinen Budget von 30-100 Euro kann man einen gebrauchten Thin Client kaufen, etwa bei ebay, der niedrigen Verbrauch mit ausreichender Leistung für den Node verbindet.
Als Beispiele für Thin Clients wurden die folgenden Modelle getestet:
So wenig Software wie möglich auf einem Node zu installieren begrenzt mögliche Angriffe und macht das System einfacher zu warten.
Online findet man vorgefertigte Lösungen wie Umbrel, Mynode und andere, die Sicherheitsprüfungen verbergen und Software sowie Skripte hinzufügen, zum Beispiel docker, die schwer zu kontrollieren sind. In diesen Lektionen konzentrieren wir uns auf den manuellen Aufbau eines Nodes, also auf die manuelle Installation aller nötigen Software.
Die erste Wahl betrifft das Betriebssystem. Empfohlen wird Linux in einer LTS-Version, also mit Unterstützung für ausreichend viele Jahre. Meine persönliche Wahl fällt auf Debian 12.
Das gewählte Betriebssystem muss dann auf dem Computer installiert werden und alle Pakete müssen aktualisiert werden. Updates werden uns während der gesamten Lebensdauer des Nodes begleiten.
Es empfiehlt sich außerdem, tor und/oder eine andere VPN bei Bedarf sowie ssh zu installieren, damit der Node aus der Ferne gewartet werden kann.
Eine USV kann den Node schließlich vor abrupten Stromausfällen schützen und vermeiden, dass bitcoin und andere Software in einem inkonsistenten Zustand bleiben.
Wir laden Core, die Hashes und die Signaturen herunter.
wget https://bitcoincore.org/bin/bitcoin-core-28.1/bitcoin-28.1-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS.asc
Falls ein Board mit ARM-Architektur verwendet wird, muss das Paket zu bitcoin-28.1-aarch64-linux-gnu.tar.gz geändert werden, also zum gleichen Paket, aber für die 64-Bit-ARM-Architektur aarch64 kompiliert, die auch Odroid verwendet.
Nun können wir prüfen, dass einer der Hashes in SHA256SUMS zum heruntergeladenen Archiv passt.
sha256sum --ignore-missing --check SHA256SUMS
Das Ergebnis zeigt an, dass eine Übereinstimmung für das heruntergeladene Archiv gefunden wurde.
bitcoin-28.1-x86_64-linux-gnu.tar.gz: OK
Jetzt prüfen wir die Signaturen der Datei SHA256SUMS. Falls nötig, besorgen und importieren wir zuerst die Schlüssel.
git clone https://github.com/bitcoin-core/guix.sigs
gpg --import guix.sigs/builder-keys/*
Zum Schluss prüfen wir die Signaturen.
gpg --verify SHA256SUMS.asc
Wenn mehrfach gpg: Good signature from ... erscheint, bedeutet das, dass wir gültige Signaturen gefunden haben.
Wir fahren mit dem Entpacken und der Installation fort.
tar xzvf bitcoin-28.1-x86_64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-28.1/bin/*
Damit sind bitcoind, bitcoin-cli und die anderen Werkzeuge startbereit.
Für den Moment starten wir bitcoind und sehen etwas Log-Ausgabe. Bitcoin beginnt mit der Synchronisierung, und nun gibt es ein Verzeichnis mit der Blockchain und allen Konfigurationen unter ~/.bitcoin/.
Von einem anderen Terminal aus können wir die Funktion von bitcoind mit dem Befehl tail -f ~/.bitcoin/debug.log kontrollieren.
Wie wir bereits gesehen haben, ist das Verzeichnis, in dem Bitcoin Core unter Linux die Konfigurationen und die Blockchain speichert, ~/.bitcoin/. Falls man den Speicherort ändern möchte, gibt es verschiedene Ansätze:
ln -s erstellen,datadir verwenden und das Zielverzeichnis angeben.Bitcoin Core unterstützt drei verschiedene Arten von Netzwerken, mit denen man sich verbinden kann:
mainnet, das klassische Netzwerk, an das wir alle gewöhnt sind, und der Standard für Core,testnet, ein Netzwerk ähnlich wie mainnet, aber die Token haben keinen Wert; Mining findet weiterhin statt, doch wenn 20 Minuten lang keine Blöcke vorhanden sind, fällt die Schwierigkeit stark ab; es leidet oft unter erheblichen Reorgs,regtest, in diesem Modus hat man eine kleine private Blockchain, die immer bei null beginnt und in der man mit minimaler Schwierigkeit minen kann; sie dient lokalen Tests.Ein weiterer nützlicher Befehl ist daemon. Wenn er gesetzt ist, bleibt das Log von Bitcoin Core nicht mit der aktuellen Konsole verbunden. Um den Betrieb zu sehen, kann man weiterhin tail -f ~/.bitcoin/debug.log verwenden.
Alle Konfigurationen können über die Kommandozeile oder über die Datei ~/.bitcoin/bitcoin.conf gestartet werden. Eine Datei, die zu einem Heim-Setup passt, bei dem der Ressourcenverbrauch minimal bleiben soll, könnte so aussehen.
Konfigurationsdatei
daemon=1
blocksonly=1
maxconnections=20
maxuploadtarget=500
txindex=1
blockfilterindex=1
rpcallowip=0.0.0.0/0
rpcallowip=0.0.0.0/0
rpcuser=username
rpcpassword=password
Dabei gilt:
daemon=1 von der Konsole getrenntblocksonly=1txindex=1maxuploadtarget=500txindex=1blockfilterindex=1rpcallowip=0.0.0.0/0rpcallowip=0.0.0.0/0rpcuser=username, natürlich zu ersetzenrpcpassword=password, natürlich zu ersetzenDie vollständige Liste der Funktionen findet man unter https://jlopp.github.io/bitcoin-core-config-generator
Man kann auch alles mit einem einzigen Terminalbefehl erledigen.
cat >bitcoin.conf <<EOL
daemon=1
blocksonly=1
maxconnections=20
maxuploadtarget=500
txindex=1
blockfilterindex=1
rpcallowip=0.0.0.0/0
rpcbind=0.0.0.0
rpcuser=username
rpcpassword=password
EOL
Falls ein anderer bereits synchronisierter Node verfügbar ist, kann man die Option connect verwenden, um sich NUR UND AUSSCHLIESSLICH mit diesem Node zu verbinden. Befindet sich dieser Node im lokalen Netzwerk, spart man mit dieser einfachen Konfiguration Zeit und Bandbreite.
Seit Release 26 unterstützt Core mit der Option v2transport die Verschlüsselung der Kommunikation zwischen Nodes.
Alle gezeigten Konfigurationen beziehen sich auf clearnet. Die Konfigurationen für tor werden Thema einer anderen Lektion sein.
Wir starten Bitcoin, indem wir eine Startdatei für systemd erstellen.
sudo sh -c "cat > /etc/systemd/system/bitcoind.service <<EOL
[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
User=bitcoin
Group=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
ExecStart=/usr/local/bin/bitcoind -pid=/home/bitcoin/.bitcoin/bitcoind.pid
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
EOL"
Hinweis: In diesem Fall verwenden wir den Benutzer bitcoin, um die Software zu starten.
Nun können wir das erstellte Skript registrieren und starten.
sudo systemctl enable bitcoind
sudo systemctl start bitcoind
Jedes Mal, wenn man den Status der Software kontrollieren möchte, kann man den folgenden Befehl verwenden.
systemctl status bitcoind
Wir installieren Electrs, einen auf Rust basierenden Electrum-Server. Der erste Schritt ist daher die Installation dieser Sprache.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Wir installieren außerdem clang und das Paket build-essential.
apt update
apt install clang cmake build-essential -y
Wir laden die neueste Version, derzeit 0.10.5, von Github herunter.
VERSION="0.10.5"
git clone --branch v$VERSION https://github.com/romanz/electrs.git
cd electrs
Wir importieren den Schlüssel des Entwicklers von Electrs und prüfen die Signatur der Github-Commits.
curl https://romanzey.de/pgp.txt | gpg --import
git verify-tag v$VERSION
Wenn die Signatur korrekt ist, können wir zur Kompilierung übergehen …
cargo build --locked --release
und danach zur Installation.
sudo install -m 0755 -o root -g root -t /usr/local/bin ./target/release/electrs
Um Electrs zu konfigurieren, erstellen wir die Datei config.toml mit folgendem Inhalt.
# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"
# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"
Man kann auch alles mit einem einzigen Terminalbefehl erledigen.
cat >config.toml <<EOL
# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"
# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"
EOL
Wir können Elects mit dem Befehl starten
electrs --conf config.toml
und warten, bis electrs alle Blöcke indexiert hat.
Wie bei Bitcoin können wir die Software starten, indem wir ein Skript für systemd erstellen.
sudo sh -c "cat > /etc/systemd/system/electrs.service <<EOL
[Unit]
Description=Electrs daemon
After=bitcoind.target
[Service]
User=bitcoin
Group=bitcoin
Type=forking
ExecStart=/usr/local/bin/electrs --conf /home/bitcoin/electrs_config.toml
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
EOL"
Hinweis: In diesem Fall verwenden wir den Benutzer bitcoin, um die Software zu starten.
Nun können wir das erstellte Skript registrieren und starten.
sudo systemctl enable electrs
sudo systemctl start electrs
Jedes Mal, wenn man den Status der Software kontrollieren möchte, kann man den folgenden Befehl verwenden.
systemctl status electrs
Zu vervollständigen
Zu vervollständigen
Wir installieren mariadb.
sudo apt-get install mariadb-server mariadb-client
Und wir erstellen Datenbank und Benutzer.
sudo mysql -e "drop database mempool;"
sudo mysql -e "create database mempool;"
sudo mysql -e "grant all privileges on mempool.* to 'mempool'@'%' identified by 'mempool';"
sudo mysql -e "flush privileges;"
Wir klonen den Code
git clone https://github.com/mempool/mempool
cd mempool
latestrelease=$(curl -s https://api.github.com/repos/mempool/mempool/releases/latest|grep tag_name|head -1|cut -d '"' -f4)
git checkout $latestrelease
Wir stellen sicher, node 20.x und die neueste npm-Version zu verwenden.
sudo npm i -g npm
sudo npm i -g node@20
Wir kompilieren und testen das Backend
cd backend
npm install --no-install-links # npm@9.4.2 and later can omit the --no-install-links
npm run build
cp mempool-config.sample.json mempool-config.json
npm run start
Die Konfigurationen in mempool-config.json sorgfältig prüfen.
Wir wechseln zum Frontend.
cd ..
cd frontend
npm install
npm run serve:local-prod
Die Backend-Konfiguration befindet sich in der Datei mempool-config.json.
Wir können Mempool mit pm2 starten, das installiert werden muss.
sudo npm i -g pm2
pm2 startup
Wir starten das Backend.
cd ..
cd backend
pm2 start "npm run start"
Danach starten wir das Frontend.
cd ..
cd frontend
pm2 start "npm run serve:local-prod"
Wir speichern alles.
pm2 save
Wir beginnen mit der Installation von tor.
sudo apt install tor
und konfigurieren die tor-Konfigurationsdatei, um einen neuen hidden service zu erstellen, der Port 8333 des Nodes exportiert.
cat > /etc/tor/torrc <<EOL
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 8333 127.0.0.1:8333
EOL
Wir können tor neu starten, um die Änderungen anzuwenden. Dadurch können wir Port 8333 unseres Nodes exportieren, aber den Zugriff auf den Node noch nicht ausschließlich auf tor beschränken.
sudo systemctl restart tor
und die onion-Adresse des Nodes erhalten.
cat /var/lib/tor/hidden_service/hostname
Danach können wir den Zugriff auf den Node ausschließlich über tor beschränken, indem wir bitcoin.conf so ändern:
proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1:8333=onion
externalip=tor_url.onion
onlynet=onion
Dabei ist tor_url.onion die zuvor erhaltene onion-Adresse des Nodes.
Nach dem Neustart des Nodes können wir prüfen, dass der Node ausschließlich über tor erreichbar ist.
sudo systemctl restart bitcoind
bitcoin-cli getnetworkinfo
Hier sollten wir sehen, dass der Node ausschließlich über tor erreichbar ist, also dass nur das Netzwerk onion reachable ist.
Außerdem werden alle unsere Peers durch onion-Adressen identifiziert.
bitcoin-cli getpeerinfo
Hinweis: tor ist extrem langsam. Berücksichtigt das, wenn ihr den Node von null an synchronisieren wollt.
Ein nützliches Netzwerk zum Üben ist testnet, das sich von mainnet dadurch unterscheidet, dass:
Viele Wallets wie green, electrum, specter, sparrow und andere unterstützen testnet und können verwendet werden, um:
Einige nützliche Tools für testnet, Eigenwerbung:
Es gibt viele weitere Tools und Websites, die testnet unterstützen, zusätzlich zu den wichtigsten Block-Explorern.
Bitcoin-cli ist das Kommandozeilenwerkzeug zur Interaktion mit Bitcoin Core.
Die Befehle haben das Format:
bitcoin-cli [options] <command> [params]
und man kann immer help verwenden, um die Liste der Befehle oder Informationen zu einem bestimmten Befehl zu erhalten.
Einen vollständigen Kurs zur Nutzung von Bitcoin über die Kommandozeile findet man unter Learning-Bitcoin-from-the-Command-Line.
Die Installation des Nodes ist auf mehrere Lektionen verteilt. Hier ist eine Liste der bereits gehaltenen:
| Datum | Notizen |
|---|---|
| 240108-2100 | Auswahl der Hardware |
| 240115-2200 | Installation von core und Signaturprüfung |
| 240122-2200 | Minimalkonfiguration |