> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Mempool

> Como as transações são admitidas, guardadas, ordenadas e disseminadas antes de o consenso as confirmar num bloco.

O mempool é o que está entre uma transação assinada e um bloco confirmado. Decide o que vale a pena guardar, por que ordem as transações de um emissor se tornam elegíveis, que pares ficam a saber de uma transação e o que é descartado quando a procura excede a capacidade.

Para uma rede de negociação isto é estrutural, não acessório. O tráfego de ordens e de cancelamentos é irregular, concentrado em poucos emissores e sensível à latência de forma assimétrica: um cancelamento que chega tarde é pior do que uma ordem que chega tarde. As estruturas abaixo existem porque uma única fila FIFO não lida bem com nada disto.

<h2 id="the-path-in">
  O caminho de entrada
</h2>

<div className="dg" data-dg="mempool-admission">
  <div className="dg-c" style={{aspectRatio:"720 / 252"}}>
    <svg className="dg-w" viewBox="0 0 720 252" aria-hidden="true">
      <path className="dg-wire dg--blue" d="M 124.00 145.00 L 145.60 145.00" />

      <path className="dg-head dg--blue" d="M 152.00 145.00 L 145.60 149.40 L 145.60 140.60 Z" />

      <path className="dg-wire dg--orange" d="M 340.00 145.00 L 356.00 145.00 L 356.00 46.00 L 365.60 46.00" />

      <path className="dg-head dg--orange" d="M 372.00 46.00 L 365.60 50.40 L 365.60 41.60 Z" />

      <path className="dg-wire dg--sky" d="M 340.00 145.00 L 365.60 145.00" />

      <path className="dg-head dg--sky" d="M 372.00 145.00 L 365.60 149.40 L 365.60 140.60 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 541.00 145.00 L 566.40 120.45" />

      <path className="dg-head dg--sky" d="M 571.00 116.00 L 569.46 123.61 L 563.34 117.28 Z" />

      <path className="dg-wire dg--sky dg-soft" d="M 541.00 145.00 L 566.55 171.40" />

      <path className="dg-head dg--sky" d="M 571.00 176.00 L 563.39 174.46 L 569.71 168.34 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"46.8254%",width:"16.6667%",height:"21.4286%"}}><span className="dg-t">Transação assinada</span></div>
    <div className="dg-b dg--yellow" style={{left:"21.6667%",top:"42.8571%",width:"25.0000%",height:"29.3651%"}}><span className="dg-t">Validação</span><span className="dg-s">assinatura · formato · estado da conta · o emissor consegue pagar?</span></div>
    <div className="dg-b dg--orange dg-left" style={{left:"52.2222%",top:"7.9365%",width:"47.7778%",height:"20.6349%"}}><span className="dg-t">Descartada, com motivo devolvido</span><span className="dg-s">não em silêncio — quem submeteu sabe porquê</span></div>
    <div className="dg-b dg--sky" style={{left:"52.2222%",top:"46.8254%",width:"22.2222%",height:"21.4286%"}}><span className="dg-t">Repositório de transações</span></div>
    <div className="dg-b dg--sky" style={{left:"80.0000%",top:"36.5079%",width:"20.0000%",height:"19.0476%"}}><span className="dg-t">Difusão a pares</span></div>
    <div className="dg-b dg--sky" style={{left:"80.0000%",top:"60.3175%",width:"20.0000%",height:"19.0476%"}}><span className="dg-t">Formação de lotes, depois consenso</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"85.7143%",width:"100.0000%"}}><div className="dg-n">A validação é barata e local, para que os recursos caros a jusante sejam gastos apenas em transações que poderiam realmente executar.</div></div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"36.5079%"}}>rejeitada</div>
    <div className="dg-lbl" style={{left:"49.4444%",top:"51.9841%"}}>aceite</div>
  </div>
</div>

Uma transação é validada antes sequer de ser guardada. A validação é barata e local — assinatura, formato, estado da conta e se o emissor consegue pagar o que está a pedir — e existe para que os recursos caros a jusante sejam gastos apenas em transações que poderiam realmente executar. Uma rejeição aqui devolve um motivo a quem submeteu, em vez de desaparecer em silêncio.

<h2 id="how-transactions-are-held">
  Como as transações são guardadas
</h2>

As transações aceites não são mantidas numa única fila plana. O repositório mantém várias vistas sobre o mesmo conjunto, cada uma respondendo a uma pergunta diferente.

<div className="dg" data-dg="mempool-views">
  <div className="dg-c" style={{aspectRatio:"720 / 332"}}>
    <svg className="dg-w" viewBox="0 0 720 332" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 36.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 92.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 148.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 204.00" />

      <path className="dg-wire dg-soft" d="M 195.00 148.00 L 245.00 260.00" />
    </svg>

    <div className="dg-b dg--blue dg-round" style={{left:"0.0000%",top:"31.0241%",width:"26.3889%",height:"27.1084%"}}><span className="dg-t">Um conjunto de transações aceites</span><span className="dg-s">cinco vistas, não cinco filas</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"3.0120%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">Ordenação por conta</span><span className="dg-s">Para este emissor, qual é a próxima transação?</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"19.8795%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">Índice de prioridade</span><span className="dg-s">Entre todos os emissores, o que oferecer primeiro ao consenso?</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"36.7470%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">Índice de expiração</span><span className="dg-s">O que ultrapassou o prazo?</span></div>
    <div className="dg-b dg--sky" style={{left:"34.7222%",top:"53.6145%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">Índice de cronologia</span><span className="dg-s">Que transações este par ainda não conhece?</span></div>
    <div className="dg-b dg--yellow" style={{left:"34.7222%",top:"70.4819%",width:"65.2778%",height:"15.6627%"}}><span className="dg-t">Zona de espera</span><span className="dg-s">O que é bem formado mas ainda não é elegível?</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.1566%",width:"100.0000%"}}><div className="dg-n">A zona de espera é onde um erro de integração se torna visível: uma transação válida que ainda não é a próxima do seu emissor fica em espera, não é rejeitada — torna-se elegível assim que a lacuna à sua frente fecha.</div></div>
  </div>
</div>

| Vista                    | Pergunta a que responde                                                  |
| ------------------------ | ------------------------------------------------------------------------ |
| **Ordenação por conta**  | Para este emissor, qual é a próxima transação?                           |
| **Índice de prioridade** | Entre todos os emissores, o que deve ser oferecido primeiro ao consenso? |
| **Índice de expiração**  | O que ultrapassou o prazo e deve ser removido?                           |
| **Índice de cronologia** | Que transações este par ainda não conhece?                               |
| **Zona de espera**       | O que está bem formado mas ainda não é elegível?                         |

A **zona de espera** merece a maior atenção, porque é aí que se torna visível uma classe de erros de integração. Uma transação pode ser perfeitamente válida e ainda assim não ser a próxima da fila do seu emissor — na maior parte das vezes porque uma transação anterior da mesma conta não chegou ou não foi confirmada. Uma transação assim fica em espera em vez de ser rejeitada: mantém-se disponível e torna-se elegível assim que a lacuna à sua frente for fechada. Um cliente que submeta fora de ordem sofre, portanto, um atraso e não uma falha, mas um cliente que nunca preencha a lacuna deixa trabalho em espera até expirar.

O **índice de cronologia** é o que torna incremental a disseminação entre pares. Cada par é acompanhado pelo ponto da cronologia até onde já foi servido, pelo que uma difusão envia o que falta a esse par em vez de reenviar todo o conjunto. A cronologia é dividida em compartimentos em vez de ser uma fila única, o que impede que um emissor pesado monopolize todos os slots de difusão.

<h2 id="dissemination-and-fairness">
  Disseminação e equidade
</h2>

Os nós não ficam a saber das transações cada um por si. Um nó que aceita uma transação difunde-a aos seus pares, e os pares não são tratados de forma idêntica — os pares a montante são priorizados, para que uma transação se desloque na direção dos validadores que podem agir sobre ela em vez de se difundir uniformemente pela rede.

A equidade é acompanhada ao longo do histórico recente em vez de ser imposta mensagem a mensagem. O mempool mantém um registo deslizante de que emissores e que tipos de tráfego consumiram capacidade recentemente e usa-o para moldar o que é servido a seguir. É este o mecanismo que impede que a tempestade de ordens e cancelamentos de uma única conta expulse o resto da rede, sem precisar de um rate limit rígido por conta que penalizaria o market making legítimo.

<h2 id="handoff-to-consensus">
  Passagem ao consenso
</h2>

O consenso não retira as transações do mempool uma a uma. As transações são reunidas em **lotes**, os lotes são disseminados pelos validadores em segundo plano e cada lote recolhe confirmações de receção até o seu originador conseguir provar que uma parte suficiente da rede o detém. Só então uma proposta de bloco o pode referenciar.

A consequência é que uma proposta de bloco transporta digests de lotes e não corpos de transações, pelo que o tamanho das mensagens de consenso se mantém constante à medida que o débito sobe — e um bloco confirmado é sempre reexecutável, porque os dados por detrás dele foram provados disponíveis antes de serem referenciados. Ver [IntentionBFT](/pt/protocol/architecture/intention-bft) para saber como essa prova é formada e usada.

<Note>
  É também por isto que a admissão no mempool não é o mesmo que inclusão. Uma transação aceite, guardada e difundida entrou na fila; não foi ordenada. Nada sobre o destino de uma transação está fechado até o consenso confirmar o bloco que a contém.
</Note>

<h2 id="what-this-means-for-a-client">
  O que isto significa para um cliente
</h2>

* **Uma rejeição na submissão é informativa.** Aconteceu antes de a transação ser guardada, e o motivo descreve algo que o cliente pode corrigir.
* **Silêncio não é rejeição.** Uma transação pode estar em espera atrás de uma lacuna criada pelo próprio cliente. Acompanhar o que foi submetido e o que foi confirmado, em vez de assumir que a falta de uma confirmação significa que se perdeu.
* **A ordem dentro de uma conta importa; a ordem entre contas não.** Duas transações do mesmo emissor têm uma sequência definida. Duas transações de emissores diferentes são ordenadas pelo consenso, não por quem submeteu primeiro.
* **Os cancelamentos não são privilegiados no mempool.** A prioridade de cancelamento é uma propriedade da [execução do kernel](/pt/protocol/architecture/kernel), onde os cancelamentos correm antes das colocações agressivas no mesmo bloco — não da colocação em fila.
