Glossário / Nós e software
Neutrino
Outros nomes: BIP157, Filtros de bloco compactos.
- O que é Neutrino?
- Neutrino é o modelo de cliente leve em que a sua carteira baixa um filtro minúsculo para cada bloco, verifica esse filtro localmente e só busca os blocos completos que podem lhe dizer respeito.
Especificação no BIP-157.
Inverter o arranjo antigo é a ideia inteira. Em vez de dizer a um servidor quais endereços observar, a carteira pega um resumo compacto de cada bloco e faz a correspondência no próprio hardware. O Bitcoin Core consegue construir esses filtros desde a versão 0.19.0, de novembro de 2019, e servi-los aos pares desde a versão 0.21.0, então o mecanismo não depende mais de confiar em um único provedor.
Como funciona
O Neutrino se apoia em duas especificações, com uma única tarefa dividida entre elas.
O BIP158 define o filtro em si: para cada bloco, um conjunto que contém cada script de saída que o bloco cria e cada script de saída que ele gasta, comprimido em uma estrutura com codificação Golomb-Rice. Seus dois parâmetros são fixados pela especificação, P em 19 e M em 784.931, o que dá uma taxa de falsos positivos de aproximadamente um em 784.931 por elemento testado. Na prática, uma carteira que observa algumas dezenas de scripts baixa um punhado de blocos desnecessários por ano.
O BIP157 define as mensagens que movimentam esses filtros: getcfilters e cfilter para os filtros, getcfheaders e cfheaders para a cadeia de cabeçalhos de filtro, e getcfcheckpt para pontos de verificação periódicos. Os cabeçalhos de filtro importam mais do que parecem. Cada um fixa o anterior, então um cliente pode solicitar pontos de verificação a vários pares independentes e perceber imediatamente se um deles está servindo um conjunto de filtros diferente dos demais, sem precisar baixar os blocos para descobrir.
A rotina da carteira então é simples. Ela sincroniza os cabeçalhos de bloco, baixa cada filtro, testa cada um contra os scripts que possui e solicita o bloco inteiro somente quando um filtro indica que pode haver uma correspondência. O par que serve esse bloco fica sabendo que você queria o bloco 912.345 e nada mais, o que é um sinal muito mais fraco do que uma lista dos seus endereços. Em um nó do Bitcoin Core, o índice é ativado com blockfilterindex, cerca de 4 GiB de disco quando o recurso foi lançado, e é servido aos pares com peerblockfilters.
Onde você o encontra
O Neutrino é o backend de cadeia das carteiras Lightning móveis que se recusam a rodar um servidor.
O nome pertence primeiro à implementação em Go da Lightning Labs, que o lnd pode usar no lugar de um nó completo, e é aí que a maioria das pessoas o encontra: uma carteira de celular que abre canais e paga faturas sem carregar uma blockchain própria. A Breez e várias outras carteiras móveis seguem o mesmo caminho.
O custo é largura de banda e paciência. Um cliente Neutrino baixa cada filtro, haja ou não alguma correspondência, então usa muito mais dados do que uma carteira que simplesmente pede o saldo a um servidor, e restaurar um backup antigo significa percorrer os filtros para frente a partir da altura de criação da carteira em vez de obter uma resposta em uma única consulta. Em uma conexão móvel com franquia de dados, essa troca é uma decisão real, não uma formalidade.
Neutrino vs filtros bloom BIP37
No Neutrino, o cliente filtra os blocos; no BIP37, o cliente entregava o filtro a um servidor, que é o contrário do certo. Um filtro bloom BIP37 é construído a partir dos seus próprios endereços e enviado a um par, e pesquisadores mostraram repetidamente que os falsos positivos fazem pouco para esconder o que há dentro dele. Também era uma forma barata de negação de serviço, pois qualquer par podia pedir a um nó que reescaneasse a cadeia inteira contra um filtro arbitrário. O Bitcoin Core parou de servir BIP37 por padrão na versão 0.19.0, a mesma versão que introduziu o índice de filtros compactos, e qualquer carteira que ainda dependa dele está vazando seu conjunto de endereços para o nó ao qual estiver conectada no momento.
Neutrino vs um servidor Electrum
O Neutrino transfere o trabalho e o conhecimento para o seu dispositivo; um servidor Electrum fica com os dois. Consultar um servidor custa kilobytes e responde na hora, e é por isso que as carteiras de desktop o preferem, mas o operador acaba ficando com o seu histórico de endereços. O Neutrino gasta gigabytes ao longo da vida de uma carteira para manter esse histórico no seu celular.