Technology, Tutorials, for Developer, Klaytn Core

블록체인 데이터를 효율적으로 처리하고 관리하는 방법

Author: Klaytn Foundation Core Development Team

비트코인과 이더리움과 같은 블록체인이 계속 발전함에 따라, 생성되는 데이터의 양은 기하급수적으로 증가하고 있습니다. 이로 인해 전체 원장을 저장하고 트랜잭션을 검증하는 블록체인 노드에 저장 및 처리 문제가 발생합니다. StateDB Live Pruning과 같은 기술은 스토리지 요구 사항을 줄이고, 성능을 개선하여 노드가 효율적으로 운영될 수 있도록 도와줍니다.

이 가이드는 아래의 내용으로 구성되어 있습니다. 

  1. 증가하는 블록체인의 스토리지 요구사항
  2. 블록체인 스토리지에서 StateDB의 역할
  3. 기존의 Pruning(가지치기) 방식에 한계가 있는 이유
  4. Live Pruning을 가능하게 하는 Exthash 도입
  5. StateDB를 간결하게 유지하는 Live Pruning 
  6. 다양한 노드 유형에 대한 지속적인 최적화
  7. FAQ

증가하는 블록체인의 스토리지 요구사항

모든 블록체인의 핵심은 네트워크에서 발생한 모든 트랜잭션을 기록하는 원장에 있습니다. 이 원장은 합의와 트랜잭션 검증에 참여하는 노드에 분산되어 있습니다. 블록체인이 시간이 지남에 따라 더 많은 트랜잭션을 처리함에 따라 원장은 지속적으로 증가합니다.

예컨대, 비트코인 블록체인은 10분마다 거래 데이터가 포함된 블록을 추가합니다. 각 블록의 크기가 1MB이므로 매일 144개의 블록이 추가되어 하루에 총 144MB가 추가됩니다. 이 속도로 비트코인 원장은 매년 50GB 이상 증가합니다. 더 복잡한 데이터 구조와 스마트 컨트랙트 기능을 갖춘 이더리움 블록체인은 더 큰 블록 크기로 15초마다 1블록씩 더 빠르게 데이터를 생성합니다. 이로 인해 이더리움 원장의 크기는 매년 거의 두 배로 빠르게 확장되고 있습니다.

이 모든 데이터는 블록체인의 전체 사본을 보유한 풀 노드에 저장되어야 합니다. 2023년 중반, 비트코인 장부 크기는 500GB에 육박하며, 이더리움의 경우 이미 1TB를 넘어섰습니다. 이렇게 방대한 양의 데이터를 저장하는 것은 개별 노드 운영자에게는 비용이 많이 들고 기술적으로도 어려울 수 있습니다. 따라서 완전히 탈중앙화되고 독립적인 노드 인프라를 운영하는 것은 더욱 어려워졌습니다.

블록체인 스토리지에서 StateDB의 역할

이더리움이나 Klaytn과 같은 많은 블록체인 플랫폼에서 State Database(이하 StateDB)라는 핵심 데이터 구조는 상당한 저장 공간을 차지합니다. StateDB는 트랜잭션 검증에 필요한 계정 잔액, 컨트랙트 데이터, 블록체인 상태와 같은 중요한 정보를 보관합니다.

트랜잭션이 발생하면, StateDB는 최신 상태를 반영하기 위해 지속적으로 업데이트됩니다. 이는 계정 잔액 변경 및 계약 데이터 수정 등이 자주 발생함을 의미합니다. 

StateDB는 Merkle Patricia Trie(MPT) 구조를 사용하여 스테이트 데이터를 효율적으로 저장합니다. 하지만 데이터의 작은 변화에도 전체 MPT가 크게 변경된다는 단점이 있습니다. 연구에 따르면 하나의 노드가 업데이트되면 MPT에 10개 이상의 새로운 노드가 추가될 수 있습니다. 이렇듯, 기하급수적으로 증가하는 특성으로 인해 StateDB 크기가 빠르게 부풀어 오르게 됩니다. 따라서 전체 노드를 운영하는 검증자와 채굴자는 필요한 막대한 용량을 관리하기가 어렵습니다.

기존의 Pruning(가지치기) 방식에 한계가 있는 이유

계속해서 확장되는 StateDB의 스토리지 수요를 처리하기 위해 블록체인 개발자들은 오래되고 불필요한 데이터를 안전하게 삭제하는 Pruning, 즉 ‘가지치기’ 기술을 연구해왔습니다.

StateDB Offline Pruning와 같은 가지치기 방법을 사용하려면 노드 서버를 오프라인으로 전환하고, 데이터를 새로운 인프라로 마이그레이션하고, 블록체인을 다시 동기화해야 합니다. 이로 인해 블록체인 규모에 따라 몇 시간에서 길게는 며칠에 이르는 상당한 노드 다운타임이 발생합니다. 이러한 복잡한 조정 작업은 또한 빈번한 가지치기 작업의 실행 가능성을 제한합니다.

가지치기의 주요 한계는 MPT와 같은 데이터 구조가 노드 간에 공유된 중첩 데이터를 사용한다는 점입니다. 즉, 노드 A노드 B와 동일한 데이터를 참조할 수 있으며, 이러한 경우 노드 B를 무심코 삭제하면 노드 A에 복구 불가능한 데이터 손실과 손상이 발생할 수 있습니다. 다중 참조 데이터 관리의 이러한 어려움은 지금까지 효율적인 온라인 가지치기를 방해해왔습니다.

Live Pruning을 가능하게 하는 Exthash 도입

다중 참조 문제를 극복하기 위해 Klaytn 개발자들은 Exthash라는 수정된 해시 함수를 도입했습니다. Exthash는 일반 32바이트 해시에 7바이트 일련번호를 추가하는 방식으로 작동합니다. 이 일련번호는 고유 식별자 역할을 하여 동일한 데이터가 동일한 해시를 갖지 못하도록 방지합니다.

스테이트DB 전체에서 일반 해시를 Exthash로 대체하면 중복 참조를 제거할 수 있습니다. 이전에 노드 A가 동일한 해시를 사용해 노드 B에 연결되었다면, 이제 이 링크에는 고유한 Exthash 식별자가 포함됩니다. 나중에 노드 B가 가지치기 중에 삭제되더라도, 노드 A는 고유한 Exthash 값을 사용하기 때문에 영향을 받지 않습니다.

Exthash를 구현하기 위해 기존의 Merkle Patricia Trie 구조는 새로운 확장 해시를 사용하도록 개조되었습니다. 각 노드는 키-값 쌍을 나타내며, 여기서 키는 객체 해시이고 값은 실제 데이터를 저장합니다. 일반 해시 대신 Exthash를 사용하도록 해시 생성을 변경함으로써 중복성을 방지할 수 있습니다.

Exthash가 추가하는 7바이트 논스는 동일한 데이터에 대해서도 고유한 해시를 생성합니다. 예를 들어, 두 노드에 “Balance: 100″이 포함된 경우, 논스에 따라 Exthash 값이 달라집니다. 이제 노드 A는 충돌 없이 노드 B를 안전하게 참조할 수 있습니다. 나중에 가지치기 중에 B가 삭제되더라도 A의 링크는 그대로 유지되어 고유한 Exthash를 가리키게 됩니다.

공유 데이터를 안전하게 삭제할 수 있는 Exthash를 통해 이제 블록체인이 완전히 작동하는 동안 StateDB를 실시간으로 정리할 수 있습니다. 이는 기존의 오프라인 프루닝 기술에서 발생하는 다운타임과 복잡한 재동기화 문제를 제거합니다.

StateDB를 간결하게 유지하는 Live Pruning 

Klaytn은 1.11 버전에서 StateDB Live Pruning을 구현하여 오래된 StateDB 데이터를 자동으로 삭제할 수 있도록 했습니다. 기본적으로 최근 2일간의 StateDB 데이터만 유지되며, 그보다 오래된 정보는 주기적으로 정리됩니다.

이렇게 하면 활성 StateDB 크기가 일반적으로 150GB에서 200GB 범위에서 I/O 성능에 최적화된 상태로 유지됩니다. 전체 아카이브에 비해 스토리지 요구 사항이 크게 줄어들기 때문에, 전체 노드는 폭증하는 데이터로 인해 막히지 않고 원활하게 작동할 수 있습니다. 또한 StateDB가 작을수록 캐싱의 이점이 있어 다양한 블록체인 작업 속도를 높일 수 있습니다.

Exthash를 도입하면 7바이트 확장자를 생성하고 저장하는 데 약간의 오버헤드가 추가됩니다. 그러나 벤치마크에 따르면, Live Pruning으로 인한 스토리지 및 캐싱 향상으로 전체 시스템 효율성이 여전히 20% 이상 향상되는 것으로 나타났습니다.

저장 공간 외에도 StateDB Live Pruning은 노드 운영자의 대역폭도 절약해줍니다. 노드를 처음 동기화할 때, 최근 며칠 동안의 StateDB를 정리하여 다운로드해야 하는 데이터의 양을 최소화합니다. 따라서 전 세계의 참여자들이 노드를 더 쉽게 실행할 수 있습니다.

지속적인 분석은 최적의 가지치기 빈도와 기간을 결정하는 데 도움이 됩니다. 디스크 성능, 네트워크 속도, 노드 유형과 같은 요소는 이상적인 가지치기 구성에 영향을 미칩니다. 블록체인 데이터 특성이 발전함에 따라 시간이 지남에 따라 가지치기 매개변수를 조정할 수 있습니다.

다양한 노드 유형에 대한 지속적인 최적화

Live StateDB pruning는 최근 상태 데이터에 빠르게 액세스해야 하는 합의 및 유효성 검사 전용 노드에 가장 큰 가치를 제공합니다. 주로 분석을 위해 기록 데이터를 유지하는 것은 이러한 노드에 도움이 되지 않을 수 있습니다.

향후 작업에는 여러 스토리지 시스템에서 최신의 최신 데이터와 오래된 데이터를 효율적으로 분리하는 작업이 포함됩니다. 예를 들어, 저렴하고 느린 하드디스크는 분석을 위해 기록 데이터를 저장하는 반면, 빠른 SSD는 시간에 민감한 처리를 위해 최신 정보를 처리할 수 있습니다.

최근 블록에서 트랜잭션 데이터를 추출하는 것 등과 같은 폭넓은 최적화도 고려 중입니다. 트랜잭션은 별도의 스토리지로 옮기고 상태 변경 사항만 핫 스테이트DB에 보관할 수 있습니다. 라이브 프루닝의 효과가 입증됨에 따라 Klaytn 개발자는 다양한 노드 유형에 맞춘 추가 개선에 집중할 수 있습니다.

결론

블록체인 데이터가 시간이 지남에 따라 기하급수적으로 증가함에 따라 노드가 원활하게 작동하려면 효율적인 저장과 가지치기가 필수적입니다. Klaytn은 Exthash를 사용하여 중복된 공유 데이터 참조를 지능적으로 제거함으로써 지속적인 라이브 StateDB 가지치기를 가능하게 합니다. 이를 통해 검증에 필요한 최신 블록체인 데이터만 유지하여 노드를 경량화할 수 있습니다.

현재 진행 중인 연구는 유용성에 따라 핫 스토리지와 콜드 스토리지에서 데이터를 분리하여 가지치기를 더욱 개선하고 있습니다. 라이브 프루닝과 같은 혁신적인 솔루션을 통해 블록체인은 생성되는 엄청난 양의 데이터에도 불구하고 지속 가능하게 확장할 수 있습니다.


FAQ

블록체인의 StateDB란 무엇인가요?
– StateDB는 블록체인의 상태를 나타내는 계정 및 저장소 정보를 보관하는 데이터베이스입니다. 데이터를 구성하기 위해 Merkle Patricia Trie를 사용합니다.

블록체인의 StateDB는 왜 그렇게 커지나요?
– 트랜잭션이 발생하면 불변하는 StateDB는 시간이 지남에 따라 데이터를 축적합니다. 데이터를 변경하면 기본 트라이(trie) 구조도 확장됩니다. 이러한 기하급수적인 증가는 상당한 저장 공간을 소모합니다.

StateDB 라이브 프루닝은 어떻게 작동하나요?
– Exthash라는 새로운 해싱 알고리즘을 사용해 중복된 데이터 참조를 제거합니다. 이를 통해 블록체인이 정상적으로 작동하는 동안 오래된 StateDB 데이터를 안전하게 정리할 수 있습니다.

Exthash란 무엇인가요?
– Exthash는 해시에 7바이트 일련번호를 추가하는 대체 해싱 방식입니다. 이를 통해 각 해시 반복이 고유하도록 보장하여 키 중복 문제를 제거합니다.

StateDB 라이브 프루닝의 장점은 무엇인가요?
– StateDB를 작고 간결하게 유지하여 노드 성능을 개선합니다. 따라서 스토리지 요구량이 줄어들고 I/O 캐싱 성능이 향상됩니다. 또한, 안전한 공유 데이터 삭제를 가능하게 하는 Exthash 덕분에 블록체인이 완전히 작동하는 동안 원활하게 진행되므로 블록체인 다운타임을 유발하지 않습니다.