Track 3 / 5
Suscribirse a los eventos del nodo y ver una transacción entrar, ser reemplazada y minarse.
Los logs son para humanos. ZMQ es la misma película, pero para programas: el nodo publica cada evento y cualquier proceso se puede suscribir.
Probá
alice getzmqnotificationsMirá
pubsequence, pubrawtx y pubhashblock. Están configurados en conf/bitcoin.conf:
zmqpubsequence=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334El topic sequence cuenta todo lo que le pasa al mempool y a la cadena:
| Etiqueta | Significado |
|---|---|
A | tx agregada al mempool |
R | tx removida del mempool por un motivo distinto de entrar en un bloque |
C | bloque conectado |
D | bloque desconectado |
Probá
En otra terminal, desde la carpeta del repo:
docker compose exec alice python3 /lab/scripts/zmq_listen.pyProbá
En la primera terminal:
T1=$(alice -named sendtoaddress address="$(carol getnewaddress)" amount=1 replaceable=true)
T2=$(alice bumpfee "$T1" | jq -r .txid)
alice -generate 1Mirá
A <T1> tx agregada al mempool
R <T1> tx removida del mempool (no por entrar en un bloque)
A <T2> tx agregada al mempool
C <bloque> bloque conectadobumpfee crea T2, que incluye todos los inputs de T1 y paga más fee: reemplaza a T1 (RBF). T2 entra en el bloque, pero no aparece un R para ella: que salió del mempool se deduce del C.
Por qué
Con un RPC tendrías que preguntar cada tanto y comparar fotos. Con ZMQ el nodo te avisa en el momento.
zmq_listen.py es apenas más largo que esto. Guardalo como scripts/mi_listener.py dentro del repo:
import zmq
s = zmq.Context().socket(zmq.SUB)
s.connect("tcp://127.0.0.1:28332")
s.setsockopt_string(zmq.SUBSCRIBE, "sequence")
while True:
topic, body, seq = s.recv_multipart()
print(chr(body[32]), body[:32].hex(), flush=True)Y corrélo dentro del contenedor de alice, donde la carpeta scripts/ aparece como /lab/scripts:
docker compose exec alice python3 /lab/scripts/mi_listener.pyEl puerto ZMQ (28332) no está publicado fuera de Docker, así que 127.0.0.1 solo funciona desde adentro del contenedor.
Dejá el listener corriendo para el track 4.