Glossário / Nós e software
Mensagem P2P
Outros nomes: Mensagem.
- O que é a mensagem P2P?
- As mensagens P2P são o vocabulário fixo que os nós de bitcoin usam para conversar entre si: comandos curtos como version, inv, getdata, tx e block, enviados por uma conexão TCP comum.
Não existe servidor central algum para chamar, então toda a relação de um nó com a rede é essa conversa. O Bitcoin Core anuncia a versão de protocolo 70016, abre suas conexões na porta 8333, e todo o vocabulário cabe em uma página. Seu saque chega a um minerador porque uma máquina disse tx a outra, repassado alguns milhares de vezes em poucos segundos.
Como funciona
Toda conexão começa com um handshake e depois se acomoda em um pequeno conjunto de trocas recorrentes.
A primeira coisa que qualquer um dos lados envia é version, que carrega o número de protocolo que ele fala, suas sinalizações de serviço, a hora atual, o endereço que ele acredita que o outro lado tem, um nonce aleatório usado para detectar que ele discou para si mesmo por acidente, uma string de agente de usuário e a altura da melhor cadeia que ele conhece. Cada lado responde com verack. Até que os dois tenham feito isso, nada mais é processado.
Esse número de protocolo é uma escada de recursos, não decoração. O anúncio direto de cabeçalhos exige 70012, a negociação de blocos compactos exige 70014, anunciar um bloco compacto antes da validação completa exige 70015, e retransmitir transações por identificador de testemunha exige 70016. Um nó lê o número do seu par e discretamente deixa de oferecer recursos que aquele par não pode usar, e é assim que a rede se atualiza sem uma transição coordenada.
Agrupado por finalidade, o vocabulário é curto. Encontrar pares: getaddr, addr e a forma addrv2 do BIP155, que pode carregar endereços de Tor e I2P. Anunciar: inv e headers. Solicitar: getheaders, getdata, getblocks, mempool. Entregar: tx, block, cmpctblock, blocktxn, notfound. Manutenção: ping, pong, sendheaders, sendcmpct, wtxidrelay e feefilter, sendo que este último diz a um par para não se dar ao trabalho de repassar transações abaixo de uma taxa declarada.
Dois silêncios são propositais. Comandos não reconhecidos são ignorados em vez de rejeitados, e é isso que permite que um novo tipo de mensagem seja lançado aos poucos em uma rede que ninguém consegue atualizar de uma vez. E um par não tem como dizer por que descartou sua transação: a mensagem reject do BIP61 foi desativada por padrão no Bitcoin Core 0.18.0 e a opção foi removida por completo no 0.20.0, porque as respostas eram pouco confiáveis, triviais de falsificar e rotineiramente tomadas por autoritativas.
Onde você vê isso
As mensagens P2P são o que seu próprio nó passa o dia inteiro fazendo, e é fácil observá-las.
Inicie o Bitcoin Core com -debug=net e o registro nomeia cada mensagem conforme ela chega. A chamada getpeerinfo informa, para cada conexão, os bytes enviados e recebidos divididos por tipo de mensagem, o que é a maneira mais rápida de descobrir que um par está fornecendo quase tudo para você enquanto os demais ficam ociosos. Transmitir um pagamento de uma carteira apontada para o seu próprio nó produz uma pequena sequência reconhecível: um inv saindo, um getdata voltando, um tx saindo em resposta.
Mensagem P2P vs RPC
O Bitcoin tem duas interfaces e elas não são intercambiáveis. P2P é de nó para nó: sem autenticação, sem criptografia a menos que os dois lados negociem o transporte v2, na porta 8333, com um vocabulário que nenhum participante pode ampliar sozinho. RPC é de programa para nó: autenticada, local por padrão, na porta 8332, com uma lista de métodos que muda a cada versão. Um pagamento que você cria passa pelas duas, entrando no seu nó como uma chamada RPC e saindo dele como uma mensagem P2P, e só a segunda metade é assunto de qualquer outra pessoa.