服务器性能

已更新:2022 年 2 月 1 日

Sparrow Wallet 依靠 Electrum 服务器协议进行交易数据管理。

本文件提供了标准硬件上各种全索引 Electrum 服务器实施的当前性能基准,并根据这些结果讨论了两种不同的实施方法。

背景介绍

Electrum 服务器具有比特币地址索引的功能,允许用户检索与给定地址相关的交易。与缺乏这一功能的比特币参考实现不同,Electrum 服务器提供了这一功能。虽然紧凑型区块过滤器可以提供类似的信息,但它们不支持 mempool 交易,而且效率较低。

Electrum 服务器协议是最广泛采用的比特币地址索引协议。本基准测试的重点是完整地址索引,这对隐私至关重要,因为它们不会在服务器上存储特定钱包的详细信息。为了实现最佳的冷存储安全性,所有钱包信息都应包含在钱包文件中,并在钱包关闭后从服务器上删除。这种方法排除了 BWT 和 EPS 等需要在服务器上存储钱包地址的项目。

动机Permalink

该基准以 Jameson Lopp 2020 年 7 月的绩效报告为基础,但有两个主要区别:

  1. 它使用 Raspberry Pi 4 而不是 AWS 服务器,因此更适合家庭用户使用。
  2. 它采用最新的项目构建,并在发生重大变化后重新进行测试。

这些更新使基准测试对希望在单板计算机上运行自己的 Electrum 服务器的 Sparrow 用户特别有用,他们可以比较不同的实现方式,选择最适合自己需求的方式。这些结果为考虑在家庭环境中自行托管 Electrum 服务器的用户提供了实用的见解。

硬件

该基准测试使用的是具有隐私意识的 Sparrow 用户的典型硬件:运行 Ubuntu 21.10 64 位操作系统的 Raspberry Pi 4(8GB 机型)。数据存储使用 1TB 的外置 USB 固态硬盘,由于比特币区块链和相关索引的容量较大(约 0.5 TB),因此首选固态硬盘而非硬盘。该设置反映了常见的家庭用户配置,为那些考虑在类似单板计算机设置上自行托管 Electrum 服务器的用户提供了相关性能数据。

项目

ElectrumX

ElectrumX是原Electrum服务器项目的继承者,于2017年被采用。在原作者停止对比特币区块链的支持后,Electrum 开发人员分叉了该项目,现在维护在 https://github.com/spesmilo/electrumx.

ElectrumX 面临的一个重大挑战是初始索引的建立,在测试硬件上大约需要一周时间。不过,用户可以在功能更强大的机器上建立索引,并将其转移到单板计算机上。关键点

  • 当前数据库大小:75 GB
  • 需要在 Bitcoin Core 上启用 txindex
  • 没有预编译二进制文件
  • 已测试版本:ElectrumX 1.16

ElectrumX 的索引可以建立在更强大的硬件上并进行转移,为计算资源有限的用户提供了灵活性。

电工

与 ElectrumX 相比,Electrs 专为个人使用而非公共服务器设计,存储要求较低,但 CPU 占用率较高。它在 https://github.com/romanz/electrs.

Electrs 的主要优势是索引构建时间更短,在测试硬件上仅需 12-24 小时。这种效率使其成为大多数预建节点软件包的首选。关键点

  • 当前数据库大小:32 GB
  • 在 Bitcoin Core 上不需要 txindex
  • 没有预编译二进制文件
  • 已测试版本:Electrs 0.9.4

由于建立索引的时间大大缩短,而且数据库规模较小,Electrs 对个人用户,尤其是资源有限的硬件用户来说,是一个极具吸引力的选择。

支点

Fulcrum 是一种现代 C++ 实现,尽管需要较大的磁盘空间,但仍能提供高性能。在 https://github.com/cculianu/Fulcrum因此,它在索引速度和运行性能之间取得了平衡。

Fulcrum 的索引编制在测试硬件上需要 2-3 天时间,在构建时间上介于 Electrs 和 ElectrumX 之间。索引完成后,它将提供卓越的性能。关键点

  • 当前数据库大小:102 GB
  • 需要在 Bitcoin Core 上启用 txindex
  • 预编译二进制文件可用于 Linux(x86_64 和 arm64)和 Windows
  • 已测试版本:Fulcrum 1.6.0

Fulcrum 结合了合理的索引时间和出色的运行性能,使其成为一个令人信服的选择,尤其是对于能够满足较大存储需求的用户而言。

电容器

Electrs-esplora 是 Electrs 的一个分叉,它建立了额外的索引以提高企业性能。然而,它对数据的要求较高(约 800 GB),因此不适合测试硬件。关键点

  • 存储需求极大(约 800 GB)
  • 可与 --lightmode 标记,将磁盘空间减少一半
  • 即使在轻量模式下,与约 420GB 的区块链结合使用时,也几乎耗尽了 1TB 的硬盘。

这种实现方式的大量存储需求超出了典型的单板计算机设置,因此对大多数家庭用户来说并不实用。虽然它为企业使用提供了性能优势,但其资源需求限制了它在个人或小规模部署中的适用性。

addrindexrs

addrindexrs 是另一个 Electrs fork,被 Dojo 后端用于历史交易数据检索。它缺乏与性能相关的重大变化,因此没有理由将其作为一个单独的实现纳入本基准。该分叉保持了与原始 Electrs 项目类似的特性,因此在此情况下用于性能比较是多余的。

索引

三种实现方式的索引性能差异很大:

ElectrumX:由于 Python 的单线程和较慢的区块解析,索引速度最慢(1 周)。不过,其全面的索引允许更可扩展的服务器响应,而无需频繁查询 Bitcoin Core。64 位操作系统对于实现最佳性能至关重要。

Electrs:索引速度最快(1 天),这归功于其更小、更简单的索引以及优化的区块检索和解析。这种速度是有代价的:它必须在运行过程中重新解析区块,这可能会影响深度钱包的性能。

Fulcrum:索引建立时间适中(2-3 天),建立的索引比 ElectrumX 稍大,但速度更快。其资源密集型流程得益于低级语言的实现。"... 快速同步 选项可进一步提高索引速度。由此产生的综合索引可带来出色的运行性能。

每种实现方式都在索引时间、索引大小和运行效率之间进行了权衡,以满足不同的使用情况和硬件能力。

测试

该基准评估了 Sparrow 使用大型钱包(约 3000 个已用地址)进行的两种常见服务器负载:

  1. 初始钱包加载:重点是地址订阅,它允许 Sparrow 接收地址交易的更新。 重要的是,每个订阅请求都会返回影响该地址的所有交易 ID 和区块高度的哈希值。 测试测量订阅所有钱包地址的时间。
  2. 钱包刷新:模拟在手动刷新过程中检索所有钱包数据(交易和区块),这在通信问题导致不良数据时是必要的。地址订阅已为该测试准备就绪。

主要测试参数:

  • 拥有 ~3000 个常用地址的大型钱包
  • 所有服务器的批处理页面大小为 50
  • 测量初始加载的订阅时间
  • 测量钱包刷新的数据检索时间

这种方法对不同的 Electrum 服务器实施进行了全面的性能比较,重点关注 Sparrow Wallet 的实际使用场景。

测试 1:初始加载(地址订阅)

测试 冷启动 运行 1 运行 2 运行 3
ElectrumX 52655 毫秒 40721 毫秒 54143 毫秒 49011 毫秒
电工 322386 毫秒 393303 毫秒 384036 毫秒 427722 毫秒
支点 2333 毫秒 1413 毫秒 1472 毫秒 1413 毫秒
  • 支点最快(平均 ~1660 毫秒)
  • ElectrumX: 中等(平均 ~49,133 毫秒)
  • 电子设备:最慢(平均 ~381,862 毫秒)

在初始钱包加载方面,Fulcrum 的性能是 ElectrumX 的 22 倍,是 Electrs 的约 300 倍。

测试 2:钱包刷新(数据检索)

测试 冷启动 运行 1 运行 2 运行 3
ElectrumX 114466 毫秒 66175 毫秒 80133 毫秒 75489 毫秒
电工 17562 毫秒 11621 毫秒 11219 毫秒 11521 毫秒
支点 14152 毫秒 7854 毫秒 7382 毫秒 7442 毫秒
  • 支点:最快(平均 ~9,208 毫秒)
  • 秒秒(平均 ~12 981 毫秒)
  • ElectrumX: 最慢(平均 ~84,066 毫秒)

在钱包刷新方面,Fulcrum 比 ElectrumX 快 8 倍,比 Electrs 快 1.5 倍。

在这两项测试中,Fulcrum 始终表现出卓越的性能,在初始加载方面优势明显,在钱包刷新方面保持优势。ElectrumX 在加载方面表现一般,但在刷新方面却很吃力。Electrs 虽然在初始加载方面速度较慢,但在刷新方面表现出了竞争力。

讨论

Sparrow Wallet 依靠 Electrum 服务器协议进行交易数据管理。本文档比较了标准硬件上全索引 Electrum 服务器实现的性能,重点是配备 8GB 内存和 1TB 外置 USB 固态硬盘的 Raspberry Pi 4。它考察了 ElectrumX、Electrs 和 Fulcrum 实现。

ElectrumX,维护在 https://github.com/spesmilo/electrumx在测试硬件上建立 75GB 的索引需要一周时间,并且需要在 Bitcoin Core 上启用 txindex。Electrs,专为个人使用而设计 https://github.com/romanz/electrs,无需 txindex 即可在 12-24 小时内建立 32GB 的索引。支点 https://github.com/cculianu/Fulcrum 可在 2-3 天内建立 102GB 的索引,需要使用 txindex,并提供预编译的二进制文件。

测试使用了一个大型钱包(约 3000 个地址)来测量初始加载(地址订阅)和钱包刷新(数据检索)。结果显示,Fulcrum 的性能明显优于其他公司,在初始加载方面,Fulcrum 比 ElectrumX 快 22 倍,比 Electrs 快 300 倍;在刷新方面,Fulcrum 比 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为大多数用户提供了最佳平衡。

结论

这项基准测试显示,Fulcrum 是 Sparrow Wallet 用户的最佳 Electrum 服务器实施方案。

尽管与 Electrs 相比,Fulcrum 的初始索引时间稍长,但其综合索引具有卓越的可扩展性和性能。

随着钱包深度的增加和存储成本的降低,Fulcrum 在查询速度、可靠性和硬件寿命方面的优势超过了其所需的较大磁盘空间。

虽然 Electrs 可能适合磁盘空间非常有限和钱包深度较小的情况,但 Fulcrum 被推荐为 Sparrow 的理想服务器,可为大多数用户提供性能和资源利用率的最佳平衡。

技术说明
Electrum 服务器中的高效地址索引涉及战略性数据存储技术。Fulcrum 和 ElectrumX 使用脚本哈希密钥(分别为 32 字节和 11 字节)来映射交易编号 (tx_num).这 tx_num 代表区块链中的交易顺序,是一个紧凑的标识符。这些系统维护着一个 txids 下令 tx_num可快速 txid 检索。它们还保留了一个内存阵列,将区块高度映射到累计交易次数,从而实现了快速的区块高度查询。这种方法可以换取更多的存储空间(例如,ElectrumX 额外的 21GB 存储空间用于 txid 与 Electrs 的最小存储方法相比,Fulcrum 和 ElectrumX 的查询性能明显提高。这种设计说明了数据库工程中存储效率和查询速度之间的平衡,Fulcrum 和 ElectrumX 优先考虑的是性能而不是存储经济性。