Performance des serveurs

Mise à jour : 1 févr. 2022

Sparrow Wallet s'appuie sur le protocole du serveur Electrum pour la gestion des données de transaction.

Ce document fournit des références de performance actuelles pour diverses implémentations de serveurs Electrum à index complet sur du matériel standard, et discute de deux approches d'implémentation distinctes basées sur ces résultats.

Contexte

Un serveur Electrum fonctionne comme un index d'adresses Bitcoin, permettant aux utilisateurs de retrouver les transactions associées à une adresse donnée. Contrairement à l'implémentation de référence de Bitcoin, qui ne dispose pas de cette fonctionnalité, les serveurs Electrum l'offrent. Les filtres de blocs compacts peuvent fournir des informations similaires, mais ils ne prennent pas en charge les transactions mempool et sont moins efficaces.

Le protocole de serveur Electrum est le protocole d'index d'adresses Bitcoin le plus largement adopté. Ce benchmark se concentre sur les index d'adresses complets, qui sont essentiels pour la confidentialité car ils ne stockent pas les détails spécifiques des portefeuilles sur le serveur. Pour une sécurité optimale du stockage à froid, toutes les informations du portefeuille doivent être contenues dans le fichier du portefeuille et supprimées du serveur après la fermeture du portefeuille. Cette approche exclut les projets tels que BWT et EPS qui nécessitent le stockage des adresses des portefeuilles sur le serveur.

MotivationPermalink

Ce benchmark s'appuie sur le rapport de performance de Jameson Lopp de juillet 2020, avec deux différences majeures :

  1. Il utilise un Raspberry Pi 4 au lieu d'un serveur AWS, ce qui le rend plus adapté aux utilisateurs domestiques.
  2. Il utilise des versions actualisées des projets et les teste à nouveau après des changements importants.

Ces mises à jour rendent les benchmarks particulièrement utiles pour les utilisateurs de Sparrow qui souhaitent faire fonctionner leur propre serveur Electrum sur un ordinateur à carte unique, ce qui leur permet de comparer différentes implémentations et de choisir celle qui répond le mieux à leurs besoins. Les résultats fournissent des indications pratiques aux utilisateurs qui envisagent d'héberger eux-mêmes un serveur Electrum dans un environnement domestique.

Matériel

Ce benchmark utilise un matériel typique pour les utilisateurs de Sparrow soucieux de la confidentialité : un Raspberry Pi 4 (modèle 8 Go) fonctionnant sous le système d'exploitation Ubuntu 21.10 64 bits. Le stockage des données utilise un disque SSD USB externe de 1 To, préféré aux disques durs en raison de la taille importante de la blockchain Bitcoin et des index associés (environ 0,5 To). Cette configuration reflète les configurations courantes des utilisateurs domestiques, fournissant des données de performance pertinentes pour ceux qui envisagent d'auto-héberger un serveur Electrum sur des configurations similaires d'ordinateurs à carte unique.

Projets

ElectrumX

ElectrumX, le successeur du projet de serveur Electrum original, a été adopté en 2017. Après que l'auteur original a cessé de prendre en charge la blockchain Bitcoin, les développeurs d'Electrum ont forké le projet, qui est désormais maintenu à l'adresse suivante https://github.com/spesmilo/electrumx.

L'un des défis majeurs d'ElectrumX est la construction initiale de l'index, qui prend environ une semaine sur le matériel de test. Cependant, les utilisateurs peuvent construire l'index sur une machine plus puissante et le transférer sur un ordinateur à carte unique. Points clés :

  • Taille actuelle de la base de données : 75 Go
  • Nécessite l'activation de txindex sur Bitcoin Core
  • Pas de binaires précompilés disponibles
  • Version testée : ElectrumX 1.16

L'index d'ElectrumX peut être construit sur du matériel plus puissant et transféré, offrant une flexibilité pour les utilisateurs ayant des ressources informatiques limitées.

Électeurs

Electrs, conçu pour une utilisation personnelle plutôt que pour des serveurs publics, offre des exigences de stockage plus faibles mais une utilisation plus élevée du processeur par rapport à ElectrumX. Il est maintenu à https://github.com/romanz/electrs.

Le principal avantage d'Electrs est son temps de construction d'index plus rapide, qui ne prend que 12 à 24 heures sur le matériel de test. Cette efficacité en a fait le choix préféré de la plupart des ensembles de nœuds préconstruits. Points clés :

  • Taille actuelle de la base de données : 32 Go
  • Ne nécessite pas txindex sur Bitcoin Core
  • Pas de binaires précompilés disponibles
  • Version testée : Electrs 0.9.4

Le temps de construction de l'index nettement plus court et la taille réduite de la base de données font d'Electrs une option attrayante pour un usage personnel, en particulier sur du matériel disposant de ressources limitées.

Fulcrum

Fulcrum, une implémentation moderne en C++, offre des performances élevées malgré un espace disque plus important. Maintenu à https://github.com/cculianu/FulcrumIl établit un équilibre entre la vitesse d'indexation et la performance opérationnelle.

L'indexation de Fulcrum prend 2 à 3 jours sur le matériel de test, ce qui le place entre Electrs et ElectrumX en termes de temps de construction. Une fois indexé, il offre des performances exceptionnelles. Points clés :

  • Taille actuelle de la base de données : 102 Go
  • Nécessite l'activation de txindex sur Bitcoin Core
  • Binaires précompilés disponibles pour Linux (x86_64 et arm64) et Windows
  • Version testée : Fulcrum 1.6.0

La combinaison d'un temps d'indexation raisonnable et d'une performance opérationnelle exceptionnelle fait de Fulcrum une option convaincante, en particulier pour les utilisateurs qui peuvent s'adapter à ses besoins de stockage plus importants.

Electrs-esplora

Electrs-esplora, une branche d'Electrs, construit des index supplémentaires pour améliorer les performances de l'entreprise. Cependant, ses exigences élevées en matière de données (environ 800 Go) le rendent inadapté au matériel de test. Points clés :

  • Besoin de stockage extrêmement important (~800 GB)
  • Peut être exécuté avec --lightmode réduisant de moitié l'espace disque
  • Même en mode léger, il épuise presque un disque de 1 To lorsqu'il est combiné avec la blockchain de ~420 Go.

Les besoins considérables de stockage de cette application dépassent les configurations typiques d'ordinateurs à carte unique, ce qui la rend peu pratique pour la plupart des utilisateurs privés. Bien qu'elle offre des avantages en termes de performances pour une utilisation en entreprise, ses besoins en ressources limitent son applicabilité dans les déploiements personnels ou à petite échelle.

addrindexrs

addrindexrs est un autre fork d'Electrs, utilisé par le backend Dojo pour la récupération des données historiques des transactions. Il n'y a pas de changements significatifs liés aux performances qui justifieraient son inclusion en tant qu'implémentation séparée dans ce benchmark. Ce fork conserve des caractéristiques similaires à celles du projet Electrs original, ce qui le rend redondant pour la comparaison des performances dans ce contexte.

Indexation

Les performances d'indexation varient considérablement entre les trois implémentations :

ElectrumX : indexation la plus lente (1 semaine), en raison du single-threading de Python et de l'analyse plus lente des blocs. Cependant, son index complet permet des réponses de serveur plus évolutives sans requêtes fréquentes de Bitcoin Core. Un système d'exploitation 64 bits est essentiel pour des performances optimales.

Electrs : Indexation la plus rapide (1 jour), attribuée à son index plus petit et plus simple et à l'optimisation de la récupération et de l'analyse des blocs. Cette rapidité a un coût : il doit reparamétrer les blocs pendant l'opération, ce qui peut avoir un impact sur les performances des portefeuilles plus profonds.

Fulcrum : Temps d'indexation modéré (2-3 jours), construction d'un index légèrement plus important qu'ElectrumX mais beaucoup plus rapide. Ce processus gourmand en ressources bénéficie de la mise en œuvre d'un langage de bas niveau. L'indexation synchronisation rapide permet d'améliorer encore la vitesse d'indexation. L'index complet qui en résulte permet d'obtenir d'excellentes performances opérationnelles.

Chaque implémentation présente un compromis entre le temps d'indexation, la taille de l'index et l'efficacité opérationnelle, en fonction des différents cas d'utilisation et des capacités matérielles.

Le test

Ce benchmark évalue deux charges de serveur courantes de Sparrow en utilisant un portefeuille important (~3000 adresses utilisées) :

  1. Chargement initial du portefeuille : Se concentre sur les abonnements aux adresses, qui permettent à Sparrow de recevoir des mises à jour pour les transactions d'adresses. Il est important de noter que chaque demande d'abonnement renvoie un hachage de tous les identifiants de transaction et de toutes les hauteurs de bloc affectant cette adresse. Le test mesure le temps nécessaire pour souscrire à toutes les adresses de portefeuilles.
  2. Rafraîchissement du portefeuille : Simule la récupération de toutes les données du portefeuille (transactions et blocs) lors d'un rafraîchissement manuel, ce qui est nécessaire lorsque des problèmes de communication entraînent des données erronées. Les abonnements aux adresses sont déjà en place pour ce test.

Paramètres clés du test :

  • Grand portefeuille avec ~3000 adresses utilisées
  • Taille de la page de lot de 50 pour tous les serveurs
  • Mesure le temps d'abonnement pour le chargement initial
  • Mesure le temps de récupération des données pour le rafraîchissement du portefeuille

Cette approche permet une comparaison complète des performances entre les différentes implémentations du serveur Electrum, en se concentrant sur des scénarios d'utilisation réels en Sparrow Wallet.

Test 1 : Chargement initial (souscription d'adresses)

Test Démarrage à froid Course 1 Course 2 Course 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Électeurs 322386 ms 393303 ms 384036 ms 427722 ms
Fulcrum 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum : Le plus rapide (moyenne ~1660 ms)
  • ElectrumX : Modéré (moyenne ~49 133 ms)
  • Electrs : Le plus lent (moyenne ~381 862 ms)

Fulcrum surpasse ElectrumX de 22x et Electrs de ~300x pour le chargement initial du portefeuille.

Test 2 : Rafraîchissement du portefeuille (extraction de données)

Test Démarrage à froid Course 1 Course 2 Course 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Électeurs 17562 ms 11621 ms 11219 ms 11521 ms
Fulcrum 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum : Le plus rapide (moyenne ~9 208 ms)
  • Électres : Seconde (moyenne ~12 981 ms)
  • ElectrumX : Le plus lent (moyenne ~84,066 ms)

Fulcrum est 8 fois plus rapide qu'ElectrumX et 1,5 fois plus rapide qu'Electrs pour le rafraîchissement des portefeuilles.

Fulcrum fait preuve d'une performance supérieure dans les deux tests, montrant des avantages significatifs dans le chargement initial et maintenant un avantage dans le rafraîchissement des portefeuilles. ElectrumX a des performances modérées en matière de chargement, mais peine à rafraîchir les portefeuilles. Electrs, bien que lent dans le chargement initial, montre des performances compétitives dans le rafraîchissement.

Discussion

Sparrow Wallet s'appuie sur le protocole de serveur Electrum pour la gestion des données de transaction. Ce document compare les performances des implémentations de serveurs Electrum à index complet sur du matériel standard, en se concentrant sur le Raspberry Pi 4 avec 8 Go de RAM et 1 To de SSD USB externe. Il examine les implémentations ElectrumX, Electrs et Fulcrum.

ElectrumX, maintenu à https://github.com/spesmilo/electrumxIl faut environ une semaine pour construire son index de 75 Go sur du matériel de test et il est nécessaire d'activer txindex dans Bitcoin Core. Electrs, conçu pour un usage personnel https://github.com/romanz/electrsLe système d'indexation de Fulcrum permet de construire un index de 32 Go en 12 à 24 heures sans avoir recours à txindex. Fulcrum https://github.com/cculianu/Fulcrum construit un index de 102GB en 2-3 jours, nécessite txindex, et propose des binaires pré-compilés.

Les tests ont utilisé un portefeuille de grande taille (~3000 adresses) pour mesurer le chargement initial (souscription d'adresses) et le rafraîchissement du portefeuille (récupération de données). Les résultats montrent que Fulcrum est nettement plus performant que les autres, 22 fois plus rapide qu'ElectrumX et ~300 fois plus rapide qu'Electrs pour le chargement initial, et 8 fois plus rapide qu'ElectrumX et 1,5 fois plus rapide qu'Electrs pour le rafraîchissement.

L'écart de performance entre Fulcrum et Electrs lors du chargement initial (1,4 seconde contre 6 minutes) provient de leurs différentes approches en matière de stockage de données. Electrs stocke un minimum de données, ce qui nécessite une récupération et une analyse approfondies des blocs pour chaque chargement de portefeuille. Pour le portefeuille de test, cela signifiait traiter 3,5 Go de blocs de manière répétée, ce qui entraînait une charge élevée du processeur et des défaillances potentielles de la réponse sur les ordinateurs à carte unique. ElectrumX et Fulcrum maintiennent des index d'adresses complets, ce qui permet une récupération efficace des données. Cette approche, combinée à l'index des transactions de Bitcoin Core, permet à Fulcrum d'obtenir des performances supérieures.

L'implémentation C++17 de Fulcrum offre une vitesse constante sur toutes les plateformes, tandis que l'architecture Python d'ElectrumX présente des performances incohérentes et une utilisation plus élevée du CPU. Ces résultats mettent en évidence les compromis entre la taille de l'index, la vitesse des requêtes et l'utilisation des ressources dans les implémentations du serveur Electrum, Fulcrum offrant le meilleur équilibre pour la plupart des utilisateurs.

Conclusion

Ce benchmark révèle que Fulcrum est l'implémentation optimale du serveur Electrum pour les utilisateurs Sparrow Wallet.

Malgré un temps d'indexation initial légèrement plus long que celui d'Electrs, l'index complet de Fulcrum offre une évolutivité et une performance supérieures.

Alors que la profondeur des portefeuilles augmente et que les coûts de stockage diminuent, les avantages de Fulcrum en termes de vitesse d'interrogation, de fiabilité et de longévité du matériel l'emportent sur l'espace disque plus important dont il a besoin.

Alors qu'Electrs peut convenir à des scénarios avec un espace disque très limité et des portefeuilles peu profonds, Fulcrum est recommandé comme le serveur idéal pour Sparrow, offrant le meilleur équilibre de performance et d'utilisation des ressources pour la plupart des utilisateurs.

Note technique
L'indexation efficace des adresses dans les serveurs Electrum implique des techniques de stockage de données stratégiques. Fulcrum et ElectrumX utilisent des clés de hachage de script (32 octets et 11 octets respectivement) pour correspondre aux numéros de transaction (tx_num). Cette tx_num représente l'ordre d'une transaction dans la blockchain et sert d'identifiant compact. Les systèmes conservent un fichier de txids commandée par tx_numpermettant une mise en œuvre rapide de la txid la récupération des données. Ils conservent également un tableau en mémoire qui établit une correspondance entre la hauteur des blocs et le nombre de transactions cumulées, ce qui permet des recherches rapides sur la hauteur des blocs. Cette approche permet d'augmenter l'espace de stockage (par exemple, les 21 Go supplémentaires d'ElectrumX pour les transactions en ligne). txid ), ce qui améliore considérablement les performances des requêtes par rapport à la méthode de stockage minimale d'Electrs. Cette conception illustre l'équilibre entre l'efficacité du stockage et la vitesse d'interrogation dans l'ingénierie des bases de données, Fulcrum et ElectrumX donnant la priorité à la performance plutôt qu'à l'économie de stockage.