Glossário / Mineração e consenso
Bloco de Merkle
Outros nomes: Merkle block, Ramo de Merkle parcial.
- O que é um bloco de Merkle?
- Um bloco de Merkle é a resposta que uma carteira leve recebe quando pede o conteúdo filtrado de um bloco: o cabeçalho de 80 bytes mais apenas os hashes necessários para provar quais transações coincidiram.
Especificação no BIP-37.
O BIP37 permitia que uma carteira entregasse um filtro a um nó e recebesse apenas o que coincidisse, envolto em uma prova de que nada havia sido fabricado. O projeto falhou na privacidade e na carga: Bitcoin Core desativou o recurso por padrão na versão 0.19.0, lançada em novembro de 2019. Se você usa uma carteira leve moderna, ela quase com certeza usa filtros compactos de blocos.
Como funciona
Status: a filtragem por filtro de Bloom do BIP37, e a mensagem merkleblock que a atende, foi desativada por padrão no Bitcoin Core 0.19.0 em novembro de 2019 por motivos de privacidade e de negação de serviço. Os filtros compactos de blocos, especificados nos BIP157 e BIP158, a substituíram, e o Bitcoin Core consegue servi-los a seus pares desde a versão 0.21.0, de janeiro de 2021.
Um bloco de Merkle é uma prova, não um resumo. Sua estrutura tem quatro partes: o cabeçalho do bloco, o número total de transações do bloco, uma lista ordenada de hashes e um campo de bits compacto de indicadores. Os indicadores descrevem um percurso em profundidade pela árvore de Merkle do bloco e dizem à carteira receptora se deve descer a um ramo ou tomar o próximo hash da lista como substituto de tudo o que está abaixo dele. A carteira refaz esse percurso, chega a uma raiz e a compara com a raiz do cabeçalho que recebeu.
Essa comparação é o ponto central. Um par hostil pode ocultar transações de você simplesmente não as mencionando, e nenhum protocolo filtrado pode impedir isso. O que ele não pode fazer é inventar uma transação que você nunca recebeu, porque o hash fabricado não reconstruiria uma raiz que coincidisse com um cabeçalho com prova de trabalho real por trás.
Solicitar um deles é uma troca em duas etapas. A carteira envia um filtro com uma mensagem filterload e depois pede um bloco usando um tipo de inventário de bloco filtrado em vez do comum. O bloco de Merkle chega primeiro, seguido das transações coincidentes completas como mensagens separadas. Um bloco com 2.000 transações e uma única coincidência custa à carteira um cabeçalho, cerca de uma dúzia de hashes e uma transação, em vez de um megabyte ou mais.
Onde você o vê
Os blocos de Merkle pertencem a uma geração de carteiras móveis que em grande parte foi aposentada.
A biblioteca BitcoinJ os popularizou, e as carteiras para Android construídas sobre ela passaram a maior parte da década de 2010 sincronizando dessa forma. Quem usa uma versão antiga de um desses aplicativos pode ainda estar enviando mensagens filterload e falhando em silêncio ao procurar um par que responda, já que atender a essas mensagens exige que um operador tenha reativado à mão a opção peerbloomfilters.
O que os substituiu inverte o sentido do pedido. Com os filtros compactos de blocos, o nó publica um pequeno filtro por bloco descrevendo o que aquele bloco contém, e a carteira baixa os filtros, decide localmente quais blocos são interessantes e busca esses blocos inteiros. Nada sobre os endereços da carteira sai do dispositivo. Esse é o modelo por trás do backend Neutrino do lnd e das carteiras Lightning móveis construídas sobre ele.
A falha de privacidade merece ser dita claramente, porque é a razão da mudança. Um trabalho publicado em 2014 por Arthur Gervais e coautores mostrou que um nó que atendia a um cliente com filtro de Bloom podia recuperar a grande maioria dos endereços desse cliente, e que pedir dois blocos com o mesmo filtro ainda vazava mais. O preenchimento de falsos positivos que deveria ocultar a carteira não a ocultava.
Bloco de Merkle vs filtro de Bloom
O filtro de Bloom é o que a carteira envia; o bloco de Merkle é o que volta. Um filtro é uma descrição probabilística e com perdas dos endereços e outpoints com que alguém se importa, e fica no nó que atende. Um bloco de Merkle é uma prova determinística sobre um bloco específico, e fica na resposta. Os dois foram descontinuados em conjunto, mas só o filtro era o problema de privacidade. As provas de Merkle em si continuam válidas, e é por isso que os filtros compactos de blocos mantiveram a ideia da prova e descartaram a parte em que você conta a um desconhecido o que possui.