BTC RPC Explorer

7 Min. Lesedauer
Von FuSsY
BTC RPC Explorer

Self-Hosted Bitcoin Explorer für alle Bitcoin Core Nodebetreiber (by janoside ThX!)


Dies ist ein selbstgehosteter Explorer für die Bitcoin-Blockchain, der durch RPC-Aufrufe auf unseren eigenen Bitcoin Node gesteuert wird. Er ist einfach zu betreiben und kann mit anderen Tools (wie Electrum-Servern) verbunden werden, um einen vollwertigen Explorer zu erhalten.

Mit dem BTC RPC Explorer können wir nicht nur die Blockchain, sondern auch alle funktionalen Möglichkeiten unseres Node erkunden.

Features

  • Dashboard mit Netzwerkübersicht
  • Anzeige von Details zu Blöcken, Transaktionen und Adressen
  • Analysetools zur Anzeige von Statistiken über Blöcke, Transaktionen und Miner-Aktivitäten
  • JSON REST API
  • Raw JSON-Inhalt von bitcoind, der zur Erstellung der meisten Seiten verwendet wird
  • Suche nach Transaktions-ID, Block-Hash/Höhe und Adresse
  • Optionaler Transaktionsverlauf für Adressen durch Abfrage von Electrum- & Index Servern wie z. B. Electrs, ElectrumX oder Fulcrum. (Optional und abschaltbar im PrivacyMode auch via blockchain.com, blockchair.com oder blockcypher.com)
  • Mempool-Zusammenfassung mit Aufschlüsselung von Gebühren, Größe und Alter
  • RPC-Befehlsbrowser und Terminal
raw JSON content BtcCore


Was wird auf dem System benötigt...?!

  • Die Installation hier bezieht sich auf Debian / Ubuntu Systeme mit einer laufenden Btc-Core und Fulcrum Instanz.
  • Wir benötigen Node.JS v18.x (Installation erledigen wir hier step-by-step)
  • Nginx (engine X) als SSL reverse proxy (Installation erledigen wir hier auch step-by-step)
  • Einen neuen Nicht-Root $USER
  • In der Bitcoin-Core Konfig (bitcoin.conf) muss txindex=1 gesetzt sein

Vorbereitung der Installation

sudo apt update && sudo apt upgrade
sudo apt install git curl gnupg2 ca-certificates lsb-release debian-archive-keyring

Import der Nginx - Repo und Signing Keys

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Wir checken den Inhalt des Download auf den korrekten GPG Schlüssel

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Die Ausgabe sollte so aussehen... checkt die Richtigkeit des Schlüssel anhand des Fingerprint, Datum ect.!

pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62                        uid   nginx signing key <[email protected]>

Stimmt etwas nicht, löscht den Key und checkt das alles korrekt abläuft!

Wir setzen das Apt Repo zu Nginx Stable und pinnen unser Repo über das (veraltete) debian / ubuntu main Repo

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

Installation Nginx last stable...

sudo apt update
sudo apt install nginx

Check der installierten Version...

apt policy nginx

>nginx:
  Installiert:           1.24.0-1~bookworm
  Installationskandidat: 1.24.0-1~bookworm

Done...!

Konfiguration Nginx als Reverse Proxy

Wir erstellen uns ein Open-SSL Self-Signed Zertifikat

sudo openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/CN=localhost" -days 3650

Damit Nginx als reiner Reverse-proxy und nicht als Webserver fungiert erstellen wir ein Backup der orig. Konfig und setzen eine eigene Konfigurationsdatei.

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
sudo nano /etc/nginx/nginx.conf

Kopiert die kommenden Zeilen komplett in die neue, leere nginx.conf:

user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  worker_connections 768;
}

stream {
  ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
  ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 4h;
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;

  include /etc/nginx/streams-enabled/*.conf;

}

Strg+x, Enter zum speichern.

Wir erstellen ein Verzeichnis für zukünftige Zugriffe auf unseren Nginx Reverse-proxy.

sudo mkdir /etc/nginx/streams-enabled

Selbsttest der angelegten Konfig und Pfade mit:

sudo nginx -t

> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful

Done...!

Achtung bei dem Fehler: "unknown directive stream", benötigen wir das Paket "libnginx-mod-stream" (Das Stream-Modul unterstützt Loadbalancing & Proxying auf TCP-Servern).

sudo apt install libnginx-mod-stream


Installation Node.js Version 18.x

Wir fügen das Nodesource Repo und die Signing-Keys von Node.js in unsere Apt Liste ein.

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\
sudo apt install -y nodejs

Check der installierten Node Version...

node -v
> v18.x.x

Done...!


Jetzt können wir eine Konfigdatei für Nginx anlegen um unsere BTC-RPC-Explorer Anfragen über den verschlüsselten HTTPS Reverse Proxy zu leiten.

Dazu legen wir eine kleine .conf Datei in unserem /etc/nginx/streams-enabled Verzeichnis an:

sudo nano /etc/nginx/streams-enabled/btcrpcexplorer-reverse-proxy.conf

Kopiert alle Zeilen in die leere Datei...

upstream btcrpcexplorer {
  server 127.0.0.1:3002;
}
server {
  listen 4000 ssl;
  proxy_pass btcrpcexplorer;
}

Check der Nginx Konfig...

sudo nginx -t

> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart des Nginx Service...

sudo systemctl restart nginx

Done...!

Falls eine Firewall konfiguriert ist, geben wir den TCP Port 4000 frei. Im Beispiel UFW:

sudo ufw allow 4000/tcp
sudo ufw status

> To                         Action      From
> --                         ------      ----
> 4000/tcp                   ALLOW IN    Anywhere (kann angepasst werden)



Installation des BTC RPC Explorer

Wir legen einen neuen $USER auf unserem Node an. Dieser User wird ohne "sudo" Rechte und ohne Passwort erstellt. Unter diesem User wird unser BTC-Explorer laufen. Das bringt einen Sicherheitsvorteil falls der Prozess kompromitiert werden sollte. Da der User keine Rechte am laufenden System besitzt, kann nicht ohne weiteres großer Schaden angerichtet werden.

Dieser Schritt ist optional und kann wenn gewünscht übersprungen werden.

Anlegen des $USER und hinzufügen zur Usergroup "Group unter der auch Bitcoin Core läuft".

sudo adduser --disabled-password --gecos "" btcrpcexplorer

Hinzufügen des neuen User zur Gruppe des BitcoinCore Users.

sudo usermod -aG name-der-gruppe btcrpcexplorer

Falls ihr unsicher seid, welcher Group der BtcCore User zugeordnet ist, könnt ihr euch eine Liste im Terminal ausgeben lassen...

groups
> "user-name" cdrom floppy sudo audio dip video plugdev users netdev

Oder ihr lasst euch das bitcoind.service File anzeigen mit:

sudo nano /etc/systemd/system/bitcoind.service

Hier findet ihr unter dem Punkt Directory creation and permissions den User=euren-btc-user und Group=eure-btc-user-group.


Wir wechseln die Terminalsitzung zum neuen User mit...

sudo su btcrpcexplorer

... und setzen in unserem Terminal eine temporäre Umgebungsvariable "Version" für die Installation...

VERSION=3.4.0

... anschließend laden wir den original Source Code vom Explorer direkt bei Github runter und installieren diesen:

git clone --branch v$VERSION https://github.com/janoside/btc-rpc-explorer.git

cd ~/btc-rpc-explorer

npm install

Check ob die installierte Version passt:

cd ~/btc-rpc-explorer
npm version

> Ausgabe der ersten Zeilen...
> {
  'btc-rpc-explorer': '3.4.0',
  npm: '10.2.3',
  node: '18.19.0',

Done...!

Konfiguration des Explorers für den RPC Zugriff auf unseren BTC Node

Weiterhin angemeldet als User "btcrpcexplorer" kopieren wir uns das Sample-File .env-sample im Verzeichnis ~/btc-rpc-explorer

cp .env-sample .env
nano .env

Hier setzen wir unsere Settings zur Kommunikation mit Btc-Core und dem Indexer (ElectrumX/Fulcrum ect.). Entfernt die # um die betreffenden Zeilen zu aktivieren!

BTCEXP_BITCOIND_HOST=127.0.0.1
BTCEXP_BITCOIND_PORT=8332
BTCEXP_BITCOIND_COOKIE=/home/euer-btccore-user/.bitcoin/.cookie

Um Adressbestände abzufragen brauchen wir unseren Electrum-/Fulcrum Server. Alternativ kann ein externer Dienst genutzt werden, was ich aus Privacytechnischen Gründen NICHT empfehlen möchte. Wir setzen hier die lokale Adresse unseres Fulcrum Server:

BTCEXP_ADDRESS_API=electrum
BTCEXP_ELECTRUM_SERVERS=tcp://127.0.0.1:50002

Weiter unten haben wir die Möglichkeit uns für den "Normalen" Mode(externe Abfragen wie Exchange / Fiat Rates) oder den "Privacy" Mode (keinerlei externe Abfragen) des Explorers zu entscheiden.

Privacy Mode:

BTCEXP_PRIVACY_MODE=true
BTCEXP_NO_RATES=true

Normaler Mode (gibt mehr Infos aus):

BTCEXP_PRIVACY_MODE=false
BTCEXP_NO_RATES=false

Optional können wir ein Passwort für die BTC-Explorer Website setzen (der username spielt keine Rolle und kann nach Lust und Laune vergeben werden):

BTCEXP_BASIC_AUTH_PASSWORD=mein-superstarkes-passwort

Desweiteren kann man sich zwischen einem Light - & Darktheme entscheiden (default ist Dark):

BTCEXP_UI_THEME=light

Installiert ihr den Explorer auf einem Low-end oder Ein-Platinen Board wie Raspi ect., kann der Timeoutwert zum Bitcoin-Core erhöht werden.

BTCEXP_BITCOIND_RPC_TIMEOUT=10000 #default=5000

Strg+X, Enter zum speichern...

Done...!


Anlegen eines Service-File für den Autostart nach Boot/Reboot unseres BTC Node

Wir beenden unsere Terminalsession des btcrpcexplorer Users mit "exit" und legen den Systemd Service mit unserem Sudo User an.

sudo nano /etc/systemd/system/btcrpcexplorer.service
[Unit]
Description=BTC RPC Explorer
After=bitcoind.service fulcrum.service ##oder eurem "indexer.service"
PartOf=bitcoind.service

[Service]
WorkingDirectory=/home/btcrpcexplorer/btc-rpc-explorer
ExecStart=/usr/bin/npm start
User=btcrpcexplorer

Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Service zum Autostart auf enabled setzen und Reload des Systemd Daemon.

sudo systemctl enable btcrpcexplorer.service
sudo systemctl daemon-reload
sudo systemctl start btcrpcexplorer.service

Check ob der Service läuft:

sudo systemctl status btcrpcexplorer.service

Ausgabe sollte so aussehen...

Nun könnt ihr im Browser auf eurem PC die Explorer Website öffnen...

Gebt hierzu die Adresse / IP eures Node inklusive https:// und dem Port 4000 ein. Beispiel:

https://192.169.0.100:4000 oder https://mein-local-node:4000

Ihr solltet nun eine Warnung wegen des self-signed SSL Zertifikat von Nginx bekommen... diese einfach akzeptieren und eure Seite anzeigen.


Optionaler externer Zugriff aus dem Internet via Onion-Service

Wir gehen in diesem Guide davon aus, dass Tor bereits funktionsfähig installiert und als Service fest am Node eingebunden ist... falls das, warum auch immer, nicht der Fall sein sollte hat Mike ein Videoguide dazu auf seinem Kanal ;)

Wir erstellen uns für den Remotezugriff einen Onion-Service, der direkt und ohne weitere Einstellungen am Router / Firewall, mit unserem BTC-RPC-Explorer kommuniziert.

sudo nano /etc/tor/torrc

Am Ende der Konfig fügen wir unseren Service ein...

# Hidden Service BTC-RPC-Explorer
HiddenServiceDir /var/lib/tor/hidden_service_btcrpcexplorer/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:3002

Danach müssen wir den Tor Service restarten...

sudo systemctl restart tor

... und können nun unsere Onion-URL abfragen:

sudo cat /var/lib/tor/hidden_service_btcrpcexplorer/hostname
Ausgabe:
> unseresupergeheimeOnionAdresse.onion

Mit dieser Onion-URL können wir nun weltweit über den Tor Browser auf unseren Explorer zugreifen.

Viel Spass damit. Ist ein nettes Spielzeug... cheers ;)

Monero Beer:

88qWZmAZ6AjGvnqNfBseVUHuXn7jppJ13j2aTe4Tp4qjKN7J5DKCZw9C8dhR7msN9BKfTKgMaJo18Tj9hPL9PUbw6CixQas

Onchain / LN Beer: https://coinos.io/FuSsY

Beer over Onion


Informationsquellen waren...

Github.com

Raspibolt.org (ThX für die informative Seite!)

Nginx.org

Digitalocean.com

... and many more ...