Mempool

Difficoltà: intermedio

Argomento: tecnologia


DEFINIZIONE

Il termine mempool è la contrazione di memory pool.

È quella zona di memoria, una specie di area di attesa, dove i nodi tengono le transazioni che non sono ancora confermate (pending), ovvero che non sono state ancora inserite in un blocco della blockchain, in attesa di essere prelevate da un miner che le inserisca in un blocco e aggiunga questo blocco alla blockchain.

Non esiste una mempool condivisa tra i nodi, anche se le mempool dei vari nodi tendono a convergere come contenuto: le transazioni Bitcoin vengono trasmesse attraverso un sistema distribuito asincrono tra i vari nodi che gestiscono la propria mempool e ci memorizzano le transazioni da confermare ricevute dagli altri nodi, e le mantengono in base a regole e parametri impostati nel proprio software.

I nodi devono verificare che le transazioni all'interno del mempool siano valide verificando schemi di firma corretti, che gli output non superino gli input e che i fondi non siano stati spesi due volte.

Le transazioni che si trovano nella mempool vengono anche chiamate 0-conf, perché non hanno ancora ricevuto una conferma.

Le transazioni nella mempool possono essere sostituite, un processo che viene chiamato unconfirmed transaction replacement, ad esempio modificate tramite il meccanismo RBF Replace by Fee, che consente a chi ha creato la transazione di incentivare i miner ad inserire prima la transazione in blockchain aumentando le fee.

Anche il destinatario della transazione può incentivare i miner a confermare la transazione attraverso CPFP Child pays for parent.

L'idea che una transazione che rimane troppo tempo nella mempool senza essere confermata scada, è sbagliata.

Il protocollo bitcoin non ha una regola per far scadere le transazioni che sono nella mempool e che non sono state confermate, in pratica non esiste un campo time che possa essere usato per fare in modo che si possa far scadere dopo un certo periodo di tempo una transazione in attesa di essere confermata. Una volta creata una transazione Bitcoin, non scade mai automaticamente. In teoria si potrebbe creare una transazione che rimane bloccata a 0 conferme per alcuni anni, e poi all'improvviso essere inserita in un blocco e quindi confermata.

Ogni full node bitcoin ha una sua mempool, che di default non supera i 300 Mbyte ma tale dimensione può essere impostata per ogni nodo. Si può vedere usando il comando:

bitcoin-cli getmempoolinfo

che visualizza nel campo maxmempool il valore impostato come dimensione della mempool.

Questo spazio non misura quanto occuperanno effettivamente le transazioni nel blocco, ma la memoria necessaria dal software per gestire questi dati, e dipende anche dalla piattaforma utilizzata per far girare il software del nodo.

Teniamo conto che ogni nodo si collega a diversi nodi peer e a questi farà il relay delle nuove transazioni che riceve. Quando la coda di transazioni (backlog) del nodo arriva a raggiungere l'occupazione di memoria del valore di maxmempool, elimina le transazioni con le feerate più basse e aumenta il suo minMempoolFeeRate. Comunica il nuovo minMempoolFeeRate ai suoi peer, dicendo loro essenzialmente di non inoltrare transazioni con una feerate inferiore per il momento.

Ogni nodo agisce individualmente, quindi un nodo con un mempool più grande o un'architettura diversa potrebbe eliminare le transazioni prima o dopo. Inoltre, i nodi mantengono una copia delle transazioni rilevanti per il proprio wallet. Anche se tutti gli altri nodi hanno eliminato una transazione, il mittente e i destinatari della transazione ne conservano una copia. Quindi, se la transazione è tua o sei il destinatario, continuerai a vederla come pending o on-chain quando confermata.

Dopo che il backlog diminuisce al punto che la memoria necessaria è inferiore alla maxmempool impostata e con un certo ritardo aggiunto, un nodo diminuirà il proprio minMempoolFeeRate e ricomincerà ad accettare le transazioni che in precedenza aveva espulso.

Il nodo di Bitcoin Core ha il parametro mempoolexpiry che indica il numero di ore dopo le quali le transazioni vengono rimosse dalla mempool, ed è impostato di default a 336 ore ovvero 2 settimane (precedendemente era 72 ore); ogni nodo può impostare liberamente questo parametro.

Bisogna quindi considerare che anche se la maggior parte dei nodi dovesse dimenticare una transazione, ovvero cancellarla dalla mempool, non significa che tutti debbano farlo o lo faranno.

La possibilità che una transazione possa, in un certo modo, scadere comunque esiste: quando si trasmette una transazione, si invia un frame tx a tutti i peer connessi. Questi peer memorizzano la transazione nella loro mempool e dicono a tutte le loro connessioni che hanno una nuova transazione. Quando quelle connessioni non ce l'hanno ancora, la chiedono, ed è così che una transazione si diffonde nella rete dei nodi bitcoin. Ad un certo punto ogni nodo della rete avrà la transazione nella sua mempool, e a quel punto non sarà più inviata sulla rete.

Da Bitcoin Core 0.14.0, la mempool è salvata su disco, quindi persiste anche dopo il riavvio. Nelle versioni precedenti, un riavvio comportava anche la cancellazione del mempool.

Se la mempool viene cancellata, ne viene forzata la cancellazione, o viene cancellata per superamento della memoria o per altri motivi, e la transazione viene eliminata dai vari nodi, queste condizioni rendono molto improbabile che la transazione sparisca dall'intera rete, ma non impossibile.

A partire da Bitcoin Core 0.14.0, questi sono i modi per cui una transazione può lasciare la mempool:

  • La transazione è stata inclusa in un blocco.
  • La transazione o uno dei suoi antenati non confermati è in conflitto con una transazione inclusa in un blocco.
  • La transazione è stata sostituita da una versione più recente, ad esempio tramite RBF
  • La transazione si trovava in fondo alla mempool (se ordinata per feerate ovvero in base alle fee per dimensione), il mempool ha raggiunto il suo limite di dimensione (vedere l'opzione -maxmempool) e una nuova transazione a tariffa più alta è stata accettata, sfrattando quella in fondo.
  • La transazione è scaduta per timeout (per impostazione predefinita, 14 giorni dopo l'inserimento).
  • Inoltre, le transazioni che hanno lasciato la mempool possono sempre rientrarvi. Ad esempio, quando fanno parte del portafoglio locale e vengono ritrasmesse, o quando vengono ricevute di nuovo attraverso la rete. Lo sfratto non implica l'annullamento di una transazione.


aggiornato il 2022-01-10