Prestazioni del server

Aggiornato: 1 feb, 2022

Sparrow Wallet si affida al protocollo del server Electrum per la gestione dei dati delle transazioni.

Questo documento fornisce i benchmark delle prestazioni attuali per varie implementazioni di server Electrum a indice completo su hardware standard e discute due approcci di implementazione distinti basati su questi risultati.

Sfondo

Un server Electrum funziona come un indice di indirizzi Bitcoin, consentendo agli utenti di recuperare le transazioni associate a un determinato indirizzo. A differenza dell'implementazione di riferimento di Bitcoin, che manca di questa caratteristica, i server Electrum offrono questa funzionalità. I filtri a blocchi compatti possono fornire informazioni simili, ma non supportano le transazioni mempool e sono meno efficienti.

Il protocollo del server Electrum è il protocollo di indicizzazione degli indirizzi Bitcoin più ampiamente adottato. Questo benchmark si concentra sugli indici completi degli indirizzi, che sono fondamentali per la privacy in quanto non memorizzano i dettagli specifici del portafoglio sul server. Per una sicurezza ottimale del cold storage, tutte le informazioni del portafoglio dovrebbero essere contenute nel file del portafoglio e rimosse dal server dopo la chiusura del portafoglio. Questo approccio esclude progetti come BWT ed EPS che richiedono la memorizzazione degli indirizzi dei portafogli sul server.

MotivazionePermalink

Questo benchmark si basa sul rapporto di performance di Jameson Lopp del luglio 2020, con due differenze fondamentali:

  1. Utilizza un Raspberry Pi 4 invece di un server AWS, rendendolo più adatto agli utenti domestici.
  2. Utilizza build aggiornate dei progetti e li ricollauda dopo aver apportato modifiche significative.

Questi aggiornamenti rendono i benchmark particolarmente utili per gli utenti di Sparrow che desiderano eseguire il proprio server Electrum su un computer a scheda singola, consentendo loro di confrontare diverse implementazioni e di scegliere quella più adatta alle loro esigenze. I risultati forniscono spunti pratici per gli utenti che stanno valutando la possibilità di ospitare autonomamente un server Electrum in un ambiente domestico.

Hardware

Questo benchmark utilizza l'hardware tipico degli utenti di Sparrow attenti alla privacy: un Raspberry Pi 4 (modello da 8 GB) con sistema operativo Ubuntu 21.10 a 64 bit. L'archiviazione dei dati utilizza un SSD USB esterno da 1 TB, preferito agli HDD a causa delle grandi dimensioni della blockchain Bitcoin e degli indici associati (circa 0,5 TB). Questa configurazione riflette le comuni configurazioni per gli utenti domestici e fornisce dati sulle prestazioni rilevanti per coloro che stanno pensando di ospitare un server Electrum su configurazioni simili di computer a scheda singola.

Progetti

ElectrumX

ElectrumX, il successore del progetto originale del server Electrum, è stato adottato nel 2017. Dopo che l'autore originale ha cessato di supportare la blockchain Bitcoin, gli sviluppatori di Electrum hanno effettuato un fork del progetto, ora mantenuto all'indirizzo https://github.com/spesmilo/electrumx.

Una sfida significativa con ElectrumX è la costruzione iniziale dell'indice, che richiede circa una settimana sull'hardware di prova. Tuttavia, gli utenti possono costruire l'indice su una macchina più potente e trasferirlo su un computer a scheda singola. Punti chiave:

  • Dimensione attuale del database: 75 GB
  • Richiede l'abilitazione di txindex su Bitcoin Core
  • Non sono disponibili binari precompilati
  • Versione testata: ElectrumX 1.16

L'indice di ElectrumX può essere costruito su hardware più potente e trasferito, offrendo flessibilità agli utenti con risorse informatiche limitate.

Elettori

Electrs, progettato per l'uso personale piuttosto che per i server pubblici, offre requisiti di archiviazione più bassi ma un utilizzo più elevato della CPU rispetto a ElectrumX. È gestito da https://github.com/romanz/electrs.

Il vantaggio principale di Electrs è la rapidità di costruzione dell'indice, che richiede solo 12-24 ore sull'hardware di prova. Questa efficienza ne ha fatto la scelta preferita per la maggior parte dei pacchetti di nodi precostituiti. Punti chiave:

  • Dimensione attuale del database: 32 GB
  • Non richiede txindex su Bitcoin Core
  • Non sono disponibili binari precompilati
  • Versione testata: Electrs 0.9.4

Il tempo di costruzione dell'indice significativamente più breve e le dimensioni ridotte del database rendono Electrs un'opzione interessante per l'uso personale, soprattutto su hardware con risorse limitate.

Fulcro

Fulcrum, una moderna implementazione in C++, offre prestazioni elevate nonostante i maggiori requisiti di spazio su disco. Mantenuto presso https://github.com/cculianu/FulcrumIl sistema è in grado di trovare un equilibrio tra la velocità di indicizzazione e le prestazioni operative.

L'indicizzazione di Fulcrum richiede 2-3 giorni sull'hardware di prova, posizionandosi tra Electrs ed ElectrumX in termini di tempo di realizzazione. Una volta indicizzato, offre prestazioni eccezionali. Punti chiave:

  • Dimensione attuale del database: 102 GB
  • Richiede l'abilitazione di txindex su Bitcoin Core
  • Binari precompilati disponibili per Linux (x86_64 e arm64) e Windows
  • Versione testata: Fulcrum 1.6.0

La combinazione di tempi di indicizzazione ragionevoli e prestazioni operative eccezionali rende Fulcrum un'opzione interessante, soprattutto per gli utenti in grado di soddisfare le esigenze di archiviazione più elevate.

Elettri-esplora

Electrs-esplora, un fork di Electrs, crea indici aggiuntivi per migliorare le prestazioni aziendali. Tuttavia, i suoi elevati requisiti di dati (circa 800 GB) lo rendono inadatto all'hardware di prova. Punti chiave:

  • Requisiti di archiviazione estremamente elevati (~800 GB)
  • Può essere eseguito con --lightmode riducendo lo spazio su disco della metà
  • Anche in modalità "light", il disco da 1 TB è quasi esaurito se combinato con la blockchain da 420 GB.

L'ampio fabbisogno di memoria di questa implementazione supera le tipiche configurazioni di computer a scheda singola, rendendola impraticabile per la maggior parte degli utenti domestici. Sebbene offra vantaggi in termini di prestazioni per l'uso aziendale, la sua richiesta di risorse ne limita l'applicabilità in installazioni personali o su piccola scala.

addrindexrs

addrindexrs è un altro fork di Electrs, usato dal backend Dojo per il recupero dei dati storici delle transazioni. Non presenta cambiamenti significativi in termini di prestazioni che giustifichino la sua inclusione come implementazione separata in questo benchmark. Questo fork mantiene caratteristiche simili al progetto Electrs originale, rendendolo superfluo ai fini del confronto delle prestazioni in questo contesto.

Indicizzazione

Le prestazioni di indicizzazione variano in modo significativo tra le tre implementazioni:

ElectrumX: indicizzazione più lenta (1 settimana), a causa del single-threading di Python e dell'analisi più lenta dei blocchi. Tuttavia, il suo indice completo consente risposte più scalabili al server senza frequenti interrogazioni di Bitcoin Core. Un sistema operativo a 64 bit è fondamentale per ottenere prestazioni ottimali.

Elettori: L'indicizzazione più veloce (1 giorno), attribuita al suo indice più piccolo e semplice e all'ottimizzazione del recupero e dell'analisi dei blocchi. Questa velocità ha un costo: deve riordinare i blocchi durante il funzionamento, con un potenziale impatto sulle prestazioni dei portafogli più profondi.

Fulcrum: Tempo di indicizzazione moderato (2-3 giorni), con un indice leggermente più grande di ElectrumX ma molto più veloce. Il processo ad alta intensità di risorse trae vantaggio dall'implementazione di un linguaggio di basso livello. Il sincronizzazione veloce può migliorare ulteriormente la velocità di indicizzazione. L'indice completo che ne risulta porta a prestazioni operative eccellenti.

Ogni implementazione presenta un compromesso tra tempo di indicizzazione, dimensione dell'indice ed efficienza operativa, adattandosi a diversi casi d'uso e capacità hardware.

Il test

Questo benchmark valuta due carichi di server comuni di Sparrow utilizzando un portafoglio di grandi dimensioni (~3000 indirizzi utilizzati):

  1. Caricamento iniziale del portafoglio: Si concentra sulle sottoscrizioni degli indirizzi, che consentono a Sparrow di ricevere gli aggiornamenti per le transazioni degli indirizzi. È importante notare che ogni richiesta di sottoscrizione restituisce un hash di tutti gli ID delle transazioni e delle altezze dei blocchi che riguardano quell'indirizzo. Il test misura il tempo di sottoscrizione di tutti gli indirizzi dei portafogli.
  2. Aggiornamento del portafoglio: simula il recupero di tutti i dati del portafoglio (transazioni e blocchi) durante un aggiornamento manuale, necessario quando i problemi di comunicazione portano a dati errati. Le sottoscrizioni degli indirizzi sono già in atto per questo test.

Parametri chiave del test:

  • Portafoglio grande con ~3000 indirizzi usati
  • Dimensione pagina batch di 50 per tutti i server
  • Misura il tempo di sottoscrizione per il caricamento iniziale
  • Misura il tempo di recupero dei dati per l'aggiornamento del portafoglio

Questo approccio fornisce un confronto completo delle prestazioni tra le diverse implementazioni del server Electrum, concentrandosi su scenari di utilizzo reali in Sparrow Wallet.

Test 1: carico iniziale (sottoscrizione dell'indirizzo)

Test Avvio a freddo Esecuzione 1 Esecuzione 2 Esecuzione 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Elettori 322386 ms 393303 ms 384036 ms 427722 ms
Fulcro 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum: Il più veloce (avg ~1660 ms)
  • ElectrumX: moderato (avg ~49.133 ms)
  • Elettori: Il più lento (avg ~381.862 ms)

Fulcrum supera ElectrumX di 22 volte e Electrs di ~300 volte per il caricamento iniziale del portafoglio.

Test 2: Aggiornamento del portafoglio (recupero dati)

Test Avvio a freddo Esecuzione 1 Esecuzione 2 Esecuzione 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Elettori 17562 ms 11621 ms 11219 ms 11521 ms
Fulcro 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum: Il più veloce (avg ~9.208 ms)
  • Elettri: Secondo (avg ~12.981 ms)
  • ElectrumX: il più lento (avg ~84.066 ms)

Fulcrum è 8 volte più veloce di ElectrumX e 1,5 volte più veloce di Electrs per il refresh dei portafogli.

Fulcrum dimostra costantemente prestazioni superiori in entrambi i test, mostrando vantaggi significativi nel caricamento iniziale e mantenendo un vantaggio nel refresh del portafoglio. ElectrumX si comporta in modo moderato nel caricamento, ma fatica nel refresh. Electrs, pur essendo lento nel caricamento iniziale, mostra prestazioni competitive nel refresh.

Discussione

Sparrow Wallet si affida al protocollo server Electrum per la gestione dei dati delle transazioni. Questo documento confronta le prestazioni delle implementazioni del server Electrum a indice completo su hardware standard, concentrandosi su Raspberry Pi 4 con 8GB di RAM e 1TB di SSD USB esterno. Vengono esaminate le implementazioni di ElectrumX, Electrs e Fulcrum.

ElectrumX, gestito presso https://github.com/spesmilo/electrumxrichiede circa una settimana per costruire il suo indice di 75 GB su hardware di prova e richiede l'abilitazione di txindex su Bitcoin Core. Electrs, progettato per uso personale https://github.com/romanz/electrscostruisce un indice da 32 GB in 12-24 ore senza richiedere txindex. Fulcro https://github.com/cculianu/Fulcrum costruisce un indice di 102 GB in 2-3 giorni, richiede txindex e offre binari precompilati.

I test hanno utilizzato un portafoglio di grandi dimensioni (~3000 indirizzi) per misurare il caricamento iniziale (sottoscrizione degli indirizzi) e il refresh del portafoglio (recupero dei dati). I risultati mostrano che Fulcrum supera in modo significativo gli altri, essendo 22 volte più veloce di ElectrumX e ~300 volte più veloce di Electrs nel caricamento iniziale, e 8 volte più veloce di ElectrumX e 1,5x più veloce di Electrs nel refresh.

La disparità di prestazioni tra Fulcrum ed Electrs nel caricamento iniziale (1,4 secondi contro 6 minuti) deriva dai diversi approcci alla memorizzazione dei dati. Electrs memorizza dati minimi, richiedendo il recupero e il parsing di molti blocchi per ogni caricamento del portafoglio. Per il portafoglio di prova, ciò significava elaborare ripetutamente 3,5 GB di blocchi, causando un elevato carico della CPU e potenziali errori di risposta sui computer a scheda singola. ElectrumX e Fulcrum mantengono indici completi degli indirizzi, consentendo un recupero efficiente dei dati. Questo approccio, combinato con l'indice delle transazioni di Bitcoin Core, consente a Fulcrum di ottenere prestazioni superiori.

L'implementazione C++17 di Fulcrum offre una velocità costante su tutte le piattaforme, mentre l'architettura basata su Python di ElectrumX mostra prestazioni incoerenti e un maggiore utilizzo della CPU. Questi risultati evidenziano i compromessi tra dimensione dell'indice, velocità delle query e utilizzo delle risorse nelle implementazioni dei server Electrum, con Fulcrum che offre il miglior equilibrio per la maggior parte degli utenti.

Conclusione

Questo benchmark rivela che Fulcrum è l'implementazione ottimale del server Electrum per gli utenti Sparrow Wallet.

Nonostante un tempo di indicizzazione iniziale leggermente più lungo rispetto a Electrs, l'indice completo di Fulcrum offre scalabilità e prestazioni superiori.

Con l'aumento della profondità dei portafogli e la diminuzione dei costi di archiviazione, i vantaggi di Fulcrum in termini di velocità di interrogazione, affidabilità e longevità dell'hardware superano i requisiti di maggiore spazio su disco.

Mentre Electrs può essere adatto a scenari con spazio su disco molto limitato e portafogli di piccole dimensioni, Fulcrum è consigliato come server ideale per Sparrow, in quanto offre il miglior equilibrio tra prestazioni e utilizzo delle risorse per la maggior parte degli utenti.

Nota tecnica
Un'indicizzazione efficiente degli indirizzi nei server Electrum comporta tecniche strategiche di archiviazione dei dati. Fulcrum ed ElectrumX utilizzano chiavi hash di script (rispettivamente 32 byte e 11 byte) per mappare i numeri di transazione (tx_num). Questo tx_num rappresenta l'ordine di una transazione nella blockchain, fungendo da identificatore compatto. I sistemi mantengono un file di txids ordinato da tx_num, consentendo una rapida txid recupero. Inoltre, mantengono un array in-memory che mappa le altezze dei blocchi con i conteggi cumulativi delle transazioni, consentendo una rapida ricerca delle altezze dei blocchi. Questo approccio permette di ottenere un aumento dello spazio di archiviazione (ad esempio, i 21 GB aggiuntivi di ElectrumX per le transazioni). txid per migliorare significativamente le prestazioni delle query rispetto al metodo di archiviazione minimale di Electrum. Questo progetto illustra l'equilibrio tra efficienza di memorizzazione e velocità di interrogazione nell'ingegneria dei database, con Fulcrum ed ElectrumX che privilegiano le prestazioni rispetto all'economia di memorizzazione.