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: trueincluye el tamaño virtual y datos sobre la comisiónallowed: falseincluye un motivo de rechazo y, a veces, detallesmaxfeeratese 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
- Publicación de Bitcoin Core 31.2, publicada el 28 de octubre de 2026.
- Implementación y ayuda RPC de
testmempoolaccepten Bitcoin Core 31.2, comprobada el 30 de octubre de 2026. - Pruebas funcionales de transacciones de Bitcoin Core 31.2, incluidos casos permitidos y
max-fee-exceeded, comprobadas el 30 de octubre de 2026.
