Memory Pool
A área de espera de novas transações
O memory pool (mempool) é uma área de espera para novas transações.
Novas transações ficam armazenadas no memory pool de um nó enquanto esperam para serem mineradas na blockchain.
Não confie em transações do memory pool. Nem todas as transações vão do memory pool (armazenamento temporário) para a blockchain (armazenamento permanente).
Propósito
Por que o memory pool existe?
O memory pool é usado para resolver transações conflitantes.
É possível que duas transações diferentes gastando os mesmos bitcoins sejam inseridas em partes diferentes da rede ao mesmo tempo. Alguns nós recebem uma transação primeiro, e outros recebem a outra primeiro:
Como ambas estão tentando gastar os mesmos bitcoins, apenas uma delas deve ser gravada na blockchain. Então, qual dessas transações conflitantes deve chegar à blockchain?
Esse conflito é resolvido quando um dos nós da rede minera as transações do seu memory pool em um bloco:
Ao receber esse bloco recém-minerado, os nós o adicionam à blockchain e expulsam quaisquer transações conflitantes do seu memory pool.
Então o memory pool faz parte de um mecanismo de ordenação (a mineração) que impede que transações conflitantes sejam gravadas na blockchain.
O memory pool tem um papel crucial em impedir que transações conflitantes sejam gravadas na blockchain, e é a razão pela qual você precisa esperar as transações serem mineradas.
Entrada
Como uma transação entra no memory pool?
Uma transação pode entrar no memory pool de um nó de algumas formas:
1. Inserida em um nó local
(comum)
Uma nova transação pode ser inserida diretamente em um nó da rede.
A partir daí, o nó transmite a transação aos outros nós da rede para que eles também possam adicioná-la ao seu memory pool.
Você pode inserir manualmente uma transação no seu nó local do Bitcoin Core usando o comando bitcoin-cli sendrawtransaction. Como alternativa, a sua carteira insere a sua transação em um nó quando você envia bitcoins para alguém.
2. Recebida de outro nó
(comum)
Novas transações podem ser recebidas de outros nós da rede.
Os nós transmitem continuamente as transações mais recentes que receberam aos nós aos quais estão conectados. Então, se um nó anuncia uma transação que o seu nó não tem, o seu nó a solicita e a adiciona ao seu memory pool também.
Esse processo se repete até que todos os nós da rede tenham uma cópia das transações mais recentes nos seus memory pools.
Só transações válidas podem entrar no memory pool. Um nó verifica se cada transação que recebe é válida (não quebra nenhuma regra) antes de adicioná-la ao seu memory pool ou retransmiti-la aos nós aos quais está conectado.
3. Reentrada após uma reorganização da cadeia
(incomum)
Transações antes mineradas podem reentrar no memory pool durante uma reorganização da cadeia.
Às vezes um nó realiza uma reorganização da cadeia, em que uma nova cadeia mais longa é encontrada e substitui alguns dos blocos da cadeia mais longa anterior do nó. Se alguma das transações nos blocos que estão sendo substituídos não for encontrada nos blocos da nova cadeia mais longa, ela será reciclada de volta ao memory pool do seu nó (e retransmitida novamente) para ter a chance de ser minerada novamente em um bloco futuro.
Saída
Como uma transação sai do memory pool?
Há vários motivos para uma transação sair do memory pool:
1. Minerada
É o objetivo de toda transação do memory pool.
Quando um minerador minera um novo bloco de transações, ele o transmite aos outros nós da rede. Quando um nó recebe esse bloco, quaisquer transações no seu memory pool que estejam dentro daquele bloco são removidas do seu memory pool e conectadas ao bloco.
Em outras palavras, as transações são movidas do armazenamento temporário (o memory pool) para o armazenamento permanente (a blockchain).
2. Conflito minerado
Os nós removem do seu memory pool quaisquer transações que conflitem com as transações dentro de um bloco.
As transações dentro de um bloco minerado são consideradas "corretas", então, se um nó tem no seu memory pool uma transação que gasta os mesmos bitcoins que uma transação dentro de um bloco, ele expulsa essa transação do memory pool.
Em outras palavras, o memory pool cumpriu o seu papel de fazer parte do mecanismo de ordenação de transações conflitantes.
Todos os descendentes de uma transação conflitante do memory pool serão removidos ao mesmo tempo.
3. Substituída
Uma transação será removida do memory pool se for substituída por uma nova transação de taxa mais alta.
Isso acontece se uma transação existente no memory pool tiver a configuração replace-by-fee (RBF) e, então, uma nova transação for transmitida à rede gastando os mesmos bitcoins, mas com uma taxa suficientemente mais alta.
A nova versão de taxa mais alta da transação é mais provável de ser minerada na blockchain, então o nó expulsa a transação antiga em favor da nova.
4. Limite de tempo
Cada nó tem uma configuração de limite de tempo de quanto tempo está disposto a manter as transações no seu memory pool.
Então, se uma transação no memory pool não for minerada antes de atingir o limite de tempo, o nó assume que ela provavelmente não será minerada e a remove do seu memory pool.
- O limite de tempo padrão é de 2 semanas.
- Você sempre pode retransmitir uma transação à rede se ela sair dos memory pools por ultrapassar o tempo de expiração.
5. Limite de tamanho
As transações serão removidas do memory pool de um nó quando ele atingir um certo tamanho (em megabytes).
Cada nó tem a capacidade de definir um tamanho máximo para o seu memory pool. Então, quando o memory pool ultrapassa esse limite, ele começa a remover as transações de menor taxa para abrir espaço para transações de taxa mais alta.
Assim, se houver mais transações circulando pela rede do que cabe no memory pool do seu nó, ele só manterá as transações de taxa mais alta disponíveis.
- O limite de tamanho padrão é de 300 MB.
- Alguns nós mantêm memory pools muito grandes, então é improvável que uma transação de taxa baixa saia completamente da rede por causa dos memory pools pequenos de outros nós.
- O memory pool também armazena metadados de cada transação. Então apenas cerca de 25% dos dados do memory pool são dados brutos de transação.
Configurações
Cada nó mantém o seu próprio memory pool individual e pode usar suas próprias configurações e regras para ele.
Se você está rodando um nó Bitcoin Core, estas são as configurações de bitcoin.conf mais comuns para o seu memory pool:
maxmempool=<n>
padrão = 300 MB
Esta configuração controla o tamanho máximo do memory pool em MB (megabytes).
Aumentar o tamanho do memory pool do seu nó com maxmempool é a forma mais fácil de acompanhar o máximo de transações possível. Porém, isso usa mais RAM no seu computador.
Esta configuração inclui o tamanho dos metadados das transações e não é o tamanho máximo baseado apenas no tamanho dos dados brutos de transação.
mempoolexpiry=<n>
padrão = 336 horas (2 semanas)
Esta configuração controla por quantas horas o seu nó mantém as transações no memory pool após recebê-las pela primeira vez.
minrelaytxfee=<valor>
padrão = 0.00001 BTC/kvB (1 sat/vbyte)
Esta configuração controla a taxa mínima por byte para uma transação ser adicionada ao mempool do seu nó.
Ela usa uma unidade meio esquisita, BTC/kvB (kilo byte virtual), para medir as taxas. O padrão de 0,00001 BTC/kvB equivale a 1 sat/vbyte.
Conversor de Unidades
Então, embora cada memory pool possa ser único, as configurações mais comuns dos memory pools na rede são:
- Um tamanho máximo de 300 MB.
- Manter transações por até 2 semanas.
- Rejeitar transações que não tenham uma taxa de pelo menos 1 sat/byte.
Como resultado, a maioria dos nós da rede compartilha uma visão parecida do memory pool a qualquer momento.
Taxa Mínima
Qual é a taxa mínima do mempool?
Cada nó mantém uma taxa mínima por byte para limitar as transações que aceita no seu memory pool.
Esse valor aumenta quando o memory pool ultrapassa o seu limite de tamanho.
Por exemplo, se o memory pool fica grande demais, as transações de menor taxa são removidas e a taxa mínima aumenta para impedir a entrada de transações de taxa mais baixa. Por outro lado, se o tamanho do memory pool volta a cair abaixo do seu máximo, a taxa mínima diminui para permitir a volta de transações de taxa mais baixa.
A taxa mínima padrão do mempool é de 1 sat/byte.
Quando transações são removidas do mempool por estarem no fundo de um mempool grande demais (ordenado por taxa), a
minrelayfeeefetiva é elevada para a taxa das transações removidas.Ela então diminui continuamente, bem devagar, caindo pela metade a cada 3 a 12 horas, até precisar ser elevada novamente por causa de uma nova remoção.
Cálculo
Essa taxa mínima é controlada pela minrelayfee.
minrelayfee(dinâmica) — é o maior valor entre os dois seguintes:minmempoolfee(dinâmica) — um valor interno que sobe e desce quando o seu mempool atinge o tamanho máximo (maxmempool).minrelaytxfee(estática) — um valor fixo que você pode definir no arquivo de configuração do seu nó.
Em outras palavras, a minmempoolfee é um valor calculado internamente que se ajusta dinamicamente conforme o tamanho do seu mempool, e você pode sobrepô-lo definindo um mínimo permanente com minrelaytxfee. Quando o Bitcoin está rodando, a minrelayfee (a taxa mínima efetiva) é o maior desses dois valores.
Estrutura
O memory pool tem uma estrutura?
O memory pool não tem uma estrutura definida; é só um conjunto de transações não confirmadas.
Porém, as transações no memory pool incluem alguns metadados adicionais para ajudar na ordenação para inclusão em um bloco candidato.
Esses metadados incluem coisas como: tamanho, taxa, descendentes e ancestrais.
Descendentes
Um descendente é o filho de uma transação do memory pool.
Em outras palavras, é uma transação que gasta uma transação existente no memory pool. Então, se uma transação está no memory pool, é possível criar uma transação-filha que gasta a(s) saída(s) dessa transação e enviá-la também ao memory pool.
Portanto, uma transação pode ter vários descendentes enquanto está no memory pool.
O pai de uma transação-filha precisa sempre ser minerado primeiro. Uma transação-filha depende de o seu pai ser minerado antes que ela mesma possa ser minerada (senão estaria tentando gastar bitcoins que não existem). O pai pode ser minerado em um bloco anterior, ou mais acima no mesmo bloco que o filho. De qualquer forma, você não pode minerar uma transação-filha sem o pai dela.
Limites de descendentes. Uma transação do memory pool pode ter no máximo 25 descendentes. O tamanho total dos descendentes também é limitado a 101.000 bytes virtuais (101 kvB). (ver policy.h)
Taxa de Descendentes
Remoção do Memory Pool
A taxa de descendentes (descendant feerate) é a taxa média de uma transação e de todos os seus descendentes.
Ela é usada para determinar quais transações remover do memory pool.
Quando o memory pool de um nó atinge o limite de tamanho, ele procura remover primeiro as transações de menor taxa. Mas, antes de remover uma transação, ele olha a sua taxa de descendentes para ver se vale a pena mantê-la no memory pool.
Por exemplo:
- Taxa de descendentes maior: uma transação isolada pode ter taxa baixa o suficiente para ser candidata à remoção. Porém, se houver uma transação-descendente com taxa muito alta ligada a ela, a taxa de descendentes será maior, então pode valer a pena manter essa transação, porque é mais provável que ela seja minerada em breve (já que não se pode minerar um descendente de taxa alta sem o seu pai).
- Taxa de descendentes menor: se uma transação isolada tem taxa baixa o suficiente para remoção e a sua taxa de descendentes é a mesma (ou menor), podemos removê-la tranquilamente junto com todos os descendentes. Isso porque todos os descendentes dependem dessa transação, então não conseguiriam ser minerados sem ela.
Taxa média. A taxa média é a soma das taxas das transações dividida pela soma dos seus tamanhos. É o mesmo cálculo de taxa por byte de uma transação isolada, mas distribuído por várias transações.
Ancestrais
Um ancestral é o pai de uma transação do memory pool.
Uma transação do memory pool depende do(s) seu(s) ancestral(is) para ser minerada em um bloco. Isso porque você não pode incluir em um bloco uma transação que gasta uma saída que não existe (ou que ainda não foi criada).
Então, se você olhar qualquer transação no memory pool, é possível que ela tenha vários ancestrais, e esses ancestrais precisam ser minerados antes que aquela transação possa ser minerada.
Taxa de Ancestrais
Seleção do Bloco Candidato
A taxa de ancestrais (ancestor feerate) é a taxa média de uma transação e de todos os seus ancestrais.
Ela é usada para determinar quais transações selecionar para inclusão em um bloco candidato.
Um minerador tem que incluir todos os ancestrais de uma transação no seu bloco. Então ele calcula a taxa de ancestrais de cada transação para determinar se vale a pena incluir aquela transação e todos os seus ancestrais, em comparação com incluir outra transação de taxa parecida (mas sem ancestrais).
Por exemplo:
- Taxa de ancestrais menor: uma transação isolada pode ter taxa alta o suficiente para valer a pena incluí-la em um bloco candidato. Porém, se ela tiver ancestrais com taxas muito baixas, isso reduz a taxa de ancestrais e pode significar que não vale mais a pena incluí-la (comparada a outras transações com taxa absoluta menor, mas sem ancestrais).
- Taxa de ancestrais maior: uma taxa de ancestrais mais alta não melhora as chances de uma transação ser incluída em um bloco, pois o minerador pode simplesmente minerar os ancestrais e ignorar a transação atual se a taxa dela não for alta o suficiente.
Child Pays For Parent (CPFP). Você pode aumentar as chances de uma transação do memory pool ser minerada criando um filho com taxa alta. Isso aumenta a taxa média, o que torna a transação-pai mais atraente para um minerador.
Localização
Onde o memory pool é armazenado?
O memory pool é armazenado na RAM.
Isso significa que as transações do memory pool podem ser acessadas o mais rápido possível, o que oferece vários benefícios:
- Validação mais rápida de novas transações. Cada nova transação precisa ser verificada para ver se conflita com alguma das transações que estão atualmente no memory pool. Manter as transações do memory pool na RAM permite que os nós validem e retransmitam novas transações mais rapidamente.
- Retransmissão mais rápida de novos blocos. Todo novo bloco que um nó recebe precisa ser validado antes de poder ser gravado na sua blockchain e retransmitido a outros nós. Se a maioria das transações no bloco já está no mempool do nó, isso acelera a validação do bloco (já que a maior parte das transações já terá sido validada).
- Construção mais rápida do bloco candidato. Os mineradores precisam pegar transações do memory pool ao construir os seus blocos candidatos. Se todas as transações do memory pool estão na RAM, fica muito mais rápido ordená-las para a seleção.
Em resumo, manter o memory pool na RAM (em vez de gravar e ler do disco) ajuda um nó a funcionar de forma mais eficiente.
Isso também explica por que o memory pool tem um tamanho padrão relativamente "pequeno" de 300 MB (já que o espaço de RAM é muito menor que o espaço em disco em um computador típico). Ainda assim, isso é grande o suficiente para manter na memória vários blocos de dados de transação.
Comandos
Há três comandos principais para obter informações sobre o memory pool no Bitcoin Core:
bitcoin-cli getmempoolinfo
Mostra estatísticas sobre o memory pool do seu nó.
$ bitcoin-cli getmempoolinfo
{
"loaded": true,
"size": 3537,
"bytes": 1205164,
"usage": 7234352,
"total_fee": 0.03029446,
"maxmempool": 200000000,
"mempoolminfee": 1.0e-5,
"minrelaytxfee": 1.0e-5,
"incrementalrelayfee": 1.0e-5,
"unbroadcastcount": 0,
"fullrbf": true
} bitcoin-cli getrawmempool
Mostra os TXIDs de todas as transações no memory pool do seu nó.
bitcoin-cli getmempoolentry <txid>
Mostra os detalhes (incluindo metadados) sobre uma transação específica no memory pool do seu nó.
Por exemplo:
{
"vsize": 141,
"weight": 561,
"time": 1707864360,
"height": 830390,
"descendantcount": 2,
"descendantsize": 282,
"ancestorcount": 24,
"ancestorsize": 4072,
"wtxid": "2a088158bc6a69a1225de7e0465c749692bcf4f990db4b4c480fe804ea17851a",
"fees": {
"base": 0.00001128,
"modified": 0.00001128,
"ancestor": 0.00036896,
"descendant": 0.00002538
},
"depends": [
"95617833493987487f400cd8dc7c4874d6b8ec0898f2181f0a566ffc03b04a92"
],
"spentby": [
"d615139931d376c5f283db0259ca02d0ff1ee61f9b2b742fc7f82717675c9f41"
],
"bip125-replaceable": true,
"unbroadcast": false
} Notas
- Não existe "o memory pool". Ou seja, não há um único memory pool no qual todas as novas transações entram, já que cada nó mantém o seu próprio memory pool independente. Como resultado, os memory pools dos nós da rede serão ligeiramente diferentes a cada momento. Isso se deve a configurações diferentes (ex.:
maxmempool,mempoolexpiry,minrelaytxfee), à velocidade de propagação das transações e ao fato de poder haver transações conflitantes circulando pela rede ao mesmo tempo. Porém, normalmente há uma grande sobreposição em que a maioria dos nós tem transações parecidas nos seus memory pools, então não há nada de errado em usar o termo "o memory pool" para se referir ao estado geral dos memory pools da rede. Só esteja preparado para ser corrigido em fóruns técnicos se chamá-lo de "o memory pool". - O tempo de expiração padrão do mempool é de 2 semanas. Antes era de 3 dias, mas foi aumentado para 14 dias em 2017, com o lançamento do Bitcoin Core v0.14.0.
- Quando uma transação sai do memory pool, é como se nunca tivesse acontecido. Então não confie em transações do memory pool ao aceitar pagamentos. Se a transação sai do memory pool sem ser minerada, é como se nunca tivesse ocorrido. A única forma de trazê-la de volta ao memory pool seria retransmiti-la à rede.