Desempenho do servidor

Atualizado: 1 Fev, 2022

O Sparrow Wallet baseia-se no protocolo do servidor Electrum para a gestão dos dados da transação.

Este documento fornece referências de desempenho actuais para várias implementações de servidores Electrum de índice completo em hardware padrão e discute duas abordagens de implementação distintas com base nestas conclusões.

Antecedentes

Um servidor Electrum funciona como um índice de endereços Bitcoin, permitindo aos utilizadores recuperar transacções associadas a um determinado endereço. Ao contrário da implementação de referência Bitcoin, que não tem esta caraterística, os servidores Electrum oferecem esta funcionalidade. Embora os filtros de blocos compactos possam fornecer informações semelhantes, não suportam transacções mempool e são menos eficientes.

O protocolo de servidor Electrum é o protocolo de índice de endereço Bitcoin mais amplamente adotado. Este benchmark centra-se em índices de endereços completos, que são cruciais para a privacidade, uma vez que não armazenam detalhes específicos da carteira no servidor. Para uma segurança óptima de armazenamento a frio, toda a informação da carteira deve estar contida no ficheiro da carteira e ser removida do servidor após o encerramento da carteira. Esta abordagem exclui projectos como o BWT e o EPS que requerem o armazenamento de endereços de carteiras no servidor.

MotivaçãoPermanente

Este parâmetro de referência baseia-se no relatório de desempenho de julho de 2020 da Jameson Lopp, com duas diferenças fundamentais:

  1. Utiliza um Raspberry Pi 4 em vez de um servidor AWS, o que o torna mais relevante para os utilizadores domésticos.
  2. Utiliza compilações actualizadas dos projectos e testa-os novamente após alterações significativas.

Essas atualizações tornam os benchmarks particularmente úteis para os usuários do Sparrow que desejam executar seu próprio servidor Electrum em um computador de placa única, permitindo que eles comparem diferentes implementações e escolham a que melhor se adapta às suas necessidades. Os resultados fornecem informações práticas para os usuários que consideram auto-hospedar um servidor Electrum em um ambiente doméstico.

Hardware

Este benchmark utiliza hardware típico para utilizadores do Sparrow preocupados com a privacidade: um Raspberry Pi 4 (modelo de 8GB) com o sistema operativo Ubuntu 21.10 de 64 bits. O armazenamento de dados utiliza um SSD USB externo de 1TB, preferível aos HDDs devido ao grande tamanho do blockchain do Bitcoin e dos índices associados (aproximadamente 0,5 TB). Esta configuração reflecte configurações comuns de utilizadores domésticos, fornecendo dados de desempenho relevantes para aqueles que consideram auto-hospedar um servidor Electrum em configurações semelhantes de computadores de placa única.

Projectos

ElectrumX

ElectrumX, o sucessor do projeto original do servidor Electrum, foi adotado em 2017. Depois de o autor original ter cessado o suporte da blockchain Bitcoin, os programadores da Electrum bifurcaram o projeto, agora mantido em https://github.com/spesmilo/electrumx.

Um desafio significativo com o ElectrumX é a construção inicial do índice, que leva cerca de uma semana no hardware de teste. No entanto, os utilizadores podem construir o índice numa máquina mais potente e transferi-lo para um computador de placa única. Pontos principais:

  • Tamanho atual da base de dados: 75 GB
  • Requer txindex habilitado no Bitcoin Core
  • Não há binários pré-compilados disponíveis
  • Versão testada: ElectrumX 1.16

O índice do ElectrumX pode ser construído em hardware mais potente e transferido, oferecendo flexibilidade aos utilizadores com recursos informáticos limitados.

Eléctricos

O Electrs, concebido para uso pessoal e não para servidores públicos, oferece requisitos de armazenamento mais baixos mas uma utilização de CPU mais elevada em comparação com o ElectrumX. É mantido em https://github.com/romanz/electrs.

A principal vantagem do Electrs é o seu tempo de construção de índice mais rápido, demorando apenas 12-24 horas no hardware de teste. Esta eficiência tornou-o a escolha preferida para a maioria dos pacotes de nós pré-construídos. Pontos principais:

  • Tamanho atual da base de dados: 32 GB
  • Não requer txindex no Bitcoin Core
  • Não há binários pré-compilados disponíveis
  • Versão testada: Electrs 0.9.4

O tempo de construção do índice significativamente mais curto e o tamanho mais pequeno da base de dados tornam o Electrs uma opção atractiva para uso pessoal, especialmente em hardware com recursos limitados.

Fulcro

Fulcrum, uma implementação moderna em C++, oferece um elevado desempenho apesar dos requisitos de espaço em disco mais elevados. Mantido em https://github.com/cculianu/FulcrumO sistema de indexação de dados da Internet, que é um sistema de indexação de dados, permite um equilíbrio entre a velocidade de indexação e o desempenho operacional.

A indexação do Fulcrum demora 2-3 dias no hardware de teste, posicionando-o entre o Electrs e o ElectrumX em termos de tempo de construção. Uma vez indexado, proporciona um desempenho excecional. Pontos principais:

  • Tamanho atual da base de dados: 102 GB
  • Requer txindex habilitado no Bitcoin Core
  • Binários pré-compilados disponíveis para Linux (x86_64 e arm64) e Windows
  • Versão testada: Fulcrum 1.6.0

A combinação do Fulcrum com um tempo de indexação razoável e um excelente desempenho operacional torna-o uma opção atraente, especialmente para os utilizadores que podem acomodar as suas maiores necessidades de armazenamento.

Electros-esplora

O Electrs-esplora, uma bifurcação do Electrs, cria índices adicionais para melhorar o desempenho da empresa. No entanto, seus altos requisitos de dados (aproximadamente 800 GB) o tornam inadequado para o hardware de teste. Pontos principais:

  • Necessidade de armazenamento extremamente grande (~800 GB)
  • Pode ser executado com --lightmode reduzindo o espaço em disco para metade
  • Mesmo no modo leve, quase esgota uma unidade de 1 TB quando combinada com a cadeia de blocos de ~420 GB

As necessidades de armazenamento extensivo desta implementação excedem as configurações típicas de computadores de placa única, tornando-a impraticável para a maioria dos utilizadores domésticos. Embora ofereça benefícios de desempenho para uso empresarial, suas demandas de recursos limitam sua aplicabilidade em implantações pessoais ou de pequena escala.

addrindexrs

addrindexrs é outro fork do Electrs, usado pelo backend Dojo para recuperação de dados históricos de transações. Ele não possui mudanças significativas relacionadas ao desempenho que justificariam sua inclusão como uma implementação separada neste benchmark. Este fork mantém características semelhantes ao projeto Electrs original, tornando-o redundante para efeitos de comparação de desempenho neste contexto.

Indexação

O desempenho da indexação varia significativamente entre as três implementações:

ElectrumX: Indexação mais lenta (1 semana), devido ao single-threading do Python e à análise de blocos mais lenta. No entanto, o seu índice abrangente permite respostas mais escaláveis do servidor sem consultas frequentes do Bitcoin Core. Um sistema operacional de 64 bits é crucial para um desempenho ideal.

Electros: Indexação mais rápida (1 dia), atribuída ao seu índice mais pequeno e mais simples e à recuperação e análise optimizadas de blocos. Esta velocidade tem um custo: tem de reparar blocos durante a operação, o que pode afetar o desempenho de carteiras mais profundas.

Fulcrum: Tempo de indexação moderado (2-3 dias), construindo um índice ligeiramente maior do que o ElectrumX, mas muito mais rápido. O seu processo de utilização intensiva de recursos beneficia da implementação de uma linguagem de baixo nível. O sincronização rápida pode melhorar ainda mais a velocidade de indexação. O índice abrangente resultante conduz a um excelente desempenho operacional.

Cada implementação apresenta um compromisso entre o tempo de indexação, o tamanho do índice e a eficiência operacional, atendendo a diferentes casos de utilização e capacidades de hardware.

O teste

Este benchmark avalia duas cargas de servidor comuns do Sparrow usando uma carteira grande (~3000 endereços usados):

  1. Carregamento inicial da carteira: Concentra-se nas subscrições de endereços, que permitem ao Sparrow receber actualizações para transacções de endereços. É importante notar que cada pedido de subscrição devolve um hash de todos os IDs de transação e alturas de bloco que afectam esse endereço. O teste mede o tempo para subscrever todos os endereços da carteira.
  2. Atualização da carteira: Simula a recuperação de todos os dados da carteira (transacções e blocos) durante uma atualização manual, o que é necessário quando os problemas de comunicação conduzem a dados errados. As subscrições de endereços já estão em vigor para este teste.

Parâmetros-chave de ensaio:

  • Carteira grande com ~3000 endereços usados
  • Tamanho de página de lote de 50 para todos os servidores
  • Mede o tempo de subscrição para o carregamento inicial
  • Mede o tempo de recuperação de dados para atualização da carteira

Esta abordagem permite uma comparação exaustiva do desempenho entre diferentes implementações do servidor Electrum, centrando-se em cenários de utilização reais em Sparrow Wallet.

Teste 1: Carga inicial (subscrição de endereços)

Teste Arranque a frio Corrida 1 Corrida 2 Corrida 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Eléctricos 322386 ms 393303 ms 384036 ms 427722 ms
Fulcro 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum: Mais rápido (média de ~1660 ms)
  • ElectrumX: Moderado (avg ~49,133 ms)
  • Electros: Mais lento (média de ~381,862 ms)

A Fulcrum supera a ElectrumX em 22x e a Electrs em ~300x para o carregamento inicial da carteira.

Teste 2: Atualização da carteira (recuperação de dados)

Teste Arranque a frio Corrida 1 Corrida 2 Corrida 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Eléctricos 17562 ms 11621 ms 11219 ms 11521 ms
Fulcro 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum: Mais rápido (média de ~9.208 ms)
  • Electros: Segundo (média de ~12.981 ms)
  • ElectrumX: Mais lento (média de ~84,066 ms)

O Fulcrum é 8x mais rápido do que o ElectrumX e 1,5x mais rápido do que o Electrs para atualização de carteiras.

A Fulcrum demonstra consistentemente um desempenho superior em ambos os testes, mostrando vantagens significativas no carregamento inicial e mantendo uma vantagem na atualização da carteira. A ElectrumX tem um desempenho moderado no carregamento, mas tem dificuldades com as actualizações. A Electrs, embora lenta no carregamento inicial, apresenta um desempenho competitivo na atualização.

Discussão

O Sparrow Wallet baseia-se no protocolo do servidor Electrum para a gestão de dados de transação. Este documento compara o desempenho das implementações do servidor Electrum de índice completo em hardware padrão, com foco no Raspberry Pi 4 com 8 GB de RAM e SSD USB externo de 1 TB. Ele examina as implementações ElectrumX, Electrs e Fulcrum.

ElectrumX, mantido em https://github.com/spesmilo/electrumxO Bitcoin Core, leva cerca de uma semana para construir seu índice de 75GB em hardware de teste e requer txindex habilitado no Bitcoin Core. Electrs, projetado para uso pessoal https://github.com/romanz/electrsO Fulcrum, que constrói um índice de 32 GB em 12-24 horas sem precisar do txindex. Fulcro https://github.com/cculianu/Fulcrum constrói um índice de 102 GB em 2-3 dias, requer o txindex e oferece binários pré-compilados.

Os testes utilizaram uma carteira grande (~3000 endereços) para medir o carregamento inicial (subscrições de endereços) e a atualização da carteira (recuperação de dados). Os resultados mostram que o Fulcrum supera significativamente os outros, sendo 22x mais rápido que o ElectrumX e ~300x mais rápido que o Electrs no carregamento inicial, e 8x mais rápido que o ElectrumX e 1,5x mais rápido que o Electrs na atualização.

A disparidade de desempenho entre Fulcrum e Electrs no carregamento inicial (1,4 segundos vs 6 minutos) deriva das suas diferentes abordagens de armazenamento de dados. O Electrs armazena um mínimo de dados, exigindo uma extensa recuperação e análise de blocos para cada carregamento de carteira. Para a carteira de teste, isto significava processar 3,5 GB de blocos repetidamente, causando uma elevada carga na CPU e potenciais falhas de resposta em computadores de placa única. A ElectrumX e a Fulcrum mantêm índices de endereços abrangentes, permitindo uma recuperação de dados eficiente. Esta abordagem, combinada com o índice de transacções do Bitcoin Core, permite o desempenho superior da Fulcrum.

A implementação C++17 do Fulcrum fornece velocidade consistente em todas as plataformas, enquanto a arquitetura baseada em Python do ElectrumX mostra um desempenho inconsistente e uma utilização mais elevada da CPU. Estas descobertas destacam as compensações entre o tamanho do índice, a velocidade de consulta e a utilização de recursos nas implementações do servidor Electrum, com o Fulcrum a oferecer o melhor equilíbrio para a maioria dos utilizadores.

Conclusão

Este benchmark revela que o Fulcrum é a melhor implementação do servidor Electrum para utilizadores Sparrow Wallet.

Apesar de um tempo de indexação inicial ligeiramente mais longo em comparação com o Electrs, o índice abrangente do Fulcrum oferece escalabilidade e desempenho superiores.

À medida que as profundidades das carteiras aumentam e os custos de armazenamento diminuem, as vantagens do Fulcrum em termos de velocidade de consulta, fiabilidade e longevidade do hardware compensam o seu maior requisito de espaço em disco.

Enquanto o Electrs pode ser adequado para cenários com espaço em disco muito limitado e carteiras pequenas, o Fulcrum é recomendado como o servidor ideal para o Sparrow, fornecendo o melhor equilíbrio entre desempenho e utilização de recursos para a maioria dos utilizadores.

Nota técnica
A indexação eficiente de endereços nos servidores Electrum envolve técnicas estratégicas de armazenamento de dados. Fulcrum e ElectrumX utilizam chaves hash de script (32 bytes e 11 bytes respetivamente) para mapear os números de transação (tx_num). Este tx_num representa a ordem de uma transação na cadeia de blocos, servindo como um identificador compacto. Os sistemas mantêm um ficheiro de txids encomendado por tx_num, permitindo uma rápida txid recuperação. Também mantêm uma matriz na memória que mapeia as alturas dos blocos para as contagens cumulativas de transacções, permitindo pesquisas rápidas da altura dos blocos. Esta abordagem permite negociar o aumento do armazenamento (por exemplo, os 21 GB adicionais da ElectrumX para txid ) para um desempenho de consulta significativamente melhorado em comparação com o método de armazenamento mínimo do ElectrumX. Esta conceção ilustra o equilíbrio entre a eficiência do armazenamento e a velocidade de consulta na engenharia de bases de dados, com a Fulcrum e a ElectrumX a darem prioridade ao desempenho em detrimento da economia de armazenamento.