Bitcoin Knots

Instal·lem Bitcoin Knots, una implementació de client alternativa de la xarxa Bitcoin.

Preparacions

L’aplicació Bitcoin Knots s’executarà en segon pla com a dimoni i utilitzarà l’usuari separat bitcoin per motius de seguretat. Aquest usuari no té drets d’administrador i no pot canviar la configuració del sistema.

Instal·leu dependències

Aquestes són dependències de construcció (es pot eliminar després de la instal·lació, si voleu)

$SU apk add --virtual .build-deps autoconf automake boost-dev clang chrpath \
    file gnupg libevent-dev libtool make pkgconf zeromq-dev

Aquestes són dependències en temps d’execució

$SU apk add libevent libsodium libstdc++ libzmq

Creeu l’usuari/grup bitcoin

$SU addgroup -S bitcoin
$SU adduser \
    -S \
    -D \
    -H \
    -h /dev/null \
    -s /sbin/nologin \
    -G bitcoin \
    -g bitcoin \
    bitcoin

Afegiu també l’usuari satoshi al grup bitcoin

$SU adduser satoshi bitcoin && exec su -l satoshi

Afegiu l’usuari bitcoin al grup tor

Això permet a l’usuari bitcoin utilitzar el port de control i configurar Tor directament

$SU adduser bitcoin tor

Creeu un enllaç simbòlic bitcoin a la casa de satoshi

ln -s /var/lib/bitcoind "$HOME/.bitcoin"

Instal·lació

A Bitcoin Knots >25.1 tots els filtres d‘“spam” estan actualitzats

Baixem l’últim codi font de Bitcoin Knots i comparem aquest fitxer amb la suma de verificació signada i marcada amb l’hora. Aquesta és una precaució per assegurar-nos que es tracta d’una versió oficial i no d’una versió maliciosa que intenta robar-nos els diners.

Descarrega el codi font

  • Inicieu sessió com a satoshi i canvieu a un directori temporal que s’esborrarà en reiniciar
cd /tmp
  • Establiu una variable d’entorn de versió temporal a la instal·lació
VERSION=27.1.knots20240801
  • Obteniu el codi font i les signatures més recents
wget https://bitcoinknots.org/files/${VERSION%%.*}.x/$VERSION/bitcoin-$VERSION.tar.gz \
    https://bitcoinknots.org/files/${VERSION%%.*}.x/$VERSION/SHA256SUMS \
    https://bitcoinknots.org/files/${VERSION%%.*}.x/$VERSION/SHA256SUMS.asc

Comprovació de la suma de comprovació

  • Comproveu que la suma de comprovació de referència del fitxer SHA256SUMS coincideixi amb la suma de comprovació calculada per vosaltres
grep bitcoin-$VERSION.tar.gz SHA256SUMS | sha256sum -c
output
bitcoin-$VERSION.tar.gz: OK

Comprovació de la signatura

Els llançaments de Bitcoin estan signats per diverses persones, cadascuna utilitzant la seva pròpia clau. Per verificar la validesa d’aquestes signatures, primer heu d’importar les claus públiques corresponents a la vostra base de dades de claus GPG.

  • La següent comanda baixa i importa automàticament totes les signatures de les certificacions de llançament de Bitcoin Core (Guix) repositori
wget -qO- \
    "https://api.github.com/repos/bitcoinknots/guix.sigs/contents/builder-keys" |\
    grep download_url |\
    grep -oE "https://[a-zA-Z0-9./-]+" |\
    while read url; do \
        wget -qO- "$url" |\
        gpg --import \
    ; done
  • Verifiqueu que el fitxer de sumes de comprovació estigui signat criptogràficament amb les claus de signatura de la versió. L’ordre següent imprimeix comprovacions de signatura per a cadascuna de les claus públiques que van signar les sumes de comprovació
gpg --verify SHA256SUMS.asc
  • Comproveu que almenys algunes signatures mostrin el text següent
output
gpg: Good signature from...
Primary key fingerprint:...

Extreu la font

Si esteu satisfet amb les comprovacions de la suma de verificació i la signatura, extreu el codi font de Bitcoin Knots

tar xzf bitcoin-$VERSION.tar.gz && cd bitcoin-$VERSION

Configurar, compilar i instal·lar

Per comoditat, pot ser útil tenir la pàgina de manual de bitcoin-cli a la mateixa màquina perquè es puguin consultar fora de línia, està instal·lada per defecte en aquesta guia

Si NO ho voleu, executeu-ho

MAN=--disable-man
./autogen.sh
./configure \
    --prefix=/usr \
    "${MAN:---mandir=/usr/share/man}" \
    --with-daemon \
    --with-utils \
    --without-bdb \
    --without-gui \
    --without-libs \
    --without-qrencode \
    --enable-hardening \
    --enable-lto \
    --enable-reduce-exports \
    --enable-static \
    --disable-bench \
    --disable-ccache \
    --disable-fuzz \
    --disable-fuzz-binary \
    --disable-gui-tests \
    --disable-maintainer-mode \
    --disable-shared \
    --disable-tests \
    --disable-wallet
make
$SU make install
[ -z $MAN ] && $SU apk add mandoc man-pages
$SU install -D -m 0660 -o bitcoin -g bitcoin ./share/examples/bitcoin.conf /etc/bitcoin/bitcoin.conf

”Strip” els binaris instal·lats

$SU strip -v /usr/bin/bitcoin*

Neteja

cd
rm -rf /tmp/bitcoin-${VERSION}* /tmp/SHA256SUMS /tmp/SHA256SUMS.asc
$SU apk del .build-deps

Genera credencials d’accés

Perquè altres programes consultin Bitcoin Knots necessiten les credencials d’accés adequades. Per evitar emmagatzemar el nom d’usuari i la contrasenya en un fitxer de configuració en text sense format, la contrasenya és hasheja. Això permet que Bitcoin Knots accepti una contrasenya, l’hash i la compare amb el hash emmagatzemat, mentre que no és possible recuperar la contrasenya original.

Una altra opció per obtenir les credencials d’accés és a través del fitxer .cookie al directori de dades de Bitcoin. Això es crea automàticament i pot ser llegit per tots els usuaris que són membres del grup “bitcoin”.

Bitcoin Knots proporciona un script python senzill per generar la línia de configuració per al fitxer de configuració.

Però preferim fer-ho a la nostra manera, molt més senzill

La següent comanda demanarà el nom d’usuari i la contrasenya RPC. La contrasenya serà hashada i emmagatzemada al fitxer bitcoin.conf. Copia i enganxa la següent comanda al teu terminal i prem Enter

clear && \
printf "Enter the RPC username: " && \
read -r username; \
[ ! "$username" ] && { 
    printf "\033[38;5;1m%s\033[m\n" "Error, must provide username"; kill -SIGINT $$
} || \
printf "Enter the [ B ] RPC password: " && \
stty -echo && \
read -r password; \
stty echo && \
[ ! "$password" ] && { 
    printf "\033[38;5;1m%s\033[m\n" "Error, must provide password"; kill -SIGINT $$
} || {
    sed "s/^#*rpcauth=.*$/rpcauth=${username}:${salt=$(openssl rand -hex 16)}\$$(\
            printf "%s" "${password}" | \
            openssl dgst -sha256 -hmac "$salt" | \
            awk '{print $2}' \
        )/" /etc/bitcoin/bitcoin.conf > _; \
    unset salt; \
    $SU mv -f _ /etc/bitcoin/bitcoin.conf && \
    printf "\n\033[38;5;34m%s\033[m\n" \
        "Done! The password hash is stored in the bitcoin.conf file" 
}

Configuració

⚠️

"dbcache=..." s’ha d’ajustar a la capacitat del vostre maquinari

  • Modifiqueu/descomenteu aquestes línies. Guardeu i sortiu.
$SU $EDITOR /etc/bitcoin/bitcoin.conf
/etc/bitcoin/bitcoin.conf
[...]
assumevalid=0
[...]
blockfilterindex=1
[...]
blocksonly=1
[...]
coinstatsindex=1
[...]
dbcache=8192
[...]
txindex=1
[...]
bind=127.0.0.1
[...]
i2psam=127.0.0.1:7656
[...]
listen=1
[...]
peerblockfilters=1
[...]
peerbloomfilters=1
[...]
proxy=127.0.0.1:9050
[...]
zmqpubhashblock=tcp://127.0.0.1:8433
[...]
zmqpubrawblock=tcp://127.0.0.1:28332
[...]
zmqpubrawtx=tcp://127.0.0.1:28333
[...]
debug=i2p
debug=tor
[...]
datacarrier=0
[...]
permitbaremultisig=0
[...]
server=1
[...]
💡

Comproveu aquesta configuració de mostra de Bitcoin Knots al navegador web

Dispositius de baix rendiment
/etc/bitcoin/bitcoin.conf
[...]
# Slow devices optimizations
## Limit the number of max peers connections
maxconnections=40
[...]
## Tries to keep outbound traffic under the given target per 24h
maxuploadtarget=5000
[...]
## Increase the number of threads to service RPC calls (default: 4)
rpcthreads=128
[...]
## Increase the depth of the work queue to service RPC calls (default: 16)
rpcworkqueue=256
[...]
#coinstatsindex=1
[...]
#assumevalid=0
[...]
💡

Tingueu en compte que amb el paràmetre maxuploadtarget activat, necessitareu afegir a la llista blanca la connexió a Electrs i Bisq afegint aquests paràmetres a bitcoin.conf:

  • Electrs: whitelist=download@127.0.0.1
  • Bisq: whitelist=bloomfilter@192.168.0.0/16

Crea el servei init.d

El sistema ha d’executar el dimoni bitcoin automàticament en segon pla, fins i tot quan ningú ha iniciat sessió. Utilitzem openrc, un dimoni que controla el procés d’inici mitjançant fitxers de configuració.

  • Crea la configuració d’init.d
$SU $EDITOR /etc/init.d/bitcoind
  • Introdueix la configuració següent completa. Guarda i surt
/etc/init.d/bitcoind
#!/sbin/openrc-run
 
: ${BITCOIND_CONFIGFILE:=/etc/bitcoin/bitcoin.conf}
: ${BITCOIND_DATADIR:=/var/lib/bitcoind}
: ${BITCOIND_LOGDIR:=/var/log/bitcoind}
: ${BITCOIND_USER:=bitcoin}
: ${BITCOIND_GROUP:=bitcoin}
: ${BITCOIND_BIN:=/usr/bin/bitcoind}
: ${BITCOIND_OPTS=${BITCOIND_OPTS}}
: ${BITCOIND_SIGTERM_TIMEOUT:=600}
 
BITCOIND_PIDDIR="/run/bitcoind"
 
name="Bitcoin Knots daemon"
description="Bitcoin cryptocurrency P2P network daemon"
 
required_files="${BITCOIND_CONFIGFILE}"
pidfile="${BITCOIND_PIDDIR}/${SVCNAME}.pid"
retry="${BITCOIND_SIGTERM_TIMEOUT}"
 
command="${BITCOIND_BIN}"
command_args="-pid=${pidfile}
              -conf=${BITCOIND_CONFIGFILE}
              -datadir=${BITCOIND_DATADIR}
              -debuglogfile=${BITCOIND_LOGDIR}/debug.log
              ${BITCOIND_OPTS}"
command_args_background="-daemonwait"
command_user="${BITCOIND_USER}:${BITCOIND_GROUP}"
 
depend() {
    use net
    need localmount
    checkdepend onion tor
    checkdepend i2psam i2pd
    after logger firewall
}
 
checkdepend() {
    if grep -qs "^${1}=" "${BITCOIND_CONFIGFILE}"; then
        need "${2:-$1}"
    fi
}
 
start_pre() {
    checkpath --file      --mode 0660 --owner "${command_user}" "${BITCOIND_CONFIGFILE}"
    checkpath --directory --mode 0750 --owner "${command_user}" "${BITCOIND_DATADIR}"
    checkpath --directory --mode 0755 --owner "${command_user}" "${BITCOIND_LOGDIR}"
    checkpath --directory --mode 0755 --owner "${command_user}" "${BITCOIND_PIDDIR}"
    checkconfig
}
 
start_post() {
    chmod -R u=rwX,g=rX,o= "${BITCOIND_DATADIR}" "${BITCOIND_LOGDIR}"
}
 
checkconfig() {
    if ! grep -qs '^rpcauth=' "${BITCOIND_CONFIGFILE}"
    then
        eerror ""
        eerror "ERROR: You must set a secure rpcauth to run bitcoind."
        eerror "The setting must appear in ${BITCOIND_CONFIGFILE}"
        eerror ""
        eerror "This auth is security critical to securing wallets "
        eerror "and must not be the same as the rpcuser setting."
        eerror ""
        eerror "It is recommended that you also set alertnotify so you are "
        eerror "notified of problems:"
        eerror ""
        eerror "ie: alertnotify=echo %%s | mail -s \"Bitcoin Alert\"" \
            "admin@foo.com"
        eerror ""
        return 1
    fi
}
  • Habilita el permís d’execució
$SU chmod +x /etc/init.d/bitcoind
  • Habilita l’arrencada automàtica
$SU rc-update add bitcoind default

Crea la configuració de logrotate

Logrotate és una utilitat del sistema que gestiona la compressió i la rotació dels fitxers de registre en sistemes Linux. Si els registres no roten, es comprimeixen i es purguen periòdicament, eventualment poden consumir tot l’espai de disc disponible al sistema. Permet la rotació, la compressió, l’eliminació i l’enviament automàtic dels fitxers de registre. Cada fitxer de registre es pot gestionar diàriament, setmanalment, mensualment o quan creixi massa.

Normalment, logrotate s’executa com un treball cron diari.

  • Creeu el fitxer de configuració de bitcoin logrotate
$SU $EDITOR /etc/logrotate.d/bitcoind
  • Introdueix la configuració següent completa. Guarda i surt
/etc/logrotate.d/bitcoind
/var/log/bitcoind/*.log {
    weekly
    missingok
    rotate 104
    compress
    delaycompress
    notifempty
    create 0640 bitcoin bitcoin
    sharedscripts
    postrotate
        kill -HUP `cat /run/bitcoind/bitcoind.pid`
    endscript
}
  • Prova
$SU logrotate /etc/logrotate.d/bitcoind --debug

Executa

  • Inicia el servei
$SU rc-service bitcoind start
  • Comprova els registres
tail -f /var/log/bitcoind/debug.log
output
2024-01-17T13:48:34Z Bitcoin Core version v26.0.0 (release build)
2024-01-17T13:48:34Z InitParameterInteraction: parameter interaction: -blocksonly=1 -> setting -whitelistrelay=0
2024-01-17T13:48:34Z InitParameterInteraction: parameter interaction: -blocksonly=1 -> setting -maxmempool=5
2024-01-17T13:48:34Z Using the 'sse4(1way),sse41(4way),avx2(8way)' SHA256 implementation
2024-01-17T13:48:34Z Using RdSeed as an additional entropy source
2024-01-17T13:48:34Z Using RdRand as an additional entropy source
2024-01-17T13:48:34Z Default data directory /dev/null/.bitcoin
2024-01-17T13:48:34Z Using data directory /var/lib/bitcoind
2024-01-17T13:48:34Z Config file: /etc/bitcoin/bitcoin.conf
2024-01-17T13:48:34Z Config file arg: assumevalid="0"
2024-01-17T13:48:34Z Config file arg: blockfilterindex="1"
2024-01-17T13:48:34Z Config file arg: blocksonly="1"
2024-01-17T13:48:34Z Config file arg: coinstatsindex="1"
2024-01-17T13:48:34Z Config file arg: daemon="1"
2024-01-17T13:48:34Z Config file arg: dbcache="24576"
2024-01-17T13:48:34Z Config file arg: debug="i2p"
2024-01-17T13:48:34Z Config file arg: debug="tor"
2024-01-17T13:48:34Z Config file arg: debuglogfile="/var/log/bitcoind/debug.log"
2024-01-17T13:48:34Z Config file arg: i2psam="127.0.0.1:7656"
2024-01-17T13:48:34Z Config file arg: onion="127.0.0.1:9050"
2024-01-17T13:48:34Z Config file arg: peerblockfilters="1"
2024-01-17T13:48:34Z Config file arg: peerbloomfilters="1"
2024-01-17T13:48:34Z Config file arg: rpcauth=****
2024-01-17T13:48:34Z Config file arg: server="1"
2024-01-17T13:48:34Z Config file arg: startupnotify="chmod -R u=rwX,g=rX,o= /var/lib/bitcoind /var/log/bitcoind"
2024-01-17T13:48:34Z Config file arg: txindex="1"
2024-01-17T13:48:34Z Config file arg: v2transport="1"
2024-01-17T13:48:34Z Command-line arg: conf="/etc/bitcoin/bitcoin.conf"
2024-01-17T13:48:34Z Command-line arg: datadir="/var/lib/bitcoind"
2024-01-17T13:48:34Z Command-line arg: pid="/run/bitcoind/bitcoin.pid"
2024-01-17T13:48:34Z Command-line arg: server=""
[...]
2024-01-17T13:48:46Z Pre-synchronizing blockheaders, height: 2000 (~0.25%)
[...]

Superviseu el fitxer de registre durant uns minuts per veure si funciona bé (pot aturar-se a la dnsseed thread exit, això està bé)

  • Espereu uns minuts fins que s’iniciï Bitcoin Core i introduïu la següent ordre per obtenir les vostres adreces Tor i I2P. Preneu-ne nota, més endavant potser ho necessiteu
bitcoin-cli getnetworkinfo | grep 'address.*\.onion\|address.*\.i2p'
output
"address": "vctk9tie5srguvz262xpyukkd7g4z2xxxy5xx5ccyg4f12fzop8hoiad.onion",
"address": "sesehks6xyh31nyjldpyeckk3ttpanivqhrzhsoracwqjxtk3apgq.b32.i2p",
  • Comproveu l’habilitació correcta de les xarxes I2P i Tor
bitcoin-cli -netinfo
output
Bitcoin Core client v26.0.0 - server 70016/Satoshi:26.0.0/
          ipv4    ipv6   onion   i2p   total   block
in          0       0      25     2      27
out         7       0       2     1      10       2
total       7       0      27     3      37
 
Local addresses
xdtk6tie4srguvz566xpyukkd7m3z3vbby5xx5ccyg5f64fzop7hoiab.onion     port   8333    score      4
etehks3xyh55nyjldjdeckk3nwpanivqhrzhsoracwqjxtk8apgk.b32.i2p       port      0    score      4
  • Assegureu-vos que bitcoind escolti als ports RPC i P2P predeterminats
$SU netstat -lntup | grep LISTEN | grep bitcoind
output
tcp        0      0 0.0.0.0:8333            0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 127.0.0.1:8334          0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 127.0.0.1:8332          0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 127.0.0.1:8433          0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 127.0.0.1:28332         0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 127.0.0.1:28333         0.0.0.0:*               LISTEN      28295/bitcoind
tcp        0      0 :::8333                 :::*                    LISTEN      28295/bitcoind
tcp        0      0 ::1:8332                :::*                    LISTEN      28295/bitcoind

Tingueu en compte:

  • Quan bitcoind encara s’està iniciant, és possible que rebeu un missatge d’error com “verifying blocks”. Això és normal, només doneu-li uns minuts.

  • Entre altres dades, es mostra el “verificationprogress”. Un cop aquest valor arriba a gairebé 1 (0,99999…), la cadena de blocs està actualitzada i totalment validada.

Bitcoin Knots s’està sincronitzant

Això pot trigar entre un dia i una setmana, depenent principalment del rendiment del vostre ordinador. El millor és esperar fins que s’hagi completat la sincronització abans de continuar.

Explora bitcoin-cli

Si tot funciona bé, aquest és el moment perfecte per familiaritzar-se amb Bitcoin, els aspectes tècnics de Bitcoin Core, i jugar amb bitcoin-cli fins que la cadena de blocs estigui al dia.

  • The Little Bitcoin Book és una fantàstica introducció a Bitcoin, centrada en el “per què” i menys en el “com”.

  • Mastering Bitcoin d’Andreas Antonopoulos és un bon punt de partida, especialment el capítol 3 (ignoreu la primera part com compilar des del codi font):

    • Definitivament heu de tenir una còpia real d’aquest llibre!
    • llegiu-lo en línia a GitHub

Activeu mempool i reduïu ‘dbcache’ després d’una sincronització completa

Un cop Bitcoin Knots estigui completament sincronitzat, podem reduir la mida de la memòria cau de la base de dades. Una memòria cau més gran accelera la descàrrega inicial del bloc, ara volem reduir el consum de memòria per permetre que el client Lightning i el servidor Electrum funcionin en paral·lel. Ara també volem habilitar el node per escoltar i transmetre transaccions.

  • Comenta les línies següents al fitxer bitcoin.conf
💡

Bitcoin Knots només utilitzarà la mida de memòria cau predeterminada de 450 MiB en lloc de la configuració de la memòria RAM. Si blocksonly=1 es deixa sense comentar, evitarà que Electrum Server rebi dades de tarifes RPC i no funcionarà.

$SU $EDITOR /etc/bitcoin/bitcoin.conf
/etc/bitcoin/bitcoin.conf
#dbcache=2048
#blocksonly=1
#assumevalid=0
  • Reinicieu Bitcoin Knots perquè la configuració tingui efecte
$SU rc-service bitcoind restart

Actualització

La darrera versió es pot trobar a la pàgina de Github del projecte Bitcoin Knots. Llegiu sempre les RELEASE NOTES primer! Quan s’actualitza, pot haver-hi canvis o canvis en l’estructura de dades que necessiten una atenció especial. Substituïu el valor de la variable d’entorn VERSION=x.xx per a la darrera versió si encara no s’ha modificat en aquesta guia.