Mempool Space

El Mempool és un visualitzador/explorador de la blockchain i mempool de Bitcoin autoallotjat. Busca les teves operacions en cadena i estima les comissions de les transaccions sense cap fuita de privacitat.

Mempool Space preview

Preparacions

Indexació de transaccions

Perquè el Mempool Space funcioni, necessiteu el vostre node complet per indexar totes les transaccions.

  • Si heu seguit aquesta guia, el paràmetre d’índex de transaccions ja està habilitat (txindex=1) i podeu saltar a la secció següent.
  • Si no és així, cal que configureu el paràmetre txindex=1 al fitxer de configuració del vostre client Bitcoin (bitcoin.conf): Configuració del node Bitcoin.
  • Després d’afegir el paràmetre, reinicieu el client Bitcoin, que ara indexarà tota la cadena de blocs
$SU rc-service bitcoind restart

Tingueu en compte que la reindexació pot trigar més d’un dia. Podeu seguir el progrés utilitzant

tail -f /var/log/bitcoind/debug.log

Instal·leu dependències

  • Instal·leu Node.js mitjançant el gestor de paquets apk.

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

$SU apk add --virtual .build-deps cargo git gnupg npm rsync

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

$SU apk add mariadb mariadb-client nodejs-current

Creeu l’usuari/grup mempool

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

Afegeix l’usuari mempool al grup bitcoin

$SU adduser mempool bitcoin

Afegiu també l’usuari satoshi al grup mempool

$SU adduser satoshi mempool

Servidor intermediari invers

A la secció de Seguretat, hem configurat un servidor intermediari invers. Ara podem afegir la configuració de Mempool Space.

  • Habilita el servidor intermediari invers per encaminar el trànsit HTTPS extern xifrat internament cap a Mempool Space
$SU $EDITOR /etc/caddy/sites/mempool-space.caddy
/etc/caddy/sites/mempool-space.caddy
:4081 {
    import tls
    root /var/www/mempool/browser
 
    handle /api/v1/* {
        reverse_proxy 127.0.0.1:8999
    }
 
    handle /api/* {
        uri replace /api/ /api/v1/
        reverse_proxy 127.0.0.1:8999
    }
 
    handle {
        map {header.accept-language} {header_lang} {
            default "en-US"
            ~^ar "ar"
            ~^cs "cs"
            ~^da "da"
            ~^de "de"
            ~^en "en-US"
            ~^es "es"
            ~^fa "fa"
            ~^fi "fi"
            ~^fr "fr"
            ~^he "he"
            ~^hi "hi"
            ~^hr "hr"
            ~^hu "hu"
            ~^it "it"
            ~^ja "ja"
            ~^ka "ka"
            ~^ko "ko"
            ~^lt "lt"
            ~^mk "mk"
            ~^nb "nb"
            ~^ne "ne"
            ~^nl "nl"
            ~^pl "pl"
            ~^pt "pt"
            ~^ro "ro"
            ~^ru "ru"
            ~^sl "sl"
            ~^sv "sv"
            ~^th "th"
            ~^tr "tr"
            ~^uk "uk"
            ~^vi "vi"
            ~^zh "zh"
        }
 
        map {cookie.lang} {lang} {
            default {header_lang}
            ar "ar"
            cs "cs"
            da "da"
            de "de"
            en "en-US"
            es "es"
            fa "fa"
            fi "fi"
            fr "fr"
            he "he"
            hi "hi"
            hr "hr"
            hu "hu"
            it "it"
            ja "ja"
            ka "ka"
            ko "ko"
            lt "lt"
            mk "mk"
            nb "nb"
            ne "ne"
            nl "nl"
            pl "pl"
            pt "pt"
            ro "ro"
            ru "ru"
            sl "sl"
            sv "sv"
            th "th"
            tr "tr"
            uk "uk"
            vi "vi"
            zh "zh"
        }
 
        header {
            Cache-Control "public, no-transform, max-age=1800"
            Vary "Accept-Language, Cookie"
        }
 
        @lang-override path_regexp ^/([a-z]{2})/
        handle @lang-override {
            try_files {path} /{re.lang-override.1}/index.html /en-US{path} /en-US/index.html
        }
 
        handle {
            try_files {path} /{lang}{path} /en-US{path} /{lang}/index.html /en-US/index.html
        }
 
        file_server
    }
}
  • Torna a carregar el Caddy
$SU rc-service caddy reload

Firewall

  • Configura el tallafoc per permetre les sol·licituds entrants
$SU $EDITOR /etc/awall/optional/mempool.json
/etc/awall/optional/mempool.json
{
  "description": "Allow Mempool Space SSL",
 
  "filter": [
    {
      "in": "internet",
      "out": "_fw",
      "service": { "proto": "tcp", "port": 4081 },
      "action": "accept",
      "conn-limit": { "count": 10, "interval": 60 }
    }
  ]
}
  • Habilitar-ho
$SU awall enable mempool
$SU awall activate

Instal·lació

Descarrega el codi font

Obtenim la darrera versió del codi font de Mempool Space i l’instal·lem.

  • Baixeu el codi font de la darrera versió de Mempool Space. Podeu consultar la pàgina de llançament per veure si hi ha disponible una versió més recent. Tanmateix, és possible que altres versions no s’hagin provat correctament amb la resta de la configuració de Microbolt.
cd /tmp
VERSION=3.0.0
git clone --branch v$VERSION https://github.com/mempool/mempool.git && cd mempool

Comprovació de la signatura

  • Per a evitar utilitzar un codi font incorrecte, verifiqueu que el llançament ha estat correctament signat almenys per un dels desenvolupadors principals wiz.
wget -qO- https://github.com/wiz.gpg | gpg --import
git verify-tag v$VERSION

MariaDB

MariaDB és una base de dades relacional de codi obert.

  • Primer cal crear bases de dades inicials i iniciar el servei
$SU rc-service mariadb setup
$SU rc-service mariadb start
  • Aquestes ordres us permeten crear una base de dades mempool i concedir privilegis a l’usuari mempool the directament des de la línia d’ordres
$SU mysql -e "create database mempool;"
$SU mysql -e "grant all privileges on mempool.* to 'mempool'@'localhost' identified via unix_socket;"

Backend

  • Instal·la les dependències del backend i construeix el projecte
cd /tmp/mempool/backend
npm ci --omit=dev --omit=optional

La instal·lació pot trigar un temps. Pot ser que hi hagi moltes sortides confuses, però si veieu alguna cosa semblant a la següent, la instal·lació ha estat correcta:

output
3 high severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
⚠️

A data de 2024-08-31, hi ha com a mínim 3 vulnerabilitats que no es poden abordar sense fer canvis substancials que podrien afectar altres parts del programari

npm audit fix
  • Feu-ne una instal·lació permanent global
npm run package
mkdir ./package/bin
printf "%s\n" \
    "#!/bin/sh" \
    "node /var/lib/mempool/index.js" \
    > ./package/bin/cli.sh
chmod +x ./package/bin/cli.sh
$SU install -D -m 0660 -o mempool -g mempool ./mempool-config.sample.json /etc/mempool/mempool-config.json
$SU mv -f /tmp/mempool/backend/package /var/lib/mempool
$SU ln -s /var/lib/mempool /usr/lib/node_modules/mempool
$SU ln -s ../lib/node_modules/mempool/bin/cli.sh /usr/bin/mempool

Frontend

  • Instal·la les dependències del frontend i construeix el projecte
cd /tmp/mempool/frontend
npm ci --omit=dev --omit=optional

La instal·lació pot trigar un temps. Pot ser que hi hagi moltes sortides confuses, però si veieu alguna cosa semblant a la següent, la instal·lació ha estat correcta:

output
16 vulnerabilities (2 low, 4 moderate, 10 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
⚠️

A data de 2024-08-31, hi ha com a mínim 16 vulnerabilitats que no es poden abordar sense fer canvis substancials que podrien afectar altres parts del programari

npm audit fix --force
  • Feu-ne una instal·lació permanent global
npm run build
$SU mv -f ./dist/mempool /var/www/

Neteja

cd
rm -rf /tmp/mempool
$SU apk del .build-deps

Configuració

  • Comprova el fitxer de configuració i canvia els valors ressaltats
$SU $EDITOR /etc/mempool/mempool-config.json
/etc/mempool/mempool-config.json
[...]
    "INDEXING_BLOCKS_AMOUNT": 52560,
[...]
    "STDOUT_LOG_MIN_PRIORITY": "info",
[...]
  "CORE_RPC": {
[...]
    "USERNAME": "",
    "PASSWORD": "",
[...]
    "COOKIE": true,
    "COOKIE_PATH": "/var/lib/bitcoind/.cookie"
  },
  "ESPLORA": {
    "REST_API_URL": "",
    "UNIX_SOCKET_PATH": "",
[...]
  "SECOND_CORE_RPC": {
    "HOST": "",
[...]
  "DATABASE": {
[...]
    "SOCKET": "/var/run/mysqld/mysqld.sock",
[...]
    "PASSWORD": "",
[...]
  "SOCKS5PROXY": {
    "ENABLED": true,
[...]
Redis

Per fer us de la memòria cau de Redis, cal instal·lar el paquet redis i configurar el fitxer de configuració de Mempool Space.

$SU apk add redis
/etc/mempool/mempool-config.json
[...]
  "REDIS": {
    "ENABLED": true,
    "UNIX_SOCKET_PATH": "/var/run/redis/redis.sock",
[...]
Accés remot per Tor

Per utilitzar el vostre explorador de cadena de blocs quan esteu en remot, podeu crear fàcilment un servei ocult Tor al Microbolt i accedir al Mempool Space amb el navegador Tor des de qualsevol dispositiu.

  • Afegiu les tres línies següents a la secció “location-hidden services” al fitxer torrc.
$SU $EDITOR /etc/tor/torrc
/etc/tor/torrc
# Hidden Service Mempool Space
HiddenServiceDir /var/lib/tor/mempool/
HiddenServiceVersion 3
HiddenServicePoWDefensesEnabled 1
HiddenServicePort 443 127.0.0.1:4081
  • Torneu a carregar la configuració de Tor i obteniu la vostra adreça de connexió.
$SU rc-service tor reload
$SU cat /var/lib/tor/mempool/hostname
output
abcdefg..............xyz.onion
  • Ara hauríeu de poder connectar-vos al vostre Mempool Space de forma remota mitjançant Tor mitjançant el vostre nom d’amfitrió

Inici automàtic a l’arrencada

Ara ens assegurarem que el nostre explorador de cadena de blocs s’iniciï com a servei a l’ordinador perquè estigui sempre en execució.

  • Creeu la unitat init.d de Mempool Space i copieu/enganxeu la configuració següent. Guardar i sortir.
$SU $EDITOR /etc/init.d/mempool
/etc/init.d/mempool
#!/sbin/openrc-run
 
: ${MEMPOOL_CONFIGFILE:=/etc/mempool/mempool-config.json}
: ${MEMPOOL_DATADIR:=/var/lib/mempool}
: ${MEMPOOL_LOGDIR:=/var/log/mempool}
: ${MEMPOOL_USER:=mempool}
: ${MEMPOOL_GROUP:=mempool}
: ${MEMPOOL_BIN:=/usr/bin/mempool}
: ${MEMPOOL_OPTS=${MEMPOOL_OPTS}}
: ${MEMPOOL_SIGTERM_TIMEOUT:=600}
 
MEMPOOL_PIDDIR="/run/mempool"
 
name="Mempool Space"
description="A self-hosted Bitcoin blockchain and mempool visualizer/explorer"
 
directory="${MEMPOOL_DATADIR}"
required_files="${MEMPOOL_CONFIGFILE}"
pidfile="${MEMPOOL_PIDDIR}/${SVCNAME}.pid"
retry="${MEMPOOL_SIGTERM_TIMEOUT}"
 
command="${MEMPOOL_BIN}"
command_args="${MEMPOOL_OPTS}"
command_user="${MEMPOOL_USER}:${MEMPOOL_GROUP}"
command_background="true"
 
start_stop_daemon_args="--env MEMPOOL_CONFIG_FILE=${MEMPOOL_CONFIGFILE}
                        --stdout ${MEMPOOL_LOGDIR}/debug.log
                        --stderr ${MEMPOOL_LOGDIR}/debug.log"
 
depend() {
    need bitcoind
    need mariadb
    checkdepend REDIS redis
 
    if service_started fulcrum; then
        need fulcrum
    elif service_started electrs; then
        need electrs
    else
        if service_exists fulcrum; then
            need fulcrum
        elif service_exists electrs; then
            need electrs
        else
            eerror "Neither fulcrum nor electrs is installed or started"
            return 1
        fi
    fi
}
 
checkdepend() {
    if sed -n '/^[[:space:]]*"'${1}'": {/,/^[[:space:]]*}/p' "${MEMPOOL_CONFIGFILE}" | grep -qs '"ENABLED": true'; then
        need "${2:-$1}"
    fi
}
 
service_exists() {
    rc-service --list | grep -q "^$1$"
}
 
start_pre() {
    checkpath --file      --mode 0660 --owner "${command_user}" "${MEMPOOL_CONFIGFILE}"
    checkpath --directory --mode 0750 --owner "${command_user}" "${MEMPOOL_DATADIR}"
    checkpath --directory --mode 0755 --owner "${command_user}" "${MEMPOOL_LOGDIR}"
    checkpath --directory --mode 0755 --owner "${command_user}" "${MEMPOOL_PIDDIR}"
}
 
stop() {
    ebegin "Stopping ${SVCNAME}"
    pkill -TERM -P "$(cat ${pidfile})" > /dev/null 2>&1
    start-stop-daemon \
        --stop \
        --pidfile="${pidfile}" \
        --retry="${MEMPOOL_SIGTERM_TIMEOUT}" \
        --exec="${MEMPOOL_BIN}"
    eend $?
}
  • Habilita el permís d’execució
$SU chmod +x /etc/init.d/mempool

Habilita logrotate

  • Introduïu la configuració següent completa. Guardar i sortir
$SU $EDITOR /etc/logrotate.d/mempool
/etc/logrotate.d/mempool
/var/log/mempool/*.log {
    weekly
    missingok
    rotate 104
    compress
    delaycompress
    notifempty
    create 0640 mempool mempool
    sharedscripts
    postrotate
        killall -HUP `cat /run/mempool/mempool.pid`
    endscript
}
  • Prova
$SU logrotate /etc/logrotate.d/mempool --debug

Activa i inicia Mempool Space

$SU rc-update add mempool
$SU rc-service mempool start
  • Comproveu el registre per veure la sortida de Mempool Space. Sortiu amb Ctrl-C
tail -f /var/log/mempool/debug.log
  • Ara podeu accedir al vostre propi Mempool Space des de la vostra xarxa local navegant a https://nakamoto01:4081 (o la vostra adreça IP equivalent).

Per al futur: actualització de Mempool Space

Torneu a seguir la pàgina Mempool Space substituint el valor de la variable d’entorn VERSION=x.xx per l’últim si encara no s’ha modificat en aquesta guia.

  • Actualitzeu la configuració de Mempool Space si cal (vegeu les notes de la versió)
$SU $EDITOR /etc/mempool/mempool-config.json
  • Reinicieu el servei per aplicar els canvis
$SU rc-service mempool restart