Utreexo 어큐뮬레이터를 활용한 더 빠른 블록체인 검증

요약: 본 아티클에서는 100x 그룹의 개발자 장학금 수여자 캘빈 김 (Calvin Kim)이 Utreexo 클라이언트를 활용하여 비트코인의 초기 블록 다운로드(Initial Block Download; IBD)의 속도를 성공적으로 향상시킬 수 있는 연구 결과를 발표합니다. 속도 향상은 로컬 하드웨어와 병목현상에 따라 상이할 수 있는 반면, 초기 블록 다운로드와 검증은 비트코인 코어 대비 최대 62%가량 빨라질 수 있습니다. 아직 다수의 최적화가 실행되지 않았기 때문에, 이와 관련한 속도는 더 빨라질 수 있을 것으로 기대합니다. 캘빈은 IBD가 어떻게 여러 작업으로 나누어질 수 있으며, 이로 인하여 다수의 컴퓨터로 해당 작업을 실행할 수 있는지에 대하여 이야기하고 있습니다. 결국, 이와 같은 계획은 Utreexo를 C++에서 실행하고 비트코인 코어에 병합하기 위한 것입니다. 아직 갈 길이 많이 남아있지만 C++에서 실행하는 것은 이미 시작되어 왔습니다.

This image has an empty alt attribute; its file name is 1-1024x726.png

저는 Utreexo 프로젝트가 비트코인의 전체 블록체인 검증 과정이라 하는 초기 블록 다운로드 (Initial Block Download; IBD)의 속도를 향상하는 것에 대한 연구 성과를 발표할 수 있게 되어 기쁩니다. 저희는 저희가 btcd(Go로 작성된 비트코인 노드)를 포크한 utcd 기반의 비순차적 블록 검증 노드(Out of Order Block Validating Node) 알파 버전 도입을 완료했으며, 비트코인 코어 버전 21.0.0에 대하여 해당 노드를 기준으로 삼아왔습니다.

테스트 과정에서 사용자가 대역폭 제한이 없다는 것을 고려하였을 때, 비트코인 코어 버전 21.0.0 (디폴트 모드 환경) 대비 IBD를 약 62% 빠르게 진행 완료할 수 있었습니다. 저희가 아직 실행하지 않은 최적화가 더 많이 남아있기 때문에 IBD 속도 차이가 증가될 것으로 예상합니다. 또한, 저희의 비순차적 블록 검증 노드는 다수의 컴퓨터에서 IBD를 실행할 수 있게 하여, 현재 도입될 수 있는 다른 비트코인 노드 대비 독특한 장점을 제공하고 있습니다.

곧 게시될 별도의 아티클에서 Utrrexo 어큐뮬레이터에서 비순차적 블록 검증을 어떻게 실행할 수 있었는지를 설명할 예정입니다.

속도 향상이 왜 중요할까요?

IBD는 규칙 집행자로서 비트코인 네트워크에 합류를 위한 첫번째 단계입니다. 2009년에 생성된 제네시스 블록에서 오늘날에 생성된 블록을 아울러 모든 블록을 다운로드하고 검증하는 것에 대한 모든 과정이지요. 모든 블록 하나하나를 검증하는 작업은 다음과 같이 비트코인 네트워크의 합의 규칙을 깰 수 있는 유해 요소를 막기 위하여 매우 중요합니다:

1. 뜬금없는 코인 생성.
2. 비트코인의 최대 발행량 변경.
3. 타인의 코인 절도.

제3자의 노드(예: 거래소가 운영하는 노드, 제3자의 지갑 등)를 신뢰함으로써 비트코인 네트워크에 참여하는 것이 가능합니다. 하지만, 이와 같은 참여방식은 사용자, 그리고 전체 비트코인 네트워크 모두에게 해를 갈 수 있습니다. 사용자가 신뢰한 제3자가 사용자의 자금을 사취하여서 해당 사용자가 피해를 입을 수도 있습니다. 비트코인 네트워크의 규칙을 준수할 수 있도록 하기 위한 풀노드를 운영할 수 있는 충분한 사용자가 없을 경우, 규칙을 위반하는 사람이 비트코인 네트워크의 합의된 규칙을 위반하고 이와 같은 사실이 발각되지 않을 수 있기 때문에, 이와 같은 상황에서 전체 비트코인 네트워크는 역시 피해를 입을 수 있습니다. 규칙집행자로서 비트코인 네트워크 참여자의 역할은 사용자 본인의 보안과 네트워크 전체의 보안을 위하여 그 무엇보다 중요합니다. 규칙집행자로서 비트코인 네트워크에 참여하기 위해서 모두가 반드시 처음 완수해야 하는 과정이 IBD입니다.

그렇기 때문에 IBD가 비트코인 네트워크 참여자들이 규칙집행자로서 참여하기 위한 초기 장벽으로서 그 과정이 최소화될 경우, 비트코인 네트워크와 사용자 모두에게 상당한 이점을 제공합니다. 즉, 어떤 사람이든지 가능한 빠르고 쉽게 IBD를 완료하고 비트코인 네트워크의 규칙집행자가 될 수 있습니다. 현재 Utreexo 어큐뮬레이터 테스트 및 진행 상황에서는 규칙집행자로서 네트워크 참여하는 것에 대한 초기 장벽이 상당히 줄어들었음을 보여주고 있습니다.

벤치마크

다음과 같은 벤치마크에 기가비트 용량의 로컬 노드와 연결된 데이터를 처리하였습니다.

CPU Ryzen 3600
메모리 Samsung 32GB DDR4 2666MHz
용량 1TB HP SSD EX950 M.2 NVMe
비트코인 코어 버전 v21.0.0
리눅스 커널 버전 5.7.19
bitcoin.conf 설정 -dbcache=24000-maxmempool=1000

기가비트 접속 과정에서 utcd는 비트코인 코어 v21.0.0보다 약 36% 빠르게 IBD를 진행할 수 있었습니다. 현재 저희는 Utreexo Proof 캐싱을 utcd 내에서 실행하지 않았으며, utcd는 약 900GB 용량의 데이터를 다운로드 중입니다. 기가비트 접속 시, 이와 같은 과정은 최소 2시간가량 소요됩니다. 저희는 Utreexo 논문 원문을 통해서 Utreexo Proof가 캐싱하면 다운로드해야만 하는 데이터는 약 450-500GB임을 알고 있었습니다. 아래 그림은 저희가 Utreexo Proof 캐싱을 실행했을 때, 성능이 어떠할지를 시뮬레이션 하여서 동일한 장비에서 서빙 노드로 동일하게 진행한 IBD 테스트 결과를 보여주고 있습니다.


This image has an empty alt attribute; its file name is 3-1024x376.png
 
 

차트가 보여주듯이 속도가 약 62% 증가했습니다.

저희는 또한 두 노드 모두 전체 서명 검증을 적용한 노드로 기준을 잡았습니다.

This image has an empty alt attribute; its file name is 4-1024x377.png
 
 

전체 서명 검증으로 우리는 utcd가 약 15% 느려졌음을 확인할 수 있었습니다. 이는 작업과정의 약 80%을 차지하는 서명 확인이 병목현상을 발생시키기 때문입니다. 다음과 같은 프레임 그래프로도 이와 같은 내용을 확인할 수 있습니다.

This image has an empty alt attribute; its file name is 5-1-1024x272.png
 
 

utcd와 비트코인 코어 libsecp256k1에서 작업에 소요된 시간이 15% 증가된 것은 말이 되는데, C(cgo)를 호출한 Go가 무시할 수 없는 오버헤드를 보유하고 있기 때문입니다.

제가 진행한 테스트 과정에서 모든 서명을 검증할 때 Utreexo 어큐뮬레이터가 IBD 속도에 도움이 되지 못한 반면, 탭루트 환경에서는 말이 달라집니다. 탭루트는 (슈노르 서명의 특징으로 인하여) 하나의 블록 내 모든 서명이 배치 내에서 검증될 수 있게 하여, 서명 검증을 훨씬 빠르게 진행할 수 있도록 합니다. 이로 인해 시간이 지나면서 네트워크 병목현상이 디스크 접속으로 전향할 수 있도록 합니다. 이에 따라 Utreexo 어큐뮬레이터가 모든 서명이 검증될 때에는 도움이 되지 않더라도, 저희는 미래에 도움이 될 것이라고 믿고 있습니다.

또한, Utreexo 어큐뮬레이터는 사용자가 CPU에 많은 코어를 가지고 있어서, 디스크 접속으로 인하여 대신 병목 현상이 발생할 때 도움이 될 수 있기도 합니다. 하드디스크 드라이브에서 비트코인 노드를 운영하는 사용자는 디스크로 인한 병목현상 역시 발생함에 따라 속도가 빨라진 것을 확인할 수 있을 것입니다.

다양한 장비에서의 초기 블록 다운로드 벤치마크

작업을 동시에 진행하기 위하여 작업을 나누고 다양한 컴퓨터 리소스(CPU, GPU, 단일 CPU 코어 등)를 사용하는 것을 병렬 컴퓨팅(Parallel Computing)이라고 부릅니다. Utreexo 어큐뮬레이터를 도입하여서 사용자는 IBD를 여러 대의 컴퓨터에서 완료할 수 있습니다. 다양한 장비에서 IBD를 진행하기 위해 두 종류의 필수 요소는 조정자(coordinator)와 작업자(worker)입니다.

조정자의 역할은 어떤 블록이 검증되었는지를 계속해서 추적하는 것입니다. 그리고 작업자에게 아직 검증되지 않은 블록을 배정하지요. 작업자는 블록을 받아서 검증을 하고 해당 블록의 유효 여부에 대한 결과를 전송합니다. 이러한 과정은 네트워크 전체의 체인이 검증될 때까지 계속 진행됩니다.

이와 같은 과정에서 조정자는 하나만 필요하며, 해당 조정자는 여러 작업자가 임명할 수 있습니다.

This image has an empty alt attribute; its file name is 6-1024x639.png
 
 

조정자는 블록을 검증하면서도, 작업자의 역할을 수행하기도 합니다. 세 대의 작업자 컴퓨터가 조정자의 컴퓨터에 연결이 되어있고, 해당 작업자들은 조정자의 노드에 맞추어 블록을 검증합니다. 여기서 작업자들과 조정자들의 컴퓨터가 데스크탑 일 필요가 없다는 점이 중요합니다. 작업자와 조정자의 컴퓨터는 스마트폰을 포함해 모든 컴퓨터 장비가 될 수 있습니다.

This image has an empty alt attribute; its file name is 7-1024x657.png
 
 

다양한 장비에서의 IBD에 대한 잠재적인 사용 사례는 우리가 휴대전화나 노트북을 사용하지 않을 때 해당될 수 있습니다. 사용자는 밤에 자신의 휴대전화를 사용하여 라즈베리 파이 노드 동기화를 지원할 수 있습니다. 사용자의 가족 역시 여분의 컴퓨터 장비로 IBD를 마칠 수도 있습니다.

다음의 벤치마크는 IBD를 완료하기 위하여 두 대의 장비를 사용했을 때의 결과를 보여주고 있습니다.

장비 1

CPU Ryzen 3600
메모리 Samsung 32GB DDR4 2666MHz
용량 1TB HP SSD EX950 M.2 NVMe

장비 2

Macbook Pro M1 – 8GB Unified Memory (MacBookPro17,1)
This image has an empty alt attribute; its file name is 8-1024x428.png
 
 

저희는 두 대의 장비로 전체 서명을 비트코인 코어 V21.0.0보다 빠르게 확인하면서 IBD를 완료할 수 있었습니다.

더 많은 작업자 추가하기

다양한 장비에서의 IBD의 경우, 모든 작업자와 조정자 사이에서 작업을 조정하는 것이 필수적입니다. 이는 곧 완료되어야 하는 작업을 추가하는 것이지요. 이와 같은 작업 조정에 소요되는 시간량을 병렬 오버헤드(Parallel Overhead)라고 합니다. 만약 병렬 오버헤드에 오랜 시간이 걸린다면, 작업을 얼마나 병렬화 할 수 있는지에 대한 제한을 설정합니다.

비순차적 블록 검증에 대한 병렬 오버헤드는 헤더 다운로드입니다. 기가비트 접속 시간 동안, 헤더 다운로드에 4.403초가 소요됩니다. IBD에 대한 시간이 426분(모든 서명 확인에 관함)이 소요되기 때문에, 병렬화 될 수 있는 퍼센트는 99.982%입니다. 저희는 암달의 법칙에서 더 많은 컴퓨터를 사용했을 때, 최대 속도 향상에 대한 기대값을 살펴보기 위하여 이와 같은 정보를 활용했습니다.

속도 향상은 AMD Ryzen 3600 컴퓨터를 합리적으로 사용하면서 거의 완벽한 결과(장비 추가 한 대 당 1x가량 속도 향상)를 보였습니다. 아래 선형그래프에서 이와 같은 결과값을 보여주고 있습니다.

This image has an empty alt attribute; its file name is 9-1-1024x559.png
 
 

헤더 다운로드는 Utreexo 어큐뮬레이터와 함께 유일한 순차적인 부분으로, (다른 여러 것들 중) Check Sequence Verify와의 전송에 대한 Median Time Past를 제시해야만 합니다. 현재 도입 단계에서는 다양한 장비에서의 IBD에 사용된 모든 장비를 별도의 헤더 다운로드로 실행하고 있습니다. 저희는 모든 작업자들에 대한 헤더 다운로드를 제거하기 위하여 Utreexo 증명 안에 이와 같은 데이터를 입력하여서, 조정자만이 헤더 다운로드를 실행하게끔 하려는 계획을 가지고 있습니다. 이를 통해 속도를 높이고 더 많은 컴퓨터 리소스를 확보할 수 있을 것입니다.

비순차적 블록 검증의 한계

Utreexo 어큐뮬레이터를 활용한 IBD가 추가 전송 데이터(약 20%)를 필요로 하기 때문에, 사용자의 인터넷 속도가 이미 병목현상을 겪고 있을 때 IBD에 더 많은 시간이 소요되게끔 만들 수 있습니다. 하지만, 인터넷 연결이 병목현상을 겪고 있지 않으며 사용할 수 있는 대역폭을 20% 더 보유하고 있는 사용자의 경우, 해당 사용자들은 비순차적 IDO로 상당한 혜택을 받을 수 있습니다. Utreexo 어큐뮬레이터 연구에서 진척된 사항 또한 사용자가 다운로드해야 하는 추가 데이터를 상당량 낮출 수 있는 것입니다. 자세한 내용은 다음의 추후 연구 사항 섹션에서 다루도록 하겠습니다. 

추후 연구 사항

더 적은 Utreexo 증명
Utreexo 어큐뮬레이터 활용에 대한 가장 큰 부정적인 측면은 Utreexo 증명이 그다지 적지 않다는 것입니다. 아카이브 Utreexo 노드가 보관해야 하는 크기와 Utreexo 노드의 대역폭 사용량 모두를 증가시키지요. 볼튼 베일리(Bolton Bailey)수라나라야나 산카기리(Suryanarayana Sankagiri)의 최근 연구에서 Utreexo 증명을 함께 묶었을 때, 우리의 방식이 그다지 효율적이지 않음을 보여주고 있습니다. 베일리와 산카기리는 증명 크기를 4.6배까지 줄일 수 있다는 것을 보여주고 있습니다. 이들의 연구와 같이 크기를 줄이면, 보관 및 대역폭 사용량이 증가하는 것을 줄일 수 있습니다.

태지 드라이야(Tadge Dryja)는 이미 볼튼 베일리와 수라나라야나 산카기리의 연구 결과를 근거로 새로운 Utreexo 어큐뮬레이더 설계에 대한 초안을 기획해왔습니다. 저희는 올해 새로운 설계안을 도입할 예정입니다.

천리안 캐싱

Utreexo 연구 보고서에서 다루고 있는 기존 캐싱 알고리즘은 추가 다운로드 되는 데이터양을 20%까지 낮춥니다. 하지만, 저희는 이론적으로 최적화된 캐싱 알고리즘, 또는 천리안 캐싱 알고리즘(clairvoyant caching algorithm)을 활용하여 기존 캐싱 알고리즘보다 더 성능을 향상시킬 수 있습니다. 천리안 캐싱 알고리즘은 대부분 실행이 불가능한데, 이는 미래에 발생할 이벤트에 대한 지식이 필요하기 때문입니다. 하지만, IBD가 있다면, 저희와 교류하는 업계 동료들이 미래에 어떤 일이 발생할지 정확하게 알 수 있으며, 이에 따라 천리안 캐싱 알고리즘이 도입될 수 있게 됩니다. 천리안 캐싱 알고리즘 프로젝트는 현재 클레어 바오(Claire Bao)와 태지 드라이야(Tadge Dryja)가 추진 중입니다.

C++ 실행

Utreexo 프로젝트의 궁극적인 목표는 비트코인 코어 내 Utreexo 어큐뮬레이터의 기능성을 보유하는 것입니다. 하지만, 참조 Utreexo 어큐뮬레이터 코드베이스가 Go로 작성이 되었기 때문에, C++언어 환경에서 실행되기 위한 코드베이스가 작성 되어야만 합니다. 해당 프로젝트를 libutreexo라고 하며, 니클라스 괴제(Niklas Gögge)가 진행 중입니다. 니클라스는 또한 libutreexo로 비트코인 코어 포크를 진행 중으로, Utreexo 어큐뮬레이터가 비트코인 코어 코드베이스에 어떻게 맞출 수 있을지를 연구하고 있습니다.

필자의 주장 검증

제가 벤치마크를 작동할 때 사용하는 코드는 github.com/mit-dci/utcd에서 확인 가능합니다. 해당 깃허브 페이지의 rep 내 readme를 참고하셔서, 제가 본 연구에서 진행한 테스트를 동일하게 진행 해보시기 바랍니다.

결론

비트코인 블록체인의 전체 역사를 검증할 수 있는 능력은 사용자의 보안은 물론 비트코인 네트워크 전체의 보안을 강화함에 따라 그 무엇보다도 중요합니다. 저는 Utreexo 어큐뮬레이터를 통해 사용자가 이와 같은 검증 작업을 더 쉽게 할 수 있을 것이라고 믿습니다. 최종 사용자가 Utreexo 어큐뮬레이터를 실제 사용하기 전까지 아직 많은 작업이 남아있지만, 저희는 아주 오랫동안 이와 같은 연구를 처음부터 진행해왔습니다. 블록체인 검증을 더 빠르게 만들기 위하여 저희와 함께하고 싶다면, github.com/mit-dci/utreexo에 참여해 주시기 바랍니다.