서버 성능

업데이트되었습니다: 업데이트: 1 Feb, 2022

Sparrow Wallet는 트랜잭션 데이터 관리를 위해 일렉트럼 서버 프로토콜에 의존합니다.

이 문서에서는 표준 하드웨어에서 다양한 전체 인덱스 일렉트럼 서버 구현에 대한 현재 성능 벤치마크를 제공하고, 이러한 결과를 바탕으로 두 가지 구현 방식에 대해 설명합니다.

배경

일렉트럼 서버는 비트코인 주소 인덱스 역할을 하며, 사용자가 특정 주소와 관련된 트랜잭션을 검색할 수 있도록 합니다. 이 기능이 없는 비트코인 레퍼런스 구현과 달리 일렉트럼 서버는 이 기능을 제공합니다. 컴팩트 블록 필터도 비슷한 정보를 제공할 수 있지만, 멤풀 트랜잭션을 지원하지 않으며 효율성이 떨어집니다.

일렉트럼 서버 프로토콜은 가장 널리 채택된 비트코인 주소 인덱스 프로토콜입니다. 이 벤치마크는 특정 지갑 정보를 서버에 저장하지 않기 때문에 개인정보 보호에 매우 중요한 전체 주소 인덱스에 초점을 맞춥니다. 최적의 콜드 스토리지 보안을 위해 모든 지갑 정보는 지갑 파일 내에 포함되어야 하며 지갑 폐쇄 후 서버에서 제거되어야 합니다. 이 접근 방식은 지갑 주소를 서버에 저장해야 하는 BWT 및 EPS와 같은 프로젝트는 제외됩니다.

동기 부여영구 링크

이 벤치마크는 제임슨 롭의 2020년 7월 성과 보고서를 기반으로 하며, 두 가지 주요 차이점이 있습니다:

  1. AWS 서버 대신 라즈베리 파이 4를 사용하므로 가정 사용자에게 더 적합합니다.
  2. 프로젝트의 최신 빌드를 사용하고 중요한 변경 사항이 발생한 후 다시 테스트합니다.

이 업데이트는 단일 보드 컴퓨터에서 자체 Electrum 서버를 실행하려는 Sparrow 사용자에게 특히 유용한 벤치마크로, 다양한 구현을 비교하고 자신의 필요에 가장 적합한 것을 선택할 수 있도록 해줍니다. 이 결과는 가정 환경에서 일렉트럼 서버를 자체 호스팅하려는 사용자에게 실질적인 인사이트를 제공합니다.

하드웨어

이 벤치마크는 개인정보 보호에 민감한 Sparrow 사용자에게 일반적인 하드웨어인 Ubuntu 21.10 64비트 OS를 실행하는 라즈베리 파이 4(8GB 모델)를 사용했습니다. 데이터 저장소는 비트코인 블록체인과 관련 인덱스의 크기(약 0.5TB)가 크기 때문에 HDD보다 선호되는 1TB 외장 USB SSD를 사용했습니다. 이 설정은 일반적인 가정용 사용자 구성을 반영하며, 유사한 싱글 보드 컴퓨터 설정에서 일렉트럼 서버를 자체 호스팅하려는 분들에게 관련 성능 데이터를 제공합니다.

프로젝트

ElectrumX

오리지널 일렉트럼 서버 프로젝트의 후속 프로젝트인 일렉트럼엑스는 2017년에 채택되었습니다. 원저자가 비트코인 블록체인 지원을 중단한 후, 일렉트럼 개발자들은 프로젝트를 포크하여 현재 다음에서 유지 관리하고 있습니다. https://github.com/spesmilo/electrumx.

일렉트럼엑스의 가장 큰 어려움은 테스트 하드웨어에서 약 1주일이 걸리는 초기 인덱스 구축입니다. 그러나 사용자는 더 강력한 컴퓨터에서 인덱스를 구축하여 단일 보드 컴퓨터로 전송할 수 있습니다. 요점

  • 현재 데이터베이스 크기: 75GB
  • 비트코인 코어에서 txindex를 활성화해야 합니다.
  • 사전 컴파일된 바이너리가 없습니다.
  • 테스트 버전: ElectrumX 1.16

일렉트럼엑스의 인덱스는 더 강력한 하드웨어에 구축하여 전송할 수 있어 컴퓨팅 리소스가 제한된 사용자들에게 유연성을 제공합니다.

Electrs

퍼블릭 서버가 아닌 개인용으로 설계된 Electrs는 일렉트럼X에 비해 스토리지 요구 사항은 낮지만 CPU 사용량은 더 높습니다. 다음에서 유지 관리됩니다. https://github.com/romanz/electrs.

Electrs의 주요 장점은 테스트 하드웨어에서 12~24시간밖에 걸리지 않는 빠른 인덱스 구축 시간입니다. 이러한 효율성 덕분에 대부분의 사전 구축 노드 패키지에서 선호되는 선택입니다. 요점

  • 현재 데이터베이스 크기: 32GB
  • 비트코인 코어에서 txindex가 필요하지 않습니다.
  • 사전 컴파일된 바이너리가 없습니다.
  • 테스트 버전: Electrs 0.9.4

인덱스 구축 시간이 현저히 짧고 데이터베이스 크기가 작기 때문에 Electrs는 특히 리소스가 제한된 하드웨어에서 개인용으로 사용하기에 매력적인 옵션입니다.

Fulcrum

최신 C++ 구현인 Fulcrum은 더 큰 디스크 공간 요구 사항에도 불구하고 높은 성능을 제공합니다. 유지 관리 https://github.com/cculianu/Fulcrum를 사용하면 인덱싱 속도와 운영 성능 간의 균형을 맞출 수 있습니다.

Fulcrum의 인덱싱은 테스트 하드웨어에서 2~3일 정도 소요되며, 빌드 시간에서 Electrs와 ElectrumX 사이에 위치합니다. 일단 인덱싱이 완료되면 뛰어난 성능을 제공합니다. 요점

  • 현재 데이터베이스 크기: 102GB
  • 비트코인 코어에서 txindex를 활성화해야 합니다.
  • Linux(x86_64 및 arm64) 및 Windows용 사전 컴파일된 바이너리 제공
  • 테스트 버전: Fulcrum 1.6.0

합리적인 인덱싱 시간과 뛰어난 운영 성능이 결합된 Fulcrum은 특히 대용량 스토리지 요구 사항을 수용할 수 있는 사용자에게 매력적인 옵션입니다.

일렉트로스-에스플로라

일렉트로스의 포크인 일렉트로스-에스플로라는 엔터프라이즈 성능 향상을 위한 추가 인덱스를 구축합니다. 그러나 높은 데이터 요구 사항(약 800GB)으로 인해 테스트 하드웨어에는 적합하지 않습니다. 요점

  • 매우 큰 스토리지 요구 사항(~800GB)
  • 다음에서 실행 가능 --lightmode 플래그를 사용하여 디스크 공간을 절반으로 줄입니다.
  • 라이트 모드에서도 최대 420GB 블록체인을 결합하면 1TB 드라이브가 거의 소진됩니다.

이 구현의 광범위한 스토리지 요구 사항은 일반적인 단일 보드 컴퓨터 설정을 초과하므로 대부분의 가정 사용자에게는 비현실적입니다. 기업용으로는 성능 이점을 제공하지만, 리소스 요구 사항으로 인해 개인 또는 소규모 배포에는 적용이 제한됩니다.

addrindexrs

추가 인덱스는 또 다른 일렉트릭스 포크로, 도조 백엔드에서 과거 거래 데이터 검색을 위해 사용됩니다. 이 벤치마크에 별도의 구현으로 포함할 만큼 성능과 관련된 중요한 변경 사항이 없습니다. 이 포크는 원래 Electrs 프로젝트와 유사한 특성을 유지하므로 이 맥락에서 성능 비교 목적으로는 중복됩니다.

인덱싱

인덱싱 성능은 세 가지 구현 방식에 따라 크게 다릅니다:

일렉트럼엑스: 파이썬의 단일 스레딩과 느린 블록 구문 분석으로 인해 가장 느린 인덱싱(1주일)을 제공합니다. 그러나 포괄적인 인덱스를 통해 비트코인 코어 쿼리를 자주 수행하지 않아도 서버 응답을 확장할 수 있습니다. 최적의 성능을 위해서는 64비트 OS가 필수적입니다.

Electrs: 가장 빠른 인덱싱(1일), 더 작고 간단한 인덱스와 최적화된 블록 검색 및 구문 분석으로 인한 것입니다. 이러한 속도에는 대가가 따르는데, 운영 중에 블록을 다시 분석해야 하므로 더 깊은 지갑의 성능에 영향을 미칠 수 있습니다.

Fulcrum: 중간 정도의 인덱싱 시간(2~3일)으로, ElectrumX보다 약간 더 큰 인덱스를 구축하지만 훨씬 빠릅니다. 리소스 집약적인 프로세스는 저수준 언어 구현의 이점이 있습니다. 그리고 빠른 동기화 옵션을 사용하면 인덱싱 속도를 더욱 향상시킬 수 있습니다. 그 결과 종합적인 인덱스를 통해 탁월한 운영 성과를 얻을 수 있습니다.

각 구현은 다양한 사용 사례와 하드웨어 기능에 따라 색인 시간, 색인 크기, 운영 효율성 간에 절충점을 제시합니다.

테스트

이 벤치마크는 대규모 지갑(~3000개의 사용 주소)을 사용하는 Sparrow의 두 가지 일반적인 서버 부하를 평가합니다:

  1. 초기 지갑 로딩: 주소 구독에 중점을 두어 Sparrow가 주소 거래에 대한 업데이트를 받을 수 있도록 합니다. 중요한 것은 각 구독 요청이 해당 주소에 영향을 미치는 모든 트랜잭션 ID와 블록 높이의 해시를 반환한다는 점입니다. 이 테스트는 모든 지갑 주소를 구독하는 데 걸리는 시간을 측정합니다.
  2. 지갑 새로고침: 통신 문제로 인해 데이터가 불량할 때 필요한 수동 새로고침 중에 모든 지갑 데이터(트랜잭션 및 블록)를 검색하는 시뮬레이션을 진행합니다. 이 테스트를 위해 주소 구독이 이미 시행되고 있습니다.

주요 테스트 매개변수:

  • 최대 3000개의 사용 주소가 있는 대용량 지갑
  • 모든 서버의 배치 페이지 크기 50개
  • 초기 로딩을 위한 구독 시간 측정
  • 지갑 새로 고침을 위한 데이터 검색 시간 측정

이 접근 방식은 Sparrow Wallet의 실제 사용 시나리오에 초점을 맞춰 다양한 Electrum 서버 구현에 대한 포괄적인 성능 비교를 제공합니다.

테스트 1: 초기 로드(주소 구독)

테스트 콜드 스타트 실행 1 실행 2 실행 3
ElectrumX 52655ms 40721ms 54143 ms 49011ms
Electrs 322386 ms 393303 ms 384036 ms 427722ms
Fulcrum 2333ms 1413ms 1472ms 1413ms
  • Fulcrum: 가장 빠름(평균 ~1660ms)
  • ElectrumX: 보통(평균 ~49,133ms)
  • Electrs: 가장 느림(평균 ~381,862ms)

펄크럼은 초기 지갑 로딩에서 일렉트럼엑스보다 22배, 일렉트르보다 약 300배 더 나은 성능을 보입니다.

테스트 2: 지갑 새로고침(데이터 검색)

테스트 콜드 스타트 실행 1 실행 2 실행 3
ElectrumX 114466 ms 66175 ms 80133 ms 75489 ms
Electrs 17562 ms 11621 ms 11219ms 11521 ms
Fulcrum 14152ms 7854ms 7382ms 7442ms
  • Fulcrum: 가장 빠름(평균 ~9,208ms)
  • Electrs: 초(평균 ~12,981ms)
  • ElectrumX: 가장 느림(평균 ~84,066ms)

펄크럼은 지갑 새로고침 속도가 일렉트럼X보다 8배, 일렉트르보다 1.5배 빠릅니다.

펄크럼은 두 테스트에서 일관되게 우수한 성능을 보여줬으며, 초기 로딩과 지갑 새로고침에서 우위를 유지했습니다. 일렉트럼엑스는 로딩 성능은 보통이지만 새로고침 성능은 다소 떨어졌습니다. Electrs는 초기 로딩 속도가 느리지만 새로 고침 성능에서 경쟁력이 있는 것으로 나타났습니다.

토론

Sparrow Wallet는 트랜잭션 데이터 관리를 위해 일렉트럼 서버 프로토콜에 의존합니다. 이 문서에서는 8GB RAM과 1TB 외장 USB SSD가 장착된 라즈베리파이 4를 중심으로 표준 하드웨어에서 전체 인덱스 일렉트럼 서버 구현의 성능을 비교합니다. 이 문서에서는 ElectrumX, Electrs, Fulcrum 구현을 살펴봅니다.

ElectrumX, 유지 관리 https://github.com/spesmilo/electrumx는 테스트 하드웨어에서 75GB 인덱스를 구축하는 데 약 일주일이 걸리며 비트코인 코어에서 txindex를 활성화해야 합니다. 개인용으로 설계된 일렉트릭스 https://github.com/romanz/electrs를 사용하면 txindex 없이도 12~24시간 내에 32GB 인덱스를 구축할 수 있습니다. Fulcrum https://github.com/cculianu/Fulcrum 는 2~3일 안에 102GB 인덱스를 빌드하고, txindex가 필요하며, 미리 컴파일된 바이너리를 제공합니다.

테스트는 대규모 지갑(최대 3000개의 주소)을 사용해 초기 로딩(주소 구독)과 지갑 새로고침(데이터 검색)을 측정했습니다. 테스트 결과, 초기 로딩에서 Fulcrum은 ElectrumX보다 22배, Electrs보다 최대 300배 더 빨랐으며, 새로고침에서는 ElectrumX보다 8배, Electrs보다 1.5배 더 빨라 다른 지갑보다 훨씬 뛰어난 성능을 보여주었습니다.

초기 로딩 시간(1.4초 대 6분)에서 Fulcrum과 Electrs의 성능 차이는 서로 다른 데이터 저장 방식에서 비롯됩니다. 일렉트르는 최소한의 데이터를 저장하기 때문에 지갑을 로드할 때마다 광범위한 블록 검색과 파싱이 필요합니다. 테스트 지갑의 경우 3.5GB의 블록을 반복적으로 처리해야 했기 때문에 단일 보드 컴퓨터에서 높은 CPU 부하와 잠재적인 응답 실패를 초래했습니다. 일렉트럼엑스와 펄크럼은 포괄적인 주소 인덱스를 유지하여 효율적인 데이터 검색을 가능하게 합니다. 이러한 접근 방식은 비트코인 코어의 트랜잭션 인덱스와 결합되어 펄크럼의 뛰어난 성능을 가능하게 합니다.

Fulcrum의 C++17 구현은 여러 플랫폼에서 일관된 속도를 제공하는 반면, ElectrumX의 Python 기반 아키텍처는 일관되지 않은 성능과 높은 CPU 사용량을 보였습니다. 이러한 결과는 일렉트럼 서버 구현에서 인덱스 크기, 쿼리 속도, 리소스 사용률 간의 절충점을 강조하며, 대부분의 사용자에게 가장 적합한 균형을 제공하는 것은 Fulcrum입니다.

결론

이 벤치마크는 Sparrow Wallet 사용자를 위한 최적의 일렉트럼 서버 구현으로 Fulcrum을 보여줍니다.

일렉트릭에 비해 초기 인덱싱 시간이 약간 더 오래 걸리지만, 펄크럼의 종합 인덱스는 뛰어난 확장성과 성능을 제공합니다.

지갑 깊이가 증가하고 스토리지 비용이 감소함에 따라 쿼리 속도, 안정성, 하드웨어 수명에서 Fulcrum의 이점이 더 큰 디스크 공간 요구 사항을 능가합니다.

일렉트릭은 디스크 공간이 매우 제한적이고 지갑 깊이가 작은 시나리오에 적합할 수 있지만, 대부분의 사용자에게 성능과 리소스 사용률의 최상의 균형을 제공하는 펄크럼이 Sparrow에 이상적인 서버로 권장됩니다.

기술 노트
일렉트럼 서버의 효율적인 주소 인덱싱에는 전략적인 데이터 저장 기술이 필요합니다. Fulcrum과 ElectrumX는 스크립트 해시 키(각각 32바이트와 11바이트)를 사용하여 트랜잭션 번호에 매핑합니다(tx_num). 이 tx_num 는 블록체인에서 트랜잭션의 순서를 나타내며, 간결한 식별자 역할을 합니다. 시스템은 다음과 같은 파일을 유지합니다. txids 주문자 tx_num를 사용하여 빠른 txid 검색을 지원합니다. 또한 블록 높이를 누적 트랜잭션 수에 매핑하는 인메모리 배열을 유지하여 블록 높이를 빠르게 조회할 수 있습니다. 이 접근 방식은 늘어난 저장 공간(예: 일렉트럼엑스의 추가 21GB와 txid 조회)를 사용하여 Electrs의 최소 스토리지 방식에 비해 쿼리 성능이 크게 향상되었습니다. 이 설계는 데이터베이스 엔지니어링에서 스토리지 효율성과 쿼리 속도 사이의 균형을 잘 보여주며, Fulcrum과 ElectrumX는 스토리지 경제성보다 성능을 우선시합니다.