Rendimiento del servidor

Actualizado: 1 feb, 2022

Sparrow Wallet se basa en el protocolo del servidor Electrum para la gestión de los datos de las transacciones.

Este documento proporciona puntos de referencia de rendimiento actuales para varias implementaciones de servidores Electrum de índice completo en hardware estándar, y analiza dos enfoques de implementación distintos basados en estos resultados.

Fondo

Un servidor de Electrum funciona como un índice de direcciones de Bitcoin, permitiendo a los usuarios recuperar transacciones asociadas a una dirección determinada. A diferencia de la implementación de referencia de Bitcoin, que carece de esta característica, los servidores de Electrum ofrecen esta funcionalidad. Mientras que los filtros de bloques compactos pueden proporcionar información similar, no soportan transacciones mempool y son menos eficientes.

El protocolo de servidor Electrum es el protocolo de índice de direcciones Bitcoin más ampliamente adoptado. Este benchmark se centra en índices de direcciones completos, que son cruciales para la privacidad, ya que no almacenan detalles específicos del monedero en el servidor. Para una seguridad óptima del almacenamiento en frío, toda la información del monedero debería estar contenida en el archivo del monedero y eliminada del servidor tras el cierre del monedero. Este enfoque excluye proyectos como BWT y EPS que requieren almacenar las direcciones de los monederos en el servidor.

MotivaciónPermalink

Esta referencia se basa en el informe de resultados de Jameson Lopp de julio de 2020, con dos diferencias fundamentales:

  1. Utiliza una Raspberry Pi 4 en lugar de un servidor AWS, lo que lo hace más relevante para los usuarios domésticos.
  2. Emplea compilaciones actualizadas de los proyectos y vuelve a probarlos tras cambios significativos.

Estas actualizaciones hacen que los puntos de referencia sean especialmente útiles para los usuarios de Sparrow que deseen ejecutar su propio servidor Electrum en un ordenador de placa única, permitiéndoles comparar diferentes implementaciones y elegir la que mejor se adapte a sus necesidades. Los resultados proporcionan información práctica para los usuarios que estén considerando autoalojar un servidor Electrum en un entorno doméstico.

Hardware

Esta prueba utiliza el hardware típico de los usuarios de Sparrow preocupados por la privacidad: una Raspberry Pi 4 (modelo de 8 GB) con el sistema operativo Ubuntu 21.10 de 64 bits. El almacenamiento de datos utiliza un SSD USB externo de 1 TB, preferible a los discos duros debido al gran tamaño de la cadena de bloques de Bitcoin y los índices asociados (aproximadamente 0,5 TB). Esta configuración refleja las configuraciones comunes de los usuarios domésticos, proporcionando datos de rendimiento relevantes para aquellos que estén considerando autoalojar un servidor Electrum en configuraciones similares de ordenadores monoplaca.

Proyectos

ElectrumX

ElectrumX, el sucesor del proyecto de servidor Electrum original, fue adoptado en 2017. Después de que el autor original dejara de dar soporte a la blockchain Bitcoin, los desarrolladores de Electrum bifurcaron el proyecto, que ahora se mantiene en. https://github.com/spesmilo/electrumx.

Un reto importante de ElectrumX es la creación inicial del índice, que lleva aproximadamente una semana en el hardware de prueba. Sin embargo, los usuarios pueden crear el índice en una máquina más potente y transferirlo a un ordenador de placa única. Puntos clave:

  • Tamaño actual de la base de datos: 75 GB
  • Requiere txindex activado en Bitcoin Core
  • No hay binarios precompilados disponibles
  • Versión probada: ElectrumX 1.16

El índice de ElectrumX puede construirse en hardware más potente y transferirse, lo que ofrece flexibilidad a los usuarios con recursos informáticos limitados.

Electrs

Electrs, diseñado para uso personal en lugar de servidores públicos, ofrece menores requisitos de almacenamiento pero mayor uso de CPU en comparación con ElectrumX. Se mantiene en https://github.com/romanz/electrs.

La ventaja clave de Electrs es su mayor rapidez en la construcción de índices, que sólo tarda entre 12 y 24 horas en el hardware de prueba. Esta eficacia la ha convertido en la opción preferida para la mayoría de los paquetes de nodos preconstruidos. Puntos clave:

  • Tamaño actual de la base de datos: 32 GB
  • No requiere txindex en Bitcoin Core
  • No hay binarios precompilados disponibles
  • Versión probada: Electrs 0.9.4

El tiempo de creación de índices significativamente más corto y el menor tamaño de la base de datos hacen de Electrs una opción atractiva para uso personal, especialmente en hardware con recursos limitados.

Fulcrum

Fulcrum, una moderna implementación en C++, ofrece un alto rendimiento a pesar de los mayores requisitos de espacio en disco. Mantenido en https://github.com/cculianu/FulcrumLa velocidad de indexación y el rendimiento operativo están equilibrados.

La indexación de Fulcrum lleva de 2 a 3 días en el hardware de prueba, lo que la sitúa entre Electrs y ElectrumX en tiempo de construcción. Una vez indexado, ofrece un rendimiento excepcional. Puntos clave:

  • Tamaño actual de la base de datos: 102 GB
  • Requiere txindex activado en Bitcoin Core
  • Binarios precompilados disponibles para Linux (x86_64 y arm64) y Windows
  • Versión probada: Fulcrum 1.6.0

La combinación de Fulcrum de un tiempo de indexación razonable y un rendimiento operativo sobresaliente lo convierte en una opción convincente, especialmente para los usuarios que pueden acomodar sus mayores necesidades de almacenamiento.

Electrs-esplora

Electrs-esplora, una bifurcación de Electrs, crea índices adicionales para mejorar el rendimiento de la empresa. Sin embargo, sus elevados requisitos de datos (aproximadamente 800 GB) lo hacen inadecuado para el hardware de prueba. Puntos clave:

  • Necesidad de almacenamiento extremadamente grande (~800 GB)
  • Puede ejecutarse con --lightmode reduciendo el espacio en disco a la mitad
  • Incluso en modo ligero, casi agota una unidad de 1 TB cuando se combina con la cadena de bloques de ~420 GB.

Las amplias necesidades de almacenamiento de esta implementación superan las configuraciones típicas de ordenador monoplaca, por lo que resulta poco práctica para la mayoría de los usuarios domésticos. Aunque ofrece ventajas de rendimiento para uso empresarial, sus exigencias de recursos limitan su aplicabilidad en implantaciones personales o a pequeña escala.

addrindexrs

addrindexrs es otro fork de Electrs, utilizado por el backend de Dojo para la recuperación de datos históricos de transacciones. Carece de cambios significativos relacionados con el rendimiento que justifiquen su inclusión como una implementación separada en este benchmark. Esta bifurcación mantiene características similares a las del proyecto Electrs original, por lo que resulta redundante a efectos de comparación de rendimiento en este contexto.

Indexación

El rendimiento de indexación varía significativamente entre las tres implementaciones:

ElectrumX: Indexación más lenta (1 semana), debido al monohilo de Python y a un análisis de bloques más lento. Sin embargo, su índice exhaustivo permite respuestas de servidor más escalables sin consultas frecuentes a Bitcoin Core. Un sistema operativo de 64 bits es crucial para un rendimiento óptimo.

Electrs: La indexación más rápida (1 día), atribuida a su índice más pequeño y sencillo y a la optimización de la recuperación y el análisis sintáctico de bloques. Esta velocidad tiene un coste: debe volver a analizar los bloques durante la operación, lo que puede afectar al rendimiento de los monederos más profundos.

Fulcrum: Tiempo de indexación moderado (2-3 días), construyendo un índice ligeramente mayor que ElectrumX pero mucho más rápido. Su proceso, que consume muchos recursos, se beneficia de la implementación en lenguaje de bajo nivel. El sitio sincronización rápida puede mejorar aún más la velocidad de indexación. El índice completo resultante da lugar a un excelente rendimiento operativo.

Cada implementación presenta un compromiso entre el tiempo de indexación, el tamaño del índice y la eficiencia operativa, atendiendo a diferentes casos de uso y capacidades de hardware.

La prueba

Este benchmark evalúa dos cargas de servidor comunes de Sparrow usando un monedero grande (~3000 direcciones usadas):

  1. Carga inicial del monedero: Se centra en las suscripciones de direcciones, que permiten a Sparrow recibir actualizaciones para las transacciones de direcciones. Es importante destacar que cada solicitud de suscripción devuelve un hash de todos los ID de transacción y alturas de bloque que afectan a esa dirección. La prueba mide el tiempo necesario para suscribir todas las direcciones de monedero.
  2. Actualización del monedero: simula la recuperación de todos los datos del monedero (transacciones y bloques) durante una actualización manual, necesaria cuando los problemas de comunicación provocan datos erróneos. Las suscripciones de direcciones ya están en marcha para esta prueba.

Parámetros clave de la prueba:

  • Billetera grande con ~3000 direcciones usadas
  • Tamaño de página de lote de 50 para todos los servidores
  • Mide el tiempo de suscripción para la carga inicial
  • Mide el tiempo de recuperación de datos para refrescar la cartera

Este enfoque proporciona una comparación exhaustiva del rendimiento entre diferentes implementaciones del servidor Electrum, centrándose en escenarios de uso del mundo real en Sparrow Wallet.

Prueba 1: Carga inicial (Suscripción de direcciones)

Prueba Arranque en frío Carrera 1 Carrera 2 Carrera 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Electrs 322386 ms 393303 ms 384036 ms 427722 ms
Fulcrum 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum: El más rápido (media ~1660 ms)
  • ElectrumX: Moderado (media ~49.133 ms)
  • Electrs: El más lento (media ~381.862 ms)

Fulcrum supera a ElectrumX en 22x y a Electrs en ~300x en la carga inicial de monederos.

Prueba 2: Actualización de la cartera (recuperación de datos)

Prueba Arranque en frío Carrera 1 Carrera 2 Carrera 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Electrs 17562 ms 11621 ms 11219 ms 11521 ms
Fulcrum 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum: El más rápido (media ~9.208 ms)
  • Electr: Segundo (media ~12.981 ms)
  • ElectrumX: el más lento (media ~84,066 ms)

Fulcrum es 8 veces más rápido que ElectrumX y 1,5 veces más rápido que Electrs en la actualización de carteras.

Fulcrum demuestra sistemáticamente un rendimiento superior en ambas pruebas, mostrando ventajas significativas en la carga inicial y manteniendo una ventaja en la actualización del monedero. ElectrumX tiene un rendimiento moderado en la carga, pero tiene problemas con la actualización. Electrs, aunque lento en la carga inicial, muestra un rendimiento competitivo en la actualización.

Debate

Sparrow Wallet se basa en el protocolo de servidor Electrum para la gestión de datos de transacciones. Este documento compara el rendimiento de las implementaciones de servidor Electrum de índice completo en hardware estándar, centrándose en Raspberry Pi 4 con 8 GB de RAM y 1 TB de SSD USB externo. Examina las implementaciones ElectrumX, Electrs y Fulcrum.

ElectrumX, mantenido en https://github.com/spesmilo/electrumxtarda alrededor de una semana en construir su índice de 75 GB en hardware de prueba y requiere txindex activado en Bitcoin Core. Electrs, diseñado para uso personal https://github.com/romanz/electrsconstruye un índice de 32 GB en 12-24 horas sin necesidad de txindex. Fulcrum https://github.com/cculianu/Fulcrum construye un índice de 102 GB en 2-3 días, requiere txindex y ofrece binarios precompilados.

En las pruebas se utilizó un monedero de gran tamaño (~3000 direcciones) para medir la carga inicial (suscripción de direcciones) y la actualización del monedero (recuperación de datos). Los resultados muestran que Fulcrum supera significativamente a los demás, siendo 22 veces más rápido que ElectrumX y ~300 veces más rápido que Electrs en la carga inicial, y 8 veces más rápido que ElectrumX y 1,5 veces más rápido que Electrs en el refresco.

La disparidad de rendimiento entre Fulcrum y Electrs en la carga inicial (1,4 segundos frente a 6 minutos) se debe a sus diferentes enfoques de almacenamiento de datos. Electrs almacena una cantidad mínima de datos, lo que requiere una recuperación y análisis exhaustivos de los bloques para cada carga del monedero. Para el monedero de prueba, esto significaba procesar 3,5 GB de bloques repetidamente, lo que provocaba una alta carga de la CPU y posibles fallos de respuesta en ordenadores de placa única. ElectrumX y Fulcrum mantienen índices de direcciones exhaustivos, lo que permite una recuperación eficiente de los datos. Este enfoque, combinado con el índice de transacciones de Bitcoin Core, permite el rendimiento superior de Fulcrum.

La implementación C++17 de Fulcrum proporciona una velocidad consistente en todas las plataformas, mientras que la arquitectura basada en Python de ElectrumX muestra un rendimiento inconsistente y un mayor uso de la CPU. Estos resultados ponen de manifiesto las compensaciones entre el tamaño del índice, la velocidad de consulta y la utilización de recursos en las implementaciones del servidor Electrum, con Fulcrum ofreciendo el mejor equilibrio para la mayoría de los usuarios.

Conclusión

Este benchmark revela que Fulcrum es la implementación óptima del servidor Electrum para usuarios Sparrow Wallet.

A pesar de un tiempo de indexación inicial ligeramente superior en comparación con Electrs, el índice completo de Fulcrum ofrece una escalabilidad y un rendimiento superiores.

A medida que aumenta la profundidad de los monederos y disminuyen los costes de almacenamiento, las ventajas de Fulcrum en cuanto a velocidad de consulta, fiabilidad y longevidad del hardware compensan sus mayores necesidades de espacio en disco.

Mientras que Electrs puede adaptarse a escenarios con espacio en disco muy limitado y monederos pequeños, Fulcrum se recomienda como el servidor ideal para Sparrow, ya que proporciona el mejor equilibrio de rendimiento y utilización de recursos para la mayoría de los usuarios.

Nota técnica
La indexación eficiente de direcciones en los servidores Electrum implica técnicas estratégicas de almacenamiento de datos. Fulcrum y ElectrumX utilizan claves hash de script (32 bytes y 11 bytes respectivamente) para asignarlas a números de transacción (tx_num). Este tx_num representa el orden de una transacción en la blockchain, sirviendo como identificador compacto. Los sistemas mantienen un archivo de txids ordenado por tx_num, lo que permite txid recuperación. También mantienen una matriz en memoria que relaciona la altura de los bloques con el número de transacciones acumuladas, lo que permite realizar búsquedas rápidas de la altura de los bloques. Este enfoque supone un aumento del almacenamiento (por ejemplo, los 21 GB adicionales de ElectrumX para txid lookup) para mejorar significativamente el rendimiento de las consultas en comparación con el método de almacenamiento mínimo de Electrs. Este diseño ilustra el equilibrio entre la eficiencia del almacenamiento y la velocidad de consulta en la ingeniería de bases de datos, con Fulcrum y ElectrumX priorizando el rendimiento sobre la economía de almacenamiento.