サーバーパフォーマンス

更新日2022年 2月 1日

Sparrow Walletは、取引データの管理にElectrumサーバープロトコルを使用しています。

このドキュメントでは、標準的なハードウェア上に実装された様々なフルインデックスElectrumサーバーの現在のパフォーマンスベンチマークを示し、これらの結果に基づいた2つの異なる実装アプローチについて説明します。

背景

Electrumサーバーは、ビットコインアドレスのインデックスとして機能し、ユーザーは指定されたアドレスに関連する取引を検索することができます。この機能を持たないビットコインのリファレンス実装とは異なり、Electrumサーバーはこの機能を提供する。コンパクトなブロックフィルターは同様の情報を提供できるが、mempoolトランザクションをサポートしておらず、効率も悪い。

Electrumサーバープロトコルは、最も広く採用されているビットコインアドレスインデックスプロトコルです。このベンチマークは、特定のウォレットの詳細をサーバーに保存しないため、プライバシーにとって重要な完全なアドレスインデックスに焦点を当てています。最適なコールドストレージセキュリティのためには、すべてのウォレット情報はウォレットファイル内に含まれ、ウォレット閉鎖後にサーバーから削除されるべきです。このアプローチはBWTやEPSのようなウォレットアドレスをサーバーに保存する必要のあるプロジェクトを除外しています。

モチベーションパーマリンク

このベンチマークは、ジェームソン・ロップの2020年7月のパフォーマンス・レポートをベースにしているが、2つの重要な違いがある:

  1. AWSサーバーの代わりにRaspberry Pi 4を使用するため、ホームユーザーにより適している。
  2. プロジェクトの最新ビルドを採用し、大幅な変更後に再テストを行う。

これらのアップデートにより、ベンチマークは、シングルボードコンピュータ上でElectrumサーバーを動作させたいと考えているSparrowユーザーにとって特に有用なものとなりました。この結果は、家庭環境でElectrumサーバーのセルフホスティングを検討しているユーザーにとって、実用的な洞察を与えてくれます。

ハードウェア

このベンチマークでは、プライバシーを重視するSparrowユーザーに典型的なハードウェア、Ubuntu 21.10 64ビットOSを実行するRaspberry Pi 4(8GBモデル)を使用しています。ビットコインのブロックチェーンと関連インデックス(約0.5TB)のサイズが大きいため、HDDよりも外付けの1TBのUSB SSDを使用しています。このセットアップは、一般的なホームユーザー構成を反映しており、同様のシングルボードコンピュータセットアップでElectrumサーバーをセルフホストすることを検討している人々に関連するパフォーマンスデータを提供します。

プロジェクト

エレクトラムX

ElectrumXは、オリジナルのElectrumサーバープロジェクトの後継で、2017年に採用された。オリジナルの作者がビットコイン・ブロックチェーンのサポートを停止した後、Electrumの開発者たちはプロジェクトをフォークし、現在は以下の場所で管理されている。 https://github.com/spesmilo/electrumx.

ElectrumXの大きな課題は、最初のインデックス構築で、テスト用ハードウェアでは約1週間かかる。しかし、ユーザーはよりパワフルなマシンでインデックスを構築し、それをシングルボードコンピューターに移すことができます。キーポイント

  • 現在のデータベース・サイズ:75 GB
  • Bitcoin Coreでtxindexが有効になっている必要があります。
  • コンパイル済みバイナリがない
  • テストバージョンElectrumX 1.16

ElectrumXのインデックスは、より強力なハードウェア上に構築して転送することが可能で、コンピューティングリソースが限られているユーザーにも柔軟性を提供します。

選挙民

Electrsは、パブリックサーバーではなく、パーソナルユース向けに設計されており、ElectrumXと比較すると、ストレージ要件は低いが、CPU使用率は高い。メンテナンスは https://github.com/romanz/electrs.

Electrsの主な利点は、テスト用ハードウェア上でわずか12~24時間という高速インデックス構築時間です。この効率性により、ほとんどの構築済みノードパッケージでElectrsが選ばれています。キーポイント

  • 現在のデータベース・サイズ:32 GB
  • Bitcoin Coreではtxindexを必要としない。
  • コンパイル済みバイナリがない
  • テストバージョンエレクトラーズ 0.9.4

インデックスの構築時間が大幅に短縮され、データベースのサイズが小さくなったことで、Electrsは、特にリソースの限られたハードウェア上で、個人的に使用するには魅力的な選択肢となった。

フルクラム

最新のC++実装であるFulcrumは、必要なディスク容量が大きいにもかかわらず、高いパフォーマンスを提供する。メンテナンスは https://github.com/cculianu/Fulcrumインデックス作成速度と運用性能のバランスがとれている。

Fulcrumのインデックス作成には、テスト用ハードウェアで2~3日かかり、ElectrsとElectrumXの中間に位置します。いったんインデックスが作成されれば、卓越したパフォーマンスを発揮します。キーポイント

  • 現在のデータベース・サイズ:102 GB
  • Bitcoin Coreでtxindexが有効になっている必要があります。
  • Linux(x86_64およびarm64)およびWindows用のコンパイル済みバイナリが利用可能です。
  • テストバージョンフルクラム 1.6.0

Fulcrumの合理的なインデックス作成時間と卓越した運用性能の組み合わせは、特に大規模なストレージのニーズに対応できるユーザーにとって、魅力的な選択肢となる。

エレクトロスプローラ

ElectrsのフォークであるElectrs-esploraは、エンタープライズ性能を向上させるために追加インデックスを構築する。しかし、必要なデータ量が多く(約800GB)、テスト用ハードウェアには適さない。キーポイント

  • 非常に大きなストレージが必要(~800GB)
  • で実行できる。 --lightmode フラグでディスク容量を半分に減らす
  • ライトモードでも、~420GBのブロックチェーンと組み合わせると、1TBのドライブを使い果たすほどだ

この実装では、一般的なシングルボードコンピュータのセットアップを超える広範なストレージが必要となるため、ほとんどのホームユーザーには実用的ではありません。この実装は、企業での使用においてパフォーマンス上の利点がある一方で、そのリソース需要から、個人または小規模な展開での適用には限界があります。

インデックス

addrindexrsは別のElectrsフォークであり、Dojoバックエンドが過去のトランザクションデータ検索に使用している。このベンチマークに別の実装として含めることを正当化するような、性能に関連する重要な変更がない。このフォークはオリジナルのElectrsプロジェクトと同様の特徴を維持しているため、このコンテキストにおける性能比較の目的には冗長である。

インデックス作成

インデックスの性能は、3つの実装の間で大きく異なる:

ElectrumX:Pythonのシングルスレッドとブロックの解析が遅いため、インデックス作成が最も遅い(1週間)。しかし、その包括的なインデックスは、頻繁なBitcoin Coreクエリなしで、よりスケーラブルなサーバー応答を可能にする。最適なパフォーマンスには64ビットOSが不可欠。

Electrs:より小さくシンプルなインデックスと、最適化されたブロックの検索と解析による。この速さには代償が伴う:運用中にブロックを再解析する必要があり、より深いウォレットのパフォーマンスに影響を与える可能性がある。

フルクラムインデックス作成にかかる時間は中程度(2~3日)で、ElectrumXより若干大きいが、はるかに高速。リソース集約的な処理は、低レベル言語実装の恩恵を受けている。Fulcrumは 高速同期 オプションはインデックス作成速度をさらに向上させる。その結果、包括的なインデックスが優れた運用パフォーマンスをもたらします。

各実装は、インデックス作成時間、インデックスサイズ、運用効率のトレードオフを提示し、異なるユースケースとハードウェア機能に対応する。

テスト

このベンチマークでは、大規模なウォレット(~3000アドレス使用)を使用して、Sparrowの2つの一般的なサーバー負荷を評価します:

  1. 初期のウォレットローディング:Sparrowがアドレストランザクションのアップデートを受信できるようにするアドレスサブスクリプションに重点を置いています。 重要なことは、各サブスクリプションリクエストが、そのアドレスに影響するすべ てのトランザクションIDとブロックハイツのハッシュを返すことである。 このテストでは、すべてのウォレットアドレスを登録するまでの時間を測定する。
  2. ウォレットのリフレッシュ:手動リフレッシュ中にすべてのウォレットデータ(トランザクションとブロック)を取得するシミュレーション。アドレスサブスクリプションは、このテストのためにすでに導入されている。

主なテストパラメーター:

  • 3000の使用済みアドレスを持つ大きな財布
  • すべてのサーバーのバッチ・ページ・サイズは50
  • 初回ロードにかかる加入時間を測定
  • 財布のリフレッシュのためのデータ検索時間を測定

このアプローチでは、Sparrow Walletでの実際の使用シナリオに焦点を当て、異なるElectrumサーバー実装間の包括的な性能比較を提供します。

テスト1:初期ロード(アドレス加入)

テスト コールドスタート ラン1 ラン2 ラン3
エレクトラムX 52655 ms 40721 ms 54143 ms 49011 ms
選挙民 322386 ms 393303 ms 384036 ms 427722 ms
フルクラム 2333 ms 1413 ms 1472ミリ秒 1413 ms
  • フルクラム最速(平均~1660ミリ秒)
  • ElectrumX: 中程度 (平均 ~49,133 ms)
  • エレクトラ最も遅い(平均~381,862ミリ秒)

FulcrumはElectrumXを22倍、Electrsを300倍上回る。

テスト2:ウォレットのリフレッシュ(データ検索)

テスト コールドスタート ラン1 ラン2 ラン3
エレクトラムX 114466 ms 66175 ms 80133 ms 75489 ms
選挙民 17562 ms 11621 ms 11219 ms 11521 ms
フルクラム 14152 ms 7854 ms 7382 ms 7442 ms
  • フルクラム最速(平均~9,208ミリ秒)
  • 電秒(平均~12,981ミリ秒)
  • ElectrumX: 最も遅い (平均 ~84,066 ms)

FulcrumはElectrumXの8倍、Electrsの1.5倍の速度でウォレットの更新を行う。

Fulcrumは両テストで一貫して優れたパフォーマンスを示し、最初の読み込みで大きな優位性を示し、ウォレットの更新で優位性を維持している。ElectrumXは、ローディングでは中程度のパフォーマンスだが、リフレッシュでは苦戦している。Electrsは、初期読み込みでは遅いが、リフレッシュでは競争力のあるパフォーマンスを見せている。

ディスカッション

Sparrow Walletはトランザクションデータの管理にElectrumサーバープロトコルを使用しています。このドキュメントでは、8GB RAMと1TBの外付けUSB SSDを搭載したRaspberry Pi 4を中心に、標準的なハードウェアでフルインデックスのElectrumサーバー実装のパフォーマンスを比較します。ElectrumX、Electrs、Fulcrumの実装を検証しています。

エレクトラムX https://github.com/spesmilo/electrumxテスト用ハードウェアで75GBのインデックスを構築するのに約1週間かかり、Bitcoin Coreでtxindexを有効にする必要がある。Electrs、個人使用向けに設計 https://github.com/romanz/electrstxindexを必要とせず、32GBのインデックスを12-24時間で構築。フルクラム https://github.com/cculianu/Fulcrum は102GBのインデックスを2-3日で構築し、txindexを必要とし、コンパイル済みバイナリを提供する。

テストでは、大規模なウォレット(~3000アドレス)を使用し、初期ロード(アドレス登録)とウォレットのリフレッシュ(データ取得)を測定しました。その結果、Fulcrumは、初期ロードにおいてElectrumXの22倍、Electrsの約300倍、リフレッシュにおいてElectrumXの8倍、Electrsの1.5倍と、他を大きく凌駕しています。

初期ロードにおけるFulcrumとElectrsのパフォーマンス差(1.4秒対6分)は、両者のデータ保存アプローチの違いに起因する。Electrsは最小限のデータしか保存しないため、ウォレットをロードするたびに膨大なブロックの検索と解析が必要になります。テストウォレットでは、これは3.5GBのブロックを繰り返し処理することを意味し、CPU負荷が高く、シングルボードコンピュータでのレスポンスに失敗する可能性がありました。ElectrumXとFulcrumは包括的なアドレスインデックスを保持し、効率的なデータ検索を可能にしている。このアプローチとBitcoin Coreのトランザクションインデックスとの組み合わせが、Fulcrumの優れたパフォーマンスを可能にしている。

FulcrumのC++17実装は、全てのプラットフォームで一貫したスピードを提供するのに対し、ElectrumXのPythonベースのアーキテクチャは、パフォーマンスに一貫性がなく、CPU使用率も高い。これらの結果は、Electrumサーバーの実装におけるインデックスサイズ、クエリー速度、リソース使用率のトレードオフを浮き彫りにしています。

結論

このベンチマークにより、FulcrumがSparrow Walletユーザーに最適なElectrumサーバー実装であることが明らかになりました。

Electrsと比較すると、最初のインデックス作成に若干時間がかかるものの、Fulcrumの包括的なインデックスは優れたスケーラビリティとパフォーマンスを提供します。

ウォレットの深さが増加し、ストレージのコストが減少するにつれ、フルクラムのクエリー速度、信頼性、ハードウェアの寿命の利点は、より大きなディスクスペースを必要とすることを凌駕する。

Electrsは、ディスク容量が非常に限られていて、ウォレットの深さが小さいシナリオに適しているかもしれませんが、FulcrumはSparrowの理想的なサーバーとして推奨され、ほとんどのユーザーにとってパフォーマンスとリソースの利用率の最高のバランスを提供します。

テクニカルノート
Electrumサーバーの効率的なアドレスインデックス作成には、戦略的なデータ保存技術が必要です。FulcrumとElectrumXは、スクリプトのハッシュキー(それぞれ32バイトと11バイト)をトランザクション番号(tx_num).これは tx_num はブロックチェーンにおける取引の順序を表し、コンパクトな識別子の役割を果たす。システムは txids 注文済み tx_num迅速な txid を検索することができる。また、ブロックの高さと累積トランザクション数を対応させたインメモリ配列を保持し、ブロックの高さを高速に検索できるようにしている。このアプローチは、ストレージの増加(例えば、ElectrumXの21GBの追加)と引き換えである。 txid ルックアップ)により、Electrsの最小ストレージ方式と比較して、クエリパフォーマンスが大幅に改善されている。この設計は、FulcrumとElectrumXが、ストレージの経済性よりもパフォーマンスを優先していることで、データベースエンジニアリングにおけるストレージ効率とクエリー速度のバランスを示している。