Grundlagen - Bitcoind und Docker ­čçę­čç¬

lcodes

2021/07/07

Categories: Tutorial Tags: bitcoin

Intro

Das Fundament f├╝r ein eigenes System abseits von Umbrel, Raspiblitz oder myNode im Lightning Netzwerk, ist ohne jede Frage eine Bitcoin Node, respektive eine Bitcoin-Core Wallet. Diese ist notwendig, damit ihr sp├Ąter mittels on-chain Transaktionen eure LN Kan├Ąle aufsetzen k├Ânnt. Aber nat├╝rlich auch zur st├Ąndigen Synchronisation wie sich z.B. Fundings ver├Ąndern. Eine Lightning Network Node ist ohne den Anschlu├č an eine BTC Core Wallet nicht m├Âglich. Eine eigene Node mit haus├╝blichen Mitteln aufzusetzen ist heutzutage auch kein Problem mehr, bitcoind ist bereits in einigen Distributionen vorhanden. In diesem Tutorial soll es jedoch darum gehen, sich ein eigenes Dockerfile anzulegen und den bitcoind in Zukunfst separiert von den restlichen Diensten auf dem System am laufen zu halten.

Setup

Fangen wir also an. Die folgenden Zeilen packt ihr in eine Datei mit dem Namen: Dockerfile

FROM debian
RUN apt-get update -y && apt-get upgrade -y && apt-get install apt -y
RUN apt-get install wget sudo vim gpg curl bash -y
RUN wget https://bitcoincore.org/bin/bitcoin-core-0.21.1/bitcoin-0.21.1-x86_64-linux-gnu.tar.gz
RUN wget https://bitcoincore.org/bin/bitcoin-core-0.21.1/SHA256SUMS.asc
RUN tar xzvf bitcoin-0.21.1-x86_64-linux-gnu.tar.gz
RUN cd bitcoin-0.21.1 && ls -al; cp bin/* /bin/;
RUN /bin/bitcoind --version

Bitte beachtet, dass ich die letzte mir bekannte Version genommen habe. Da ihr das Tutorial unter Umst├Ąnden zu einem sp├Ąteren Zeitpunkt vor Euch habt, pr├╝ft bitte die aktuelle Version hier. Ihr m├╝sst dann entsprechend der anderen Version die Zeilen mit wget und tar anpassen. Habt ihr das gemacht, k├Ânnt ihr mittels des Dockerfile euren ersten bitcoin Container selber erstellen:

docker build . -t lcodes-btc

Mit dem Flag -t geben wir unserem neuen Image den Namen: lcodes-btc. Ihr k├Ânnt diesen nat├╝rlich auch ganz anders nennen. Wenn alles geklappt hat, k├Ânnen wir jetzt den bitcoind im Docker dazu veranlassen uns seine Hilfetexte auszugeben:

$ docker run --rm -it lcodes-btc /bin/bitcoind --help
Bitcoin Core version v0.21.1

Usage:  bitcoind [options]                     Start Bitcoin Core

Options:

  -?
       Print this help message and exit

  -alertnotify=<cmd>
       Execute command when a relevant alert is received or we see a really
       long fork (%s in cmd is replaced by message)

Toll! Unser Container funktioniert und der Server Dienst bitcoind ist ebenfalls aufrufbar. Jetzt erstellen wir den Netzwerkbereich in dem BTC und LN in Zukunft zuhause sein werden. Ich selber habe eine IP Range von 172.20.0.0/16 f├╝r das Netz gew├Ąhlt. Ihr k├Ânnt nat├╝rlich auch hier andere Adressen zu Rate ziehen. Bitte bedenkt jedoch, dass ihr diese dann auch f├╝r alle weiteren Schritte anpassen m├╝sst. Erstellen wir also f├╝r unseren Anwednungsfall einen eigenen Netzbereich:

docker network create -d bridge --gateway 172.20.0.1 --ip-range 172.20.0.0/16 --subnet 172.20.0.0/24 lcodes-net
ff924640c1e8c2f246eeb3e6283460245013f649ea678ae54ad4ae3ec8b58ed6

docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
32c07558828b   bridge       bridge    local
016d31391873   host         host      local
ff924640c1e8   lcodes-net   bridge    local
b4d8f9403abf   none         null      local

Soweit so gut. Jetzt pr├╝fen wir, ob wir eine IP unserem lcodes-btc Docker zuweisen k├Ânnen. Dies ist notwendig, da wir bald an die Konfiguration gehen werden und BTC, LND sowie viele andere Services auf die Dienste der anderen Zugreifen m├╝ssen. Daher ist ein internes Docker Netzwerk eine sehr gute Idee.

$ docker run --rm --net=lcodes-net --ip=172.20.0.2 lcodes-btc ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
502: eth0@if503: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:14:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.20.0.2/24 brd 172.20.0.255 scope global eth0
       valid_lft forever preferred_lft forever

ip addr wird als Befehl an den gestarteten Docker weitergegeben. Dieser zeigt uns dann bereitwillig die IP Einstellungen. Et voila! Der Container hat die gew├╝nschte IP: 172.20.0.224. Perfekt. Jetzt legen wir noch ein bitcoin Volume an, dieses ist aus unserem normalen $HOME/lcodes/ erreichbar. Dies machen wir wie folgt:

docker run --rm --net=lcodes-net --ip=172.20.0.2 -v ~/lcodes/btc/:/root/.bitcoin lcodes-btc bitcoind -h

Wie ihr seht, ist jetzt noch ein neuer Abschnitt dazugekommen: -v ~/lcodes/btc/:/root/.bitcoin. Damit sagen wir Docker, dass alles unter dem Pfad ~/lcodes/btc/ im Docker unter /root/.bitcoin abgelegt werden soll. Wir haben uns damit ein Volume erstellt und auch w├Ąhrend des Betriebs von lcodes-btc Zugriff auf die Internas vom laufenden Daemon.

Weiter geht es mit der Konfiguration, wir starten einen Editor im ~/lcodes/btc Verzeichnis und nennen die Datei bitcoin.conf.

~/lcodes/btc $ vi bitcoin.conf

Die folgenden Zeilen f├╝gen wir hinzu.

# Connections
port=8333
rpcport=8332
rpcbind=172.20.0.2
rpcbind=127.0.0.1
rpcallowip=172.20.0.0/24
rpcallowip=127.0.0.1
rpcauth=rpcauth=bitcoin:ba2570476fcc5de711fb5ead21bdeb92$dd6857c1bdc93f843861f3c90f7478e83e2c2afc36d6cc3af324349a060f796c
# Memory
dbcache=200
maxmempool=300

# zmq
zmqpubrawblock=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334

# Indexes
txindex=1
blockfilterindex=1

# SPV
peerbloomfilters=1
peerblockfilters=1

Um bei rpcauth einen passenden Nutzer und ein passendes Passwort einzutragen nutzen wir das Skript aus dem bitcoin share: rpcauth.py

$ python3 rpcauth.py bitcoin sehrsehrsehrgeheim123
String to be appended to bitcoin.conf:
rpcauth=bitcoin:ba2570476fcc5de711fb5ead21bdeb92$dd6857c1bdc93f843861f3c90f7478e83e2c2afc36d6cc3af324349a060f796c
Your password:
sehrsehrsehrgeheim123

Wenn alles nach unseren Vorstellungen konfiguriert worden ist, k├Ânnen wir den Container starten. In diesem Tutorial verwende ich screen um die Dienste laufen zu lassen. Falls ihr das nicht wollt, k├Ânnt ihr anstelle von -ti im Dockerkomanndo auch einfach -d nutzen. Das -d steht f├╝r detach und ihr k├Ânnt ganz normal auf der Kommandozeile weiterarbeien. Um einen passenden screen zu starten verwende ich

screen -S lcodes-btc

Und in diesem dann die folgende Kommandozeile:

docker run --rm --name=lcodes-btc --net=lcodes-net -p 8333:8333 -p 127.0.0.1:8332:8332 --ip=172.20.0.2 -v ~/lcodes/btc/:/root/.bitcoin lcodes-btc bin/bitcoind

Hier wird nun der Bitcoind P2P Port an alle unsere Interfaces auf dem Host System gebunden und ist f├╝r alle Systeme aus dem Internet erreichbar. Der Port 8332, dabei handelt es sich um den Bitcoin RPC Port, lassen wir lediglich von lokalen Diensten ansprechen. Dies erh├Âht die Sicherheit. Ich verlasse den screen ohne diesen zu beenden durch CTRL+A-D. Jetzt bin ich wieder auf der vorherigen Kommandozeile. Wir pr├╝fen ob mit dem Container alles in Ordnung ist:

~/lcodes/btc # docker ps
CONTAINER ID   IMAGE        COMMAND          CREATED          STATUS          PORTS                                              NAMES
092e45511dcd   lcodes-btc   "bin/bitcoind"   33 seconds ago   Up 30 seconds   127.0.0.1:8332->8332/tcp, 0.0.0.0:8333->8333/tcp   blissful_cray

Wie sehen die Services von Seiten unseres Hosts aus:

~/lcodes/btc # ss -antpl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process                                     
LISTEN   0        4096           127.0.0.1:8332            0.0.0.0:*       users:(("docker-proxy",pid=971777,fd=4))   
LISTEN   0        4096             0.0.0.0:8333            0.0.0.0:*       users:(("docker-proxy",pid=971763,fd=4))   

Bitcoin P2P ist auf 0.0.0.0, also auf allen Interfaces gebunden und kann auch von externen Diensten erreicht werden, 8332/tcp ist auf localhost (127.0.0.1) angesiedelt und l├Ąsst sich dementsprechend nur von unserem System anfragen.

Wenn alles geklappt hat, verbindet sich unsere Core Wallet zu anderen Bitcoin Nodes im Internet und f├Ąngt an die Chain zu synchronisieren. Pr├╝fen k├Ânnen wir dies wie folgt:

docker logs -f 092e45511dcd
...
2021-07-02T08:53:35Z UpdateTip: new best=000000000000000016f6507dbc96ee6f3a7539a7396525c2e3912be467c1889c height=354203 version=0x00000003 log2_work=82.701063 tx=67086256 date='2015-04-29T09:38:16Z' progress=0.102181 cache=804.4MiB(6045958txo)
2021-07-02T08:53:35Z UpdateTip: new best=00000000000000001091ef1419848e9ec4463321bac1bc85b9f4f45b1914c411 height=354204 version=0x00000002 log2_work=82.701101 tx=67086384 date='2015-04-29T09:43:12Z' progress=0.102181 cache=804.4MiB(6045756txo)
...

Es wird flei├čig synchronisiert.

Ende

>> Home