Serverprestaties

Bijgewerkt: 1 feb, 2022

Sparrow Wallet vertrouwt op het Electrum serverprotocol voor het beheer van transactiegegevens.

Dit document biedt actuele prestatiebenchmarks voor verschillende volledige index Electrum serverimplementaties op standaard hardware en bespreekt twee verschillende implementatiebenaderingen op basis van deze bevindingen.

Achtergrond

Een Electrum-server functioneert als een Bitcoin-adresindex, waardoor gebruikers transacties kunnen opvragen die aan een bepaald adres zijn gekoppeld. In tegenstelling tot de referentie-implementatie van Bitcoin, die deze functie niet heeft, bieden Electrum-servers deze functionaliteit wel. Hoewel compacte blokfilters vergelijkbare informatie kunnen bieden, ondersteunen ze geen mempool-transacties en zijn ze minder efficiënt.

Het Electrum-serverprotocol is het meest gebruikte Bitcoin-adresindexprotocol. Deze benchmark richt zich op volledige adresindexen, die cruciaal zijn voor privacy omdat ze geen specifieke portemonneegegevens op de server opslaan. Voor optimale beveiliging van koude opslag moet alle portemonnee-informatie in het portemonneebestand staan en van de server worden verwijderd nadat de portemonnee is gesloten. Deze benadering sluit projecten zoals BWT en EPS uit, die vereisen dat portemonneeadressen op de server worden opgeslagen.

MotivatiePermalink

Deze benchmark bouwt voort op het prestatierapport van Jameson Lopp van juli 2020, met twee belangrijke verschillen:

  1. Het gebruikt een Raspberry Pi 4 in plaats van een AWS-server, waardoor het relevanter is voor thuisgebruikers.
  2. Het gebruikt up-to-date builds van de projecten en test ze opnieuw na significante wijzigingen.

Deze updates maken de benchmarks bijzonder nuttig voor Sparrow gebruikers die hun eigen Electrum server op een single board computer willen draaien, zodat ze verschillende implementaties kunnen vergelijken en de implementatie kunnen kiezen die het beste bij hun behoeften past. De resultaten bieden praktische inzichten voor gebruikers die overwegen om zelf een Electrum server te hosten in een thuisomgeving.

Hardware

Deze benchmark maakt gebruik van hardware die typisch is voor privacy-bewuste Sparrow-gebruikers: een Raspberry Pi 4 (8GB model) met Ubuntu 21.10 64-bit OS. De gegevensopslag maakt gebruik van een externe USB SSD van 1 TB, die de voorkeur krijgt boven HDD's vanwege de grote omvang van de Bitcoin blockchain en bijbehorende indexen (ongeveer 0,5 TB). Deze opstelling weerspiegelt gangbare configuraties voor thuisgebruikers en biedt relevante prestatiegegevens voor diegenen die overwegen om zelf een Electrum-server te hosten op vergelijkbare configuraties met een single board computer.

Projecten

ElectrumX

ElectrumX, de opvolger van het oorspronkelijke Electrum serverproject, werd in 2017 aangenomen. Nadat de oorspronkelijke auteur stopte met het ondersteunen van de Bitcoin blockchain, forkten de ontwikkelaars van Electrum het project, dat nu wordt onderhouden op https://github.com/spesmilo/electrumx.

Een belangrijke uitdaging bij ElectrumX is de initiële indexopbouw, die ongeveer een week in beslag neemt op de testhardware. Gebruikers kunnen de index echter opbouwen op een krachtigere machine en overzetten naar een single board computer. Belangrijkste punten:

  • Huidige databasegrootte: 75 GB
  • Vereist dat txindex is ingeschakeld op Bitcoin Core
  • Geen voorgecompileerde binaries beschikbaar
  • Geteste versie: ElectrumX 1.16

De index van ElectrumX kan worden gebouwd op krachtigere hardware en worden overgezet, wat flexibiliteit biedt voor gebruikers met beperkte computerbronnen.

Verkiezers

Electrs, ontworpen voor persoonlijk gebruik in plaats van publieke servers, biedt lagere opslagvereisten maar hoger CPU-gebruik vergeleken met ElectrumX. Het wordt onderhouden bij https://github.com/romanz/electrs.

Het belangrijkste voordeel van Electrs is de snellere bouwtijd van de index, die slechts 12-24 uur in beslag neemt op de testhardware. Door deze efficiëntie heeft het de voorkeur gekregen voor de meeste vooraf gebouwde node-pakketten. Belangrijkste punten:

  • Huidige databasegrootte: 32 GB
  • Vereist geen txindex op Bitcoin Core
  • Geen voorgecompileerde binaries beschikbaar
  • Geteste versie: Electrs 0.9.4

De aanzienlijk kortere opbouwtijd van de index en de kleinere databasegrootte maken Electrs een aantrekkelijke optie voor persoonlijk gebruik, vooral op hardware met beperkte bronnen.

Vulpunt

Fulcrum, een moderne C++-implementatie, biedt hoge prestaties ondanks grotere schijfruimtevereisten. Onderhouden bij https://github.com/cculianu/FulcrumEr wordt een balans gevonden tussen indexeringssnelheid en operationele prestaties.

Het indexeren van Fulcrum duurt 2-3 dagen op de testhardware, waardoor het qua bouwtijd tussen Electrs en ElectrumX in zit. Eenmaal geïndexeerd levert het uitzonderlijke prestaties. Belangrijkste punten:

  • Huidige databasegrootte: 102 GB
  • Vereist dat txindex is ingeschakeld op Bitcoin Core
  • Voorgecompileerde binaries beschikbaar voor Linux (x86_64 en arm64) en Windows
  • Geteste versie: Fulcrum 1.6.0

De combinatie van een redelijke indexeringstijd en uitstekende operationele prestaties maakt Fulcrum tot een aantrekkelijke optie, vooral voor gebruikers die de grotere opslagbehoeften aankunnen.

Electrs-esplora

Electrs-esplora, een fork van Electrs, bouwt extra indexen voor betere bedrijfsprestaties. De hoge gegevensvereisten (ongeveer 800 GB) maken het echter ongeschikt voor de testhardware. Belangrijkste punten:

  • Extreem grote opslagvereisten (~800 GB)
  • Kan worden uitgevoerd met --lightmode vlag, waardoor de schijfruimte met de helft wordt verminderd
  • Zelfs in de lichte modus verbruikt het bijna een schijf van 1 TB in combinatie met de ~420 GB blockchain.

De uitgebreide opslagbehoeften van deze implementatie overstijgen de typische single board computer setups, waardoor het onpraktisch is voor de meeste thuisgebruikers. Hoewel het prestatievoordelen biedt voor zakelijk gebruik, beperken de benodigde bronnen de toepasbaarheid in persoonlijke of kleinschalige implementaties.

addrindexrs

addrindexrs is een andere fork van Electrs, gebruikt door de Dojo backend voor het ophalen van historische transactiegegevens. Er zijn geen significante prestatiegerelateerde veranderingen die de opname als aparte implementatie in deze benchmark zouden rechtvaardigen. Deze fork heeft dezelfde karakteristieken als het originele Electrs project, waardoor het overbodig is voor prestatievergelijkingen in deze context.

Indexering

De indexeerprestaties variëren aanzienlijk tussen de drie implementaties:

ElectrumX: Langzaamste indexering (1 week), vanwege Python's single-threading en langzamere blokparsing. De uitgebreide index maakt echter meer schaalbare serverreacties mogelijk zonder frequente Bitcoin Core-query's. Een 64-bits besturingssysteem is cruciaal voor optimale prestaties.

Electrs: Snelste indexering (1 dag), toegeschreven aan de kleinere, eenvoudigere index en het geoptimaliseerd ophalen en parseren van blokken. Deze snelheid heeft een prijs: het moet blokken repareren tijdens het gebruik, wat de prestaties voor diepere wallets kan beïnvloeden.

Fulcrum: Matige indexeringstijd (2-3 dagen), bouwt een iets grotere index dan ElectrumX maar veel sneller. Het resource-intensieve proces profiteert van de implementatie in een lage taal. De snelle synchronisatie optie kan de indexeringssnelheid nog verder verbeteren. De resulterende uitgebreide index leidt tot uitstekende operationele prestaties.

Elke implementatie biedt een afweging tussen indexeringstijd, indexgrootte en operationele efficiëntie, en komt tegemoet aan verschillende gebruikssituaties en hardwaremogelijkheden.

De test

Deze benchmark evalueert twee veelvoorkomende serverbelastingen van Sparrow met behulp van een grote portemonnee (~3000 gebruikte adressen):

  1. Initieel laden van de portemonnee: Richt zich op adresabonnementen, waarmee Sparrow updates voor adrestransacties kan ontvangen. Belangrijk is dat elk abonnementsverzoek een hash retourneert van alle transactie-ID's en blokhoogtes die van invloed zijn op dat adres. De test meet de tijd om alle portemonneeadressen aan te melden.
  2. Verversen van portemonnee: Simuleert het ophalen van alle portemonneegegevens (transacties en blokken) tijdens een handmatige verversing, wat nodig is als communicatieproblemen leiden tot slechte gegevens. Adresabonnementen zijn al aanwezig voor deze test.

Belangrijkste testparameters:

  • Grote portemonnee met ~3000 gebruikte adressen
  • Batch paginagrootte van 50 voor alle servers
  • Meet inschrijftijd voor initieel laden
  • Meet de tijd die nodig is om gegevens op te halen voor het verversen van de portemonnee

Deze aanpak biedt een uitgebreide prestatievergelijking tussen verschillende implementaties van de Electrum server, gericht op echte gebruiksscenario's in Sparrow Wallet.

Test 1: initiële belasting (adresinschrijving)

Test Koude start Deel 1 Rennen 2 Loop 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Verkiezers 322386 ms 393303 ms 384036 ms 427722 ms
Vulpunt 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum: Snelste (gem ~1660 ms)
  • ElectrumX: Matig (gem ~49.133 ms)
  • Electrs: Langzaamst (gem ~381.862 ms)

Fulcrum presteert 22x beter dan ElectrumX en ~300x beter dan Electrs voor het laden van de portemonnee.

Test 2: Portemonnee verversen (gegevens ophalen)

Test Koude start Deel 1 Rennen 2 Loop 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Verkiezers 17562 ms 11621 ms 11219 ms 11521 ms
Vulpunt 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum: Snelste (gem ~9.208 ms)
  • Electrs: Seconde (gem ~12.981 ms)
  • ElectrumX: traagst (gem ~84.066 ms)

Fulcrum is 8x sneller dan ElectrumX en 1,5x sneller dan Electrs voor het verversen van portemonnees.

Fulcrum laat consistent superieure prestaties zien in beide tests, met aanzienlijke voordelen bij het initieel laden en een voorsprong bij het vernieuwen van de portemonnee. ElectrumX presteert matig bij het laden, maar heeft moeite met verversen. Electrs is traag bij het laden, maar laat concurrerende prestaties zien bij het vernieuwen.

Discussie

Sparrow Wallet vertrouwt op het Electrum-serverprotocol voor het beheer van transactiegegevens. Dit document vergelijkt de prestaties van volledige index Electrum server implementaties op standaard hardware, met de nadruk op Raspberry Pi 4 met 8GB RAM en 1TB externe USB SSD. Het onderzoekt ElectrumX, Electrs en Fulcrum implementaties.

ElectrumX, onderhouden op https://github.com/spesmilo/electrumxHet duurt ongeveer een week om de index van 75 GB op te bouwen op testhardware en vereist dat txindex is ingeschakeld op Bitcoin Core. Electrs, ontworpen voor persoonlijk gebruik https://github.com/romanz/electrsbouwt een index van 32 GB in 12-24 uur zonder dat txindex nodig is. Fulcrum https://github.com/cculianu/Fulcrum bouwt een index van 102 GB in 2-3 dagen, vereist txindex en biedt vooraf gecompileerde binaries.

Bij het testen werd een grote portemonnee (~3000 adressen) gebruikt om het initiële laden (abonnementen op adressen) en het verversen van de portemonnee (ophalen van gegevens) te meten. De resultaten laten zien dat Fulcrum aanzienlijk beter presteert dan de anderen, 22x sneller dan ElectrumX en ~300x sneller dan Electrs bij het initiële laden, en 8x sneller dan ElectrumX en 1,5x sneller dan Electrs bij het vernieuwen.

Het verschil in prestaties tussen Fulcrum en Electrs bij het initieel laden (1,4 seconden vs. 6 minuten) komt voort uit hun verschillende benaderingen van gegevensopslag. Electrs slaat minimale gegevens op, waardoor uitgebreide blokophaling en parsing nodig is voor het laden van elke portemonnee. Voor de testportemonnee betekende dit het herhaaldelijk verwerken van 3.5GB aan blokken, wat een hoge CPU-belasting en mogelijke responsstoringen op single board computers veroorzaakte. ElectrumX en Fulcrum onderhouden uitgebreide adresindexen, waardoor gegevens efficiënt kunnen worden opgehaald. Deze aanpak, gecombineerd met de transactie-index van Bitcoin Core, zorgt voor de superieure prestaties van Fulcrum.

Fulcrum's C++17 implementatie biedt consistente snelheid op verschillende platformen, terwijl de Python-gebaseerde architectuur van ElectrumX inconsistente prestaties en hoger CPU-gebruik laat zien. Deze bevindingen benadrukken de afwegingen tussen indexgrootte, query-snelheid en resourcegebruik in Electrum serverimplementaties, waarbij Fulcrum de beste balans biedt voor de meeste gebruikers.

Conclusie

Deze benchmark onthult Fulcrum als de optimale Electrum serverimplementatie voor Sparrow Wallet gebruikers.

Ondanks een iets langere initiële indexeringstijd in vergelijking met Electrs, biedt de uitgebreide index van Fulcrum superieure schaalbaarheid en prestaties.

Naarmate de diepte van de portemonnee toeneemt en de opslagkosten dalen, wegen de voordelen van Fulcrum op het gebied van query-snelheid, betrouwbaarheid en lange levensduur van de hardware op tegen de grotere benodigde schijfruimte.

Hoewel Electrs geschikt kan zijn voor scenario's met zeer beperkte schijfruimte en kleine portemonneedieptes, wordt Fulcrum aanbevolen als de ideale server voor Sparrow, omdat het de beste balans biedt tussen prestaties en resourcegebruik voor de meeste gebruikers.

Technische opmerking
Efficiënte adresindexering in Electrum-servers vereist strategische gegevensopslagtechnieken. Fulcrum en ElectrumX gebruiken script-hashsleutels (respectievelijk 32 bytes en 11 bytes) om naar transactienummers te verwijzen (tx_num). Deze tx_num vertegenwoordigt de volgorde van een transactie in de blockchain en dient als een compacte identificatiecode. De systemen onderhouden een bestand van txids besteld door tx_numwaardoor snel txid ophalen. Ze houden ook een array in het geheugen bij die blokhoogtes koppelt aan cumulatieve transactietellingen, waardoor blokhoogtes snel kunnen worden opgezocht. Deze aanpak ruilt verhoogde opslag (bijvoorbeeld ElectrumX' extra 21GB voor txid lookup) voor aanzienlijk verbeterde queryprestaties vergeleken met de minimale opslagmethode van ElectrumX. Dit ontwerp illustreert de balans tussen opslagefficiëntie en queriesnelheid in databasetechnieken, waarbij Fulcrum en ElectrumX prioriteit geven aan prestaties boven opslagbesparing.