Glossário / Nós e software
Inventário
Outros nomes: Mensagem inv.
- O que é um inventário?
- Um inventário é a lista de identificadores de objetos que um nó anuncia aos seus pares, dizendo quais transações e blocos ele tem sem enviar nenhum deles ainda.
Anuncie primeiro, entregue quando solicitado. Esse padrão é o motivo pelo qual a rede não se afoga em duplicatas: cada entrada custa 36 bytes, uma etiqueta de tipo de quatro bytes mais um hash de 32 bytes, e uma única mensagem inv pode carregar até 50.000 delas. Um par que já tem o objeto nunca pede, e a largura de banda nunca é gasta.
Como funciona
Uma entrada de inventário é um par: um número que diz que tipo de coisa é, e o hash que a identifica.
Os códigos de tipo são inteiros pequenos. 1 é uma transação, 2 é um bloco, 3 é um bloco filtrado do antigo esquema de filtros Bloom, 4 é um bloco compacto, 5 é uma transação identificada por seu hash de testemunha. Definir o bit 0x40000000 sobre um tipo marca a variante com testemunha, então um par compatível com SegWit solicita MSG_WITNESS_BLOCK onde um mais antigo teria pedido um bloco simples.
A troca ocorre em três etapas. Um nó envia inv listando o que é novo. O par examina a lista, ignora tudo o que reconhece e responde com getdata nomeando apenas o que lhe falta. O nó envia esses objetos, uma mensagem para cada um, ou notfound quando algo foi descartado nesse meio-tempo. A aritmética por trás do limite de 50.000 vale a pena notar: 50.000 entradas a 36 bytes são 1.800.000 bytes, confortavelmente dentro do teto de 4.000.000 bytes em uma única mensagem, e Bitcoin Core inclui uma asserção em tempo de compilação que mantém essas duas constantes coerentes entre si.
O momento do anúncio é um controle de privacidade, não um detalhe de implementação. Bitcoin Core não anuncia uma transação no instante em que fica sabendo dela. Os anúncios são agrupados em lotes e liberados em um temporizador aleatório que em média leva dois segundos para pares de saída e cinco para pares de entrada, de modo que um observador conectado a muitos nós não pode usar a ordem de chegada para descobrir onde um pagamento começou. Os blocos pulam o atraso por completo, porque não há nada a esconder e segundos custam dinheiro.
Gritar cada hash para cada par é caro, e Erlay é a cura proposta: os pares reconciliam periodicamente esboços curtos do que cada um tem, em vez de inundar todas as direções com identificadores.
Onde você vê isso
Os inventários são a coisa mais barulhenta na interface de rede de um nó e a mais fácil de observar.
A chamada getpeerinfo divide o tráfego por tipo de mensagem, e inv quase sempre está entre os maiores contadores. Um nó bem conectado gasta uma parte real de sua largura de banda anunciando hashes que ninguém acabou precisando. É também por isso que um pagamento aparece em um explorador de blocos segundos antes de outro: são observadores separados que ouvem anúncios separados de partes diferentes da rede.
Um hábito que vale a pena desaprender: um inv não é um compromisso. Um nó pode anunciar uma transação e então descartá-la minutos depois, quando sua mempool se enche, e não deve a ninguém uma correção.
Inventário vs mempool
Um inventário é uma mensagem; uma mempool é um armazenamento, e só um deles sobrevive ao momento. O inv diz a um par que um hash existe em algum lugar. A mempool é o conjunto de transações não confirmadas que um nó realmente validou, mantém na memória e está disposto a encaminhar ou minerar, com tamanho padrão de 300 MB e uma política de expulsão que descarta as mais baratas primeiro. Ver seu txid se propagar por anúncios inv diz que a rede ouviu falar do seu pagamento. Não diz que alguém ainda o tem uma hora depois.