Wydajność serwera

Aktualizacja: 1 lutego 2022 r.

Sparrow Wallet opiera się na protokole serwera Electrum do zarządzania danymi transakcji.

Niniejszy dokument zawiera aktualne testy wydajności dla różnych implementacji serwera Electrum z pełnym indeksem na standardowym sprzęcie i omawia dwa różne podejścia do implementacji oparte na tych ustaleniach.

Kontekst

Serwer Electrum działa jako indeks adresów Bitcoin, umożliwiając użytkownikom pobieranie transakcji powiązanych z danym adresem. W przeciwieństwie do referencyjnej implementacji Bitcoina, która nie posiada tej funkcji, serwery Electrum oferują tę funkcjonalność. Podczas gdy kompaktowe filtry blokowe mogą dostarczać podobnych informacji, nie obsługują one transakcji mempool i są mniej wydajne.

Protokół serwera Electrum jest najczęściej stosowanym protokołem indeksu adresów Bitcoin. Niniejszy test porównawczy koncentruje się na pełnych indeksach adresowych, które mają kluczowe znaczenie dla prywatności, ponieważ nie przechowują konkretnych szczegółów portfela na serwerze. Dla optymalnego bezpieczeństwa cold storage, wszystkie informacje o portfelu powinny być zawarte w pliku portfela i usuwane z serwera po jego zamknięciu. Takie podejście wyklucza projekty takie jak BWT i EPS, które wymagają przechowywania adresów portfeli na serwerze.

MotywacjaPermalink

Ten punkt odniesienia opiera się na raporcie Jameson Lopp z lipca 2020 r., z dwiema kluczowymi różnicami:

  1. Wykorzystuje Raspberry Pi 4 zamiast serwera AWS, dzięki czemu jest bardziej odpowiedni dla użytkowników domowych.
  2. Wykorzystuje aktualne kompilacje projektów i testuje je ponownie po wprowadzeniu istotnych zmian.

Te aktualizacje sprawiają, że benchmarki są szczególnie przydatne dla użytkowników Sparrow, którzy chcą uruchomić własny serwer Electrum na komputerze jednopłytkowym, pozwalając im porównać różne implementacje i wybrać tę, która najlepiej odpowiada ich potrzebom. Wyniki dostarczają praktycznych informacji dla użytkowników rozważających samodzielne hostowanie serwera Electrum w środowisku domowym.

Sprzęt

Ten test porównawczy wykorzystuje sprzęt typowy dla świadomych prywatności użytkowników Sparrow: Raspberry Pi 4 (model 8 GB) z 64-bitowym systemem operacyjnym Ubuntu 21.10. Do przechowywania danych wykorzystano zewnętrzny dysk SSD USB o pojemności 1 TB, preferowany zamiast dysków twardych ze względu na duży rozmiar łańcucha bloków Bitcoin i powiązanych indeksów (około 0,5 TB). Ta konfiguracja odzwierciedla typowe konfiguracje użytkowników domowych, zapewniając odpowiednie dane dotyczące wydajności dla tych, którzy rozważają samodzielne hostowanie serwera Electrum na podobnych konfiguracjach komputerów jednopłytkowych.

Projekty

ElectrumX

ElectrumX, następca oryginalnego projektu serwera Electrum, został przyjęty w 2017 roku. Po tym, jak pierwotny autor zaprzestał obsługi blockchaina Bitcoin, deweloperzy Electrum rozwidlili projekt, obecnie utrzymywany pod adresem https://github.com/spesmilo/electrumx.

Istotnym wyzwaniem związanym z ElectrumX jest początkowe tworzenie indeksu, które na testowym sprzęcie zajmuje około tygodnia. Użytkownicy mogą jednak zbudować indeks na mocniejszej maszynie i przenieść go na komputer jednopłytkowy. Kluczowe punkty:

  • Aktualny rozmiar bazy danych: 75 GB
  • Wymaga włączonego txindex w Bitcoin Core
  • Brak dostępnych prekompilowanych plików binarnych
  • Testowana wersja: ElectrumX 1.16

Indeks ElectrumX można zbudować na bardziej wydajnym sprzęcie i przenieść, oferując elastyczność użytkownikom z ograniczonymi zasobami obliczeniowymi.

Elektrycy

Electrs, przeznaczony raczej do użytku osobistego niż na serwerach publicznych, oferuje niższe wymagania dotyczące pamięci masowej, ale wyższe zużycie procesora w porównaniu do ElectrumX. Jest on utrzymywany pod adresem https://github.com/romanz/electrs.

Kluczową zaletą Electrs jest szybszy czas budowania indeksu, zajmujący tylko 12-24 godzin na sprzęcie testowym. Ta wydajność sprawiła, że jest to preferowany wybór dla większości wstępnie zbudowanych pakietów węzłów. Kluczowe punkty:

  • Aktualny rozmiar bazy danych: 32 GB
  • Nie wymaga txindex na Bitcoin Core
  • Brak dostępnych prekompilowanych plików binarnych
  • Testowana wersja: Electrs 0.9.4

Znacznie krótszy czas tworzenia indeksu i mniejszy rozmiar bazy danych sprawiają, że Electrs jest atrakcyjną opcją do użytku osobistego, zwłaszcza na sprzęcie z ograniczonymi zasobami.

Fulcrum

Fulcrum, nowoczesna implementacja C++, oferuje wysoką wydajność pomimo większego zapotrzebowania na miejsce na dysku. Utrzymywana pod adresem https://github.com/cculianu/Fulcrumzapewnia równowagę między szybkością indeksowania a wydajnością operacyjną.

Indeksowanie Fulcrum trwa 2-3 dni na sprzęcie testowym, co plasuje go pomiędzy Electrs i ElectrumX pod względem czasu kompilacji. Po indeksowaniu zapewnia wyjątkową wydajność. Kluczowe punkty:

  • Aktualny rozmiar bazy danych: 102 GB
  • Wymaga włączonego txindex w Bitcoin Core
  • Wstępnie skompilowane pliki binarne dostępne dla Linux (x86_64 i arm64) i Windows
  • Testowana wersja: Fulcrum 1.6.0

Połączenie rozsądnego czasu indeksowania i wyjątkowej wydajności operacyjnej sprawia, że Fulcrum jest atrakcyjną opcją, szczególnie dla użytkowników, którzy mogą zaspokoić większe potrzeby w zakresie pamięci masowej.

Electrs-esplora

Electrs-esplora, rozwidlenie Electrs, tworzy dodatkowe indeksy w celu zwiększenia wydajności przedsiębiorstwa. Jednak jego wysokie wymagania dotyczące danych (około 800 GB) sprawiają, że nie nadaje się on do testowanego sprzętu. Kluczowe punkty:

  • Bardzo duże zapotrzebowanie na pamięć masową (~800 GB)
  • Może być uruchamiany z --lightmode zmniejszając przestrzeń dyskową o połowę
  • Nawet w trybie "light", w połączeniu z blockchainem o pojemności ~420 GB, prawie wyczerpuje dysk o pojemności 1 TB

Potrzeby tej implementacji w zakresie pamięci masowej wykraczają poza typowe konfiguracje komputerów jednopłytkowych, co czyni ją niepraktyczną dla większości użytkowników domowych. Chociaż oferuje korzyści w zakresie wydajności w zastosowaniach korporacyjnych, jego zapotrzebowanie na zasoby ogranicza jego zastosowanie w zastosowaniach osobistych lub na małą skalę.

addrindexrs

addrindexrs to kolejny fork Electrs, używany przez backend Dojo do pobierania danych historycznych transakcji. Brakuje w nim znaczących zmian związanych z wydajnością, które uzasadniałyby włączenie go jako oddzielnej implementacji w tym benchmarku. Ten fork zachowuje podobne cechy do oryginalnego projektu Electrs, co czyni go zbędnym do celów porównania wydajności w tym kontekście.

Indeksowanie

Wydajność indeksowania różni się znacząco pomiędzy trzema implementacjami:

ElectrumX: Najwolniejsze indeksowanie (1 tydzień) ze względu na jednowątkowość Pythona i wolniejsze analizowanie bloków. Jednak jego kompleksowy indeks pozwala na bardziej skalowalne odpowiedzi serwera bez częstych zapytań Bitcoin Core. 64-bitowy system operacyjny ma kluczowe znaczenie dla optymalnej wydajności.

Electrs: Najszybsze indeksowanie (1 dzień), przypisywane mniejszemu, prostszemu indeksowi oraz zoptymalizowanemu pobieraniu i analizowaniu bloków. Szybkość ta ma swoją cenę: musi ponownie analizować bloki podczas działania, potencjalnie wpływając na wydajność głębszych portfeli.

Fulcrum: Umiarkowany czas indeksowania (2-3 dni), budowanie nieco większego indeksu niż ElectrumX, ale znacznie szybciej. Jego wymagający dużej ilości zasobów proces korzysta z niskopoziomowej implementacji języka. The szybka synchronizacja może dodatkowo poprawić szybkość indeksowania. Wynikowy kompleksowy indeks prowadzi do doskonałej wydajności operacyjnej.

Każda implementacja stanowi kompromis między czasem indeksowania, rozmiarem indeksu i wydajnością operacyjną, zaspokajając różne przypadki użycia i możliwości sprzętowe.

Test

Ten test porównawczy ocenia dwa typowe obciążenia serwera Sparrow przy użyciu dużego portfela (~3000 używanych adresów):

  1. Początkowe ładowanie portfela: Skupia się na subskrypcjach adresów, które pozwalają Sparrow otrzymywać aktualizacje dla transakcji adresowych. Co ważne, każde żądanie subskrypcji zwraca skrót wszystkich identyfikatorów transakcji i wysokości bloków wpływających na ten adres. Test mierzy czas subskrypcji wszystkich adresów portfela.
  2. Odświeżanie portfela: Symuluje pobieranie wszystkich danych portfela (transakcji i bloków) podczas ręcznego odświeżania, co jest konieczne, gdy problemy z komunikacją prowadzą do błędnych danych. Subskrypcje adresów są już dostępne dla tego testu.

Kluczowe parametry testu:

  • Duży portfel z ~3000 używanych adresów
  • Rozmiar strony partii 50 dla wszystkich serwerów
  • Mierzy czas subskrypcji dla początkowego ładowania
  • Mierzy czas pobierania danych w celu odświeżenia portfela

Takie podejście zapewnia kompleksowe porównanie wydajności różnych implementacji serwera Electrum, koncentrując się na rzeczywistych scenariuszach użytkowania w Sparrow Wallet.

Test 1: Początkowe obciążenie (subskrypcja adresu)

Test Zimny start Bieg 1 Bieg 2 Bieg 3
ElectrumX 52655 ms 40721 ms 54143 ms 49011 ms
Elektrycy 322386 ms 393303 ms 384036 ms 427722 ms
Fulcrum 2333 ms 1413 ms 1472 ms 1413 ms
  • Fulcrum: Najszybszy (średnio ~1660 ms)
  • ElectrumX: Umiarkowany (średnio ~49 133 ms)
  • Electrs: Najwolniejszy (średnio ~381,862 ms)

Fulcrum przewyższa ElectrumX o 22x i Electrs o ~300x pod względem początkowego obciążenia portfela.

Test 2: Odświeżanie portfela (pobieranie danych)

Test Zimny start Bieg 1 Bieg 2 Bieg 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Elektrycy 17562 ms 11621 ms 11219 ms 11521 ms
Fulcrum 14152 ms 7854 ms 7382 ms 7442 ms
  • Fulcrum: Najszybszy (średnio ~9,208 ms)
  • Electrs: sekunda (średnio ~12 981 ms)
  • ElectrumX: Najwolniejszy (średnio ~84,066 ms)

Fulcrum jest 8x szybszy niż ElectrumX i 1,5x szybszy niż Electrs w przypadku odświeżania portfela.

Fulcrum konsekwentnie wykazuje najwyższą wydajność w obu testach, wykazując znaczną przewagę w początkowym ładowaniu i utrzymując przewagę w odświeżaniu portfela. ElectrumX osiąga umiarkowane wyniki w ładowaniu, ale zmaga się z odświeżaniem. Electrs, choć powolny w początkowym ładowaniu, wykazuje konkurencyjną wydajność w odświeżaniu.

Dyskusja

Sparrow Wallet opiera się na protokole serwera Electrum do zarządzania danymi transakcji. Niniejszy dokument porównuje wydajność implementacji serwera Electrum z pełnym indeksem na standardowym sprzęcie, koncentrując się na Raspberry Pi 4 z 8 GB pamięci RAM i zewnętrznym dyskiem SSD USB o pojemności 1 TB. Analizowane są implementacje ElectrumX, Electrs i Fulcrum.

ElectrumX, utrzymywany pod adresem https://github.com/spesmilo/electrumxZbudowanie indeksu o wielkości 75 GB na sprzęcie testowym zajmuje około tygodnia i wymaga włączenia txindex w Bitcoin Core. Electrs, zaprojektowany do użytku osobistego https://github.com/romanz/electrsbuduje indeks 32 GB w ciągu 12-24 godzin bez konieczności stosowania txindex. Fulcrum https://github.com/cculianu/Fulcrum buduje indeks o rozmiarze 102 GB w ciągu 2-3 dni, wymaga txindex i oferuje prekompilowane pliki binarne.

W testach wykorzystano duży portfel (~3000 adresów) do pomiaru początkowego ładowania (subskrypcji adresów) i odświeżania portfela (pobierania danych). Wyniki pokazują, że Fulcrum znacznie przewyższa inne, będąc 22x szybszym niż ElectrumX i ~300x szybszym niż Electrs w początkowym ładowaniu oraz 8x szybszym niż ElectrumX i 1,5x szybszym niż Electrs w odświeżaniu.

Różnica w wydajności między Fulcrum i Electrs w początkowym ładowaniu (1,4 sekundy vs 6 minut) wynika z ich różnych podejść do przechowywania danych. Electrs przechowuje minimalną ilość danych, wymagając obszernego pobierania i analizowania bloków przy każdym ładowaniu portfela. W przypadku portfela testowego oznaczało to wielokrotne przetwarzanie 3,5 GB bloków, powodując duże obciążenie procesora i potencjalne awarie odpowiedzi na komputerach jednopłytkowych. ElectrumX i Fulcrum utrzymują kompleksowe indeksy adresów, umożliwiając wydajne pobieranie danych. Takie podejście, w połączeniu z indeksem transakcji Bitcoin Core, zapewnia Fulcrum najwyższą wydajność.

Implementacja Fulcrum w języku C++17 zapewnia stałą szybkość na wszystkich platformach, podczas gdy architektura ElectrumX oparta na języku Python wykazuje niespójną wydajność i wyższe zużycie procesora. Wyniki te podkreślają kompromisy między rozmiarem indeksu, szybkością zapytań i wykorzystaniem zasobów w implementacjach serwerów Electrum, przy czym Fulcrum oferuje najlepszą równowagę dla większości użytkowników.

Wnioski

Ten test porównawczy pokazuje, że Fulcrum jest optymalną implementacją serwera Electrum dla użytkowników Sparrow Wallet.

Pomimo nieco dłuższego początkowego czasu indeksowania w porównaniu do Electrs, kompleksowy indeks Fulcrum oferuje doskonałą skalowalność i wydajność.

Wraz ze wzrostem głębokości portfela i spadkiem kosztów pamięci masowej, korzyści Fulcrum w zakresie szybkości zapytań, niezawodności i trwałości sprzętu przeważają nad większym zapotrzebowaniem na miejsce na dysku.

Podczas gdy Electrs może pasować do scenariuszy z bardzo ograniczoną przestrzenią dyskową i małą głębokością portfela, Fulcrum jest zalecany jako idealny serwer dla Sparrow, zapewniając najlepszą równowagę między wydajnością i wykorzystaniem zasobów dla większości użytkowników.

Uwaga techniczna
Efektywne indeksowanie adresów na serwerach Electrum obejmuje strategiczne techniki przechowywania danych. Fulcrum i ElectrumX używają kluczy hash skryptu (odpowiednio 32 bajty i 11 bajtów) do mapowania numerów transakcji (tx_num). To tx_num reprezentuje kolejność transakcji w łańcuchu bloków, służąc jako kompaktowy identyfikator. Systemy utrzymują plik txids zamówiony przez tx_numumożliwiając szybkie txid pobieranie. Przechowują również w pamięci tablicę mapującą wysokości bloków do skumulowanej liczby transakcji, umożliwiając szybkie wyszukiwanie wysokości bloków. Podejście to pozwala handlować zwiększoną pamięcią masową (np. dodatkowe 21 GB w ElectrumX dla txid lookup) dla znacznie lepszej wydajności zapytań w porównaniu do minimalnej metody przechowywania Electrs. Projekt ten ilustruje równowagę między wydajnością pamięci masowej a szybkością zapytań w inżynierii baz danych, przy czym Fulcrum i ElectrumX przedkładają wydajność nad oszczędność pamięci masowej.