Memory Pool
El área de espera de nuevas transacciones
El memory pool (mempool) es un área de espera para nuevas transacciones.
Las nuevas transacciones se almacenan en el memory pool de un nodo mientras esperan para ser minadas en la blockchain.
No confíes en las transacciones del memory pool. No todas las transacciones pasan del memory pool (almacenamiento temporal) a la blockchain (almacenamiento permanente).
Propósito
¿Por qué existe el memory pool?
El memory pool se usa para resolver transacciones conflictivas.
Es posible que dos transacciones diferentes gastando los mismos bitcoins se inserten en partes diferentes de la red al mismo tiempo. Algunos nodos reciben una transacción primero y otros reciben la otra primero. Como ambas intentan gastar los mismos bitcoins, solo una debe registrarse en la blockchain.
Ese conflicto se resuelve cuando uno de los nodos de la red mina las transacciones de su memory pool en un bloque. Al recibir ese bloque recién minado, los nodos lo agregan a la blockchain y expulsan cualquier transacción conflictiva de su memory pool.
El memory pool tiene un papel crucial para impedir que transacciones conflictivas se registren en la blockchain, y es la razón por la que debes esperar a que las transacciones sean minadas.
Entrada
¿Cómo entra una transacción al memory pool?
Una transacción puede entrar al memory pool de un nodo de varias formas:
- Insertada en un nodo local. Una nueva transacción puede insertarse directamente en un nodo (por ejemplo, vía
bitcoin-cli sendrawtransaction, o mediante tu billetera), que luego la transmite a los demás nodos. - Recibida de otro nodo. Los nodos transmiten continuamente las transacciones más recientes que han recibido. Si un nodo anuncia una transacción que el tuyo no tiene, el tuyo la solicita y la añade.
- Reentrada tras una reorganización de la cadena. Las transacciones antes minadas pueden volver al memory pool durante una reorganización, si no están en los bloques de la nueva cadena más larga.
Solo las transacciones válidas pueden entrar al memory pool. Un nodo verifica si cada transacción que recibe es válida (no rompe reglas) antes de agregarla o retransmitirla.
Salida
¿Cómo sale una transacción del memory pool?
- Minada. Es el objetivo de toda transacción del memory pool. Cuando un minero mina un bloque, los nodos mueven las transacciones de ese bloque del memory pool a la blockchain (de almacenamiento temporal a permanente).
- Conflicto minado. Los nodos eliminan del memory pool cualquier transacción que entre en conflicto con las transacciones dentro de un bloque minado.
- Reemplazada. Una transacción se elimina si es reemplazada por una nueva transacción de tarifa más alta (vía replace-by-fee, RBF) que gasta los mismos bitcoins.
- Límite de tiempo. Si una transacción no se mina antes del límite de tiempo (predeterminado: 2 semanas), el nodo la elimina.
- Límite de tamaño. Cuando el memory pool alcanza un tamaño máximo (predeterminado: 300 MB), el nodo empieza a eliminar las transacciones de menor tarifa para hacer espacio a las de tarifa más alta.
Configuraciones
Cada nodo mantiene su propio memory pool y puede usar sus propias reglas. Las configuraciones más comunes de bitcoin.conf son:
maxmempool=<n>
predeterminado = 300 MB
Controla el tamaño máximo del memory pool en MB. Aumentarlo es la forma más fácil de seguir el máximo de transacciones posible, pero usa más RAM.
mempoolexpiry=<n>
predeterminado = 336 horas (2 semanas)
Controla por cuántas horas tu nodo mantiene las transacciones en el memory pool.
minrelaytxfee=<valor>
predeterminado = 0.00001 BTC/kvB (1 sat/vbyte)
Controla la tarifa mínima por byte para que una transacción sea agregada al mempool de tu nodo. El valor predeterminado de 0,00001 BTC/kvB equivale a 1 sat/vbyte.
Conversor de Unidades
Así que, aunque cada memory pool puede ser único, las configuraciones más comunes en la red son: tamaño máximo de 300 MB, mantener transacciones durante hasta 2 semanas y rechazar transacciones con tarifa por debajo de 1 sat/byte. Como resultado, la mayoría de los nodos comparte una visión parecida del memory pool en un momento dado.
Tarifa Mínima
¿Cuál es la tarifa mínima del mempool?
Cada nodo mantiene una tarifa mínima por byte para limitar las transacciones que acepta en su memory pool.
Ese valor aumenta cuando el memory pool supera su límite de tamaño.
Por ejemplo, si el memory pool se vuelve demasiado grande, las transacciones de menor tarifa se eliminan y la tarifa mínima aumenta para impedir la entrada de transacciones de tarifa más baja. Por el contrario, si el tamaño del memory pool vuelve a caer por debajo de su máximo, la tarifa mínima disminuye para permitir la vuelta de transacciones de tarifa más baja.
La tarifa mínima predeterminada del mempool es de 1 sat/byte.
Cuando se eliminan transacciones del mempool por estar en el fondo de un mempool demasiado grande (ordenado por tarifa), la minrelayfee efectiva se eleva a la tarifa de las transacciones eliminadas.
Luego disminuye continuamente, muy despacio, reduciéndose a la mitad cada 3 a 12 horas, hasta que tiene que elevarse de nuevo debido a una nueva eliminación.
Cálculo
Esta tarifa mínima está controlada por minrelayfee.
minrelayfee(dinámica) — es el mayor valor entre los dos siguientes:minmempoolfee(dinámica) — un valor interno que sube y baja cuando tu mempool alcanza su tamaño máximo (maxmempool).minrelaytxfee(estática) — un valor fijo que puedes definir en el archivo de configuración de tu nodo.
En otras palabras, minmempoolfee es un valor calculado internamente que se ajusta dinámicamente según el tamaño de tu mempool, y puedes sobrescribirlo definiendo un mínimo permanente con minrelaytxfee. Cuando Bitcoin está en ejecución, minrelayfee (la tarifa mínima efectiva) es el mayor de estos dos valores.
Estructura
¿El memory pool tiene una estructura?
El memory pool no tiene una estructura definida; es solo un conjunto de transacciones no confirmadas.
Sin embargo, las transacciones en el memory pool incluyen algunos metadatos adicionales para ayudar en la ordenación para su inclusión en un bloque candidato.
Estos metadatos incluyen cosas como: tamaño, tarifa, descendientes y ancestros.
Descendientes
Un descendiente es el hijo de una transacción del memory pool.
En otras palabras, es una transacción que gasta una transacción existente en el memory pool. Así que, si una transacción está en el memory pool, es posible crear una transacción hija que gaste la(s) salida(s) de esa transacción y enviarla también al memory pool.
Por lo tanto, una transacción puede tener varios descendientes mientras está en el memory pool.
El padre de una transacción hija siempre debe minarse primero. Una transacción hija depende de que su padre se mine antes de que ella misma pueda minarse (de lo contrario, estaría intentando gastar bitcoins que no existen). El padre puede minarse en un bloque anterior, o más arriba en el mismo bloque que el hijo. De cualquier forma, no puedes minar una transacción hija sin su padre.
Límites de descendientes. Una transacción del memory pool puede tener un máximo de 25 descendientes. El tamaño total de los descendientes también está limitado a 101.000 bytes virtuales (101 kvB). (ver policy.h)
Expulsión del Memory Pool
La tarifa de descendientes (descendant feerate) es la tarifa media de una transacción y de todos sus descendientes.
Se usa para determinar qué transacciones eliminar del memory pool.
Cuando el memory pool de un nodo alcanza su límite de tamaño, buscará eliminar primero las transacciones de menor tarifa. Pero, antes de eliminar una transacción, mira su tarifa de descendientes para ver si vale la pena mantenerla en el memory pool.
Por ejemplo:
- Tarifa de descendientes mayor: una transacción aislada puede tener una tarifa lo bastante baja como para ser candidata a la eliminación. Sin embargo, si hay una transacción descendiente con una tarifa muy alta vinculada a ella, la tarifa de descendientes será mayor, por lo que podría valer la pena mantener esa transacción, porque es más probable que se mine pronto (ya que no se puede minar un descendiente de tarifa alta sin su padre).
- Tarifa de descendientes menor: si una transacción aislada tiene una tarifa lo bastante baja para la eliminación y su tarifa de descendientes es la misma (o menor), podemos eliminarla tranquilamente junto con todos los descendientes. Esto se debe a que todos los descendientes dependen de esa transacción, así que no podrían minarse sin ella.
Tarifa media. La tarifa media es la suma de las tarifas de las transacciones dividida por la suma de sus tamaños. Es el mismo cálculo de tarifa que con una transacción aislada, pero repartido entre varias transacciones.
Ancestros
Un ancestro es el padre de una transacción del memory pool.
Una transacción del memory pool depende de su(s) ancestro(s) para minarse en un bloque. Esto se debe a que no puedes incluir en un bloque una transacción que gasta una salida que no existe (o que aún no se ha creado).
Así que, si buscas cualquier transacción en el memory pool, es posible que tenga varios ancestros, y esos ancestros deben minarse antes de que esa transacción pueda minarse.
Selección del Bloque Candidato
La tarifa de ancestros (ancestor feerate) es la tarifa media de una transacción y de todos sus ancestros.
Se usa para determinar qué transacciones seleccionar para su inclusión en un bloque candidato.
Un minero tiene que incluir todos los ancestros de una transacción en su bloque. Así que calcula la tarifa de ancestros de cada transacción para determinar si vale la pena incluir esa transacción y todos sus ancestros, frente a incluir otra transacción de tarifa parecida (pero sin ancestros).
Por ejemplo:
- Tarifa de ancestros menor: una transacción aislada puede tener una tarifa lo bastante alta como para que valga la pena incluirla en un bloque candidato. Sin embargo, si tiene ancestros con tarifas muy bajas, esto reduce la tarifa de ancestros y podría significar que en realidad no vale la pena incluir la transacción (en comparación con otras transacciones con una tarifa absoluta menor, pero sin ancestros).
- Tarifa de ancestros mayor: una tarifa de ancestros más alta no mejora las posibilidades de que una transacción se incluya en un bloque, ya que un minero puede simplemente minar los ancestros e ignorar la transacción actual si su tarifa no es lo bastante alta.
Child Pays For Parent (CPFP). Puedes aumentar las posibilidades de que una transacción del memory pool se mine creando un hijo con una tarifa alta. Esto aumenta la tarifa media, lo que hace que la transacción padre sea más atractiva para un minero.
Ubicación
¿Dónde se almacena el memory pool?
El memory pool se encuentra en la RAM de tu computadora mientras el nodo está ejecutándose. Cuando apagas Bitcoin Core, guarda el memory pool en un archivo mempool.dat para recargarlo la próxima vez que inicie.
Comandos
Algunos comandos útiles de Bitcoin Core para inspeccionar el memory pool:
bitcoin-cli getmempoolinfo– información general (tamaño, número de transacciones, tarifa mínima).bitcoin-cli getrawmempool– lista los TXIDs de todas las transacciones en el memory pool.bitcoin-cli getmempoolentry [txid]– detalles de una transacción específica en el memory pool.
Notas
- No existe "el memory pool". Es decir, no hay un único memory pool al que entren todas las nuevas transacciones, ya que cada nodo mantiene su propio memory pool independiente. Como resultado, los memory pools de los nodos de la red serán ligeramente diferentes en un momento dado. Esto se debe a configuraciones diferentes (p. ej.,
maxmempool,mempoolexpiry,minrelaytxfee), a la velocidad de propagación de las transacciones y al hecho de que podría haber transacciones conflictivas circulando por la red al mismo tiempo. Sin embargo, normalmente hay una gran coincidencia en la que la mayoría de los nodos tiene transacciones parecidas en sus memory pools, así que no hay nada de malo en usar el término "el memory pool" para referirse al estado general de los memory pools de la red. Solo prepárate para que te corrijan en foros técnicos si lo llamas "el memory pool". - El tiempo de expiración predeterminado del mempool es de 2 semanas. Antes era de 3 días, pero se aumentó a 14 días en 2017, con el lanzamiento de Bitcoin Core v0.14.0.
- Cuando una transacción sale del memory pool, es como si nunca hubiera ocurrido. Así que no confíes en las transacciones del memory pool al aceptar pagos. Si la transacción sale del memory pool sin minarse, es como si nunca hubiera ocurrido. La única forma de devolverla al memory pool sería retransmitirla a la red.