Guide

Probar una transacción de Bitcoin antes de transmitirla con Bitcoin Core

Crea una transacción firmada en regtest, pregunta a Bitcoin Core 31.2 si su mempool actual la aceptaría y demuestra que la prueba no transmitió la transacción.

8 min de lecturaTransacciones
Probar una transacción de Bitcoin antes de transmitirla con Bitcoin Core

Qué harás

testmempoolaccept pregunta a un nodo Bitcoin Core si una o varias transacciones sin procesar, firmadas y serializadas, superarían sus comprobaciones actuales de consenso y política de mempool. Devuelve un resultado estructurado sin añadir la transacción a la mempool ni transmitirla.

Esta guía crea una wallet regtest desechable, mina bloques sintéticos, construye y firma una transacción y la prueba dos veces. La primera llamada debería devolver allowed: true. La segunda fija una tasa máxima de comisión intencionadamente diminuta y debería devolver max-fee-exceeded. Una llamada final a getrawmempool debería seguir devolviendo una lista vacía.

Nada de esto usa mainnet, monedas de testnet, una wallet de producción, pares ni material privado importante. No sustituyas la wallet por una real ni uses una transacción con fondos reales mientras aprendes el procedimiento.

Antes de empezar

Necesitas Bitcoin Core 31.2, jq, una shell POSIX y unos 2 GB de espacio libre. Usa los binarios y las firmas enlazados desde la página oficial de Bitcoin Core 31.2. Verifica el artefacto descargado antes de ejecutarlo.

Los ejemplos esperan que bitcoind y bitcoin-cli estén en tu PATH. Inician un nodo nuevo en un directorio situado bajo la carpeta actual. Lee cada comando antes de ejecutarlo.

Bitcoin Core 31.2 se publicó el 28 de octubre de 2026. Su implementación publicada de testmempoolaccept documenta estos límites:

  • la entrada es una lista de transacciones firmadas y serializadas en hexadecimal
  • una transacción individual se comprueba frente a la cadena y la mempool actuales del nodo
  • allowed: true incluye el tamaño virtual y datos sobre la comisión
  • allowed: false incluye un motivo de rechazo y, a veces, detalles
  • maxfeerate se expresa en BTC por 1.000 bytes virtuales
  • la prueba no reserva inputs ni promete una aceptación posterior

Este proceso de publicación no disponía de un binario de Bitcoin Core. Se comprobó la sintaxis de la shell y se compararon los comandos con el código RPC y las pruebas funcionales de la versión 31.2, pero el procedimiento regtest siguiente no se ejecutó aquí. Trata las formas de salida indicadas como resultados esperados que debes verificar en tu propio nodo desechable, no como una afirmación sobre una ejecución realizada por ti.

Iniciar un nodo regtest aislado

Crea una carpeta de trabajo nueva y un directorio de datos. La protección se niega a reutilizar un directorio existente.

mkdir testmempoolaccept-practice
cd testmempoolaccept-practice

DATADIR="$PWD/regtest-data"
if [ -e "$DATADIR" ]; then
  echo "Refusing to reuse $DATADIR" >&2
  exit 1
fi
mkdir "$DATADIR"

bitcoind -regtest -datadir="$DATADIR" -server=1 -daemon -fallbackfee=0.0002
bitcoin-cli -regtest -datadir="$DATADIR" -rpcwait getblockchaininfo >/dev/null

Regtest es una cadena local privada. No descubre pares públicos ni usa bitcoin real. -rpcwait espera hasta que el servidor RPC esté preparado.

Crea una wallet de descriptores, obtén una dirección para minar y genera 101 bloques. El bloque adicional hace que la primera salida coinbase madure y pueda gastarse.

bitcoin-cli -regtest -datadir="$DATADIR" createwallet "preflight"

MINER=$(bitcoin-cli -regtest -datadir="$DATADIR" \
  -rpcwallet=preflight getnewaddress "mining" bech32)

bitcoin-cli -regtest -datadir="$DATADIR" \
  generatetoaddress 101 "$MINER" >/dev/null

Resultado esperado: los comandos terminan sin un error RPC. Es historial regtest sintético. No se crean fondos en ninguna red.

Construir y firmar sin transmitir

Crea otra dirección en la misma wallet desechable. Después crea una PSBT con fondos, permite que la wallet la firme y finalízala para obtener la transacción en hexadecimal.

DEST=$(bitcoin-cli -regtest -datadir="$DATADIR" \
  -rpcwallet=preflight getnewaddress "destination" bech32)

PSBT=$(bitcoin-cli -regtest -datadir="$DATADIR" \
  -rpcwallet=preflight walletcreatefundedpsbt \
  '[]' "{\"$DEST\":1.00000000}" 0 '{"add_inputs":true}' true \
  | jq -er '.psbt')

SIGNED=$(bitcoin-cli -regtest -datadir="$DATADIR" \
  -rpcwallet=preflight walletprocesspsbt "$PSBT" \
  | jq -er '.psbt')

HEX=$(bitcoin-cli -regtest -datadir="$DATADIR" \
  -rpcwallet=preflight finalizepsbt "$SIGNED" \
  | jq -er '.hex')

test -n "$HEX"

walletcreatefundedpsbt selecciona una moneda regtest madura, añade el cambio y estima una comisión. walletprocesspsbt firma con la wallet desechable. finalizepsbt devuelve la transacción serializada. Ninguno de estos comandos la envía a la mempool.

No pegues una transacción real firmada en un servicio público. Cualquiera que obtenga el hexadecimal puede transmitirla, y sus inputs y outputs pueden revelar actividad de la wallet.

Pedir al nodo un resultado previo

Pasa el hexadecimal firmado como único elemento de la lista JSON:

bitcoin-cli -regtest -datadir="$DATADIR" \
  testmempoolaccept "[\"$HEX\"]" | tee allowed.json

jq -e '
  length == 1 and
  .[0].allowed == true and
  .[0].vsize > 0 and
  .[0].fees.base > 0
' allowed.json

El resultado debería contener txid, wtxid, allowed, vsize y un objeto fees. Los identificadores, el tamaño y la comisión exactos dependen del input y el cambio elegidos por la wallet. No copies valores fijos de otra ejecución.

Comprueba ahora que el RPC no insertó la transacción:

bitcoin-cli -regtest -datadir="$DATADIR" getrawmempool

Resultado esperado:

[]

El resultado vacío marca la separación importante entre probar y enviar. No llames a sendrawtransaction en este ejercicio.

Ejecutar una prueba negativa controlada

El segundo argumento de testmempoolaccept es la tasa máxima de comisión en BTC por 1.000 bytes virtuales. Usa un valor intencionadamente diminuto:

bitcoin-cli -regtest -datadir="$DATADIR" \
  testmempoolaccept "[\"$HEX\"]" 0.00000001 \
  | tee maxfee.json

jq -e '
  length == 1 and
  .[0].allowed == false and
  .[0]["reject-reason"] == "max-fee-exceeded"
' maxfee.json

Esto no significa que la transacción infrinja el consenso de Bitcoin. Significa que la comisión supera el límite temporal fijado por quien llama. La prueba funcional de Bitcoin Core 31.2 usa la misma clase de control negativo y confirma por separado un resultado permitido cuando el límite es suficiente.

Vuelve a probar la mempool. Debería continuar vacía.

bitcoin-cli -regtest -datadir="$DATADIR" getrawmempool

Leer con cuidado los rechazos

allowed: false es un resultado local en un momento concreto. Entre las causas habituales están inputs ausentes o ya gastados, una comisión inferior al mínimo actual del nodo, un conflicto con otra transacción de la mempool, un script no estándar o el límite maxfeerate de quien llama.

El hexadecimal malformado es distinto. Si Bitcoin Core no puede deserializar la transacción, el propio RPC devuelve un error en vez de un elemento con allowed: false. Corrige el paso de serialización o firma antes de interpretar la política.

En un paquete, los padres deben aparecer antes que los hijos. Si una transacción falla, las entradas posteriores pueden contener solo identificadores porque no se validaron por completo. Un problema del paquete puede aparecer como package-error en lugar de un rechazo individual.

No presentes allowed: true como una garantía. Entre la prueba y una transmisión posterior:

  • otra transacción puede gastar el mismo input
  • el contenido de la mempool y su comisión mínima pueden cambiar
  • otro nodo puede usar una política distinta o ver otra punta de la cadena
  • una reorganización o el contexto del paquete pueden cambiar el resultado
  • los mineros eligen las transacciones de forma independiente

El RPC tampoco demuestra que el destino, la cantidad o la comisión coincidan con la intención del usuario. Revísalos antes de firmar, no solo después de producir el hexadecimal.

Solución de problemas

bitcoin-cli no puede conectarse. Confirma que todos los comandos usan el mismo DATADIR absoluto. Revisa regtest-data/regtest/debug.log. No cambies a un directorio de producción.

La wallet no tiene fondos suficientes. Confirma que generaste 101 bloques regtest hacia una dirección de la misma wallet. Los outputs coinbase necesitan 100 confirmaciones para poder gastarse.

finalizepsbt no contiene hex. Examina el resultado completo sin enviarlo a ningún sitio. Si complete es falso, la wallet no aportó todas las firmas necesarias. En este ejercicio, vuelve a crear la wallet desechable en vez de importar claves.

La primera prueba devuelve missing-inputs. Asegúrate de que la transacción y el nodo comparten la misma cadena regtest y el mismo directorio. El hexadecimal creado contra otra cadena apuntará a outputs que este nodo desconoce.

La primera prueba devuelve un rechazo por comisión. Revisa getmempoolinfo y el objeto fees. No resuelvas una comisión inesperada fijando maxfeerate a cero sin entender la cantidad.

La prueba negativa es permitida. Detente y revisa maxfee.json, la versión de Core y la tasa real. No debilites la aserción solo para que pase.

Limpiar

Detén el nodo desechable antes de eliminar su directorio:

bitcoin-cli -regtest -datadir="$DATADIR" stop

Cuando el proceso termine, puedes eliminar la carpeta testmempoolaccept-practice completa. Solo contiene bloques sintéticos, una wallet desechable y archivos de prueba.

Qué se verificó y qué no

La secuencia de comandos se comprobó con bash -n. Los nombres RPC, argumentos y campos de resultados se compararon con el código fuente de Bitcoin Core 31.2 y sus pruebas funcionales publicadas. La ilustración se renderizó desde el SVG creado a mano y se inspeccionó como WebP de 1200 por 630.

No había un binario de Bitcoin Core en este entorno de publicación, por lo que los comandos regtest no se ejecutaron aquí. No se usó ninguna wallet, nodo, clave, transacción firmada, red ni fondo. Ejecuta el procedimiento solo en un directorio regtest nuevo y considera cualquier salida distinta como algo que debes investigar, no como un resultado que haya que sobrescribir.

Fuentes

Etiquetado

Boletín

Bitcoin, sin ruido

Qué ha pasado en Bitcoin, qué cambia de verdad, y las fuentes para que puedas comprobarnos. Un número cada vez, directo a tu correo.

  • Un correo por número, nunca una secuencia automática
  • Sin píxeles de seguimiento y sin compartir direcciones
  • Baja desde cualquier número con un clic

Recibe el próximo número

Un correo por número, sin píxeles de seguimiento, y te puedes dar de baja desde cualquiera de ellos. No compartimos tu dirección. Política de privacidad