프로그래밍/블록체인

[해석서]Bitcoin: A Peer-to-Peer Electronic Cash System - 7. 디스크공간 회수

산을좋아한라쯔 2018. 4. 1. 22:47
반응형

 

7. 디스크 공간 회수

코인에 대한 가장 최근 거래가 충분한 수의 블록에 묻히면, 디스크 공간을 절약하기 위해, 그 거래 이전에 발생했던 거래들은 삭제해도 된다. 이미 계산된 블록 해시값이 훼손되지 않으면서 이러한 것이 가능하게 하도록, 거래들의 해시값으로 머클트리(Merkle Tree)를 구성하고[7][2][5], 블록의 해시에는 머클트리의 최상부 루트(root)만 포함되게 한다. 이렇게 함으로써 오래된 블록의 경우는, 트리의 일부 가지를 쳐 낼 수 있기에 크기가 작아질 수 있다. 자식 노드의 해시들은 저장될 필요가 없다.

     

거래데이터가 없이 블록헤더 단독으로는 크기가 80바이트이다. 만약 블록이 매 10분마다 생성한다고 가정하면, 80바이트 x 6 x 24 x 365 = 4.2MB 정도의 데이터가 매년 생성된다. 2008년 기준으로 했을 때 일반적인 컴퓨터의 메모리(RAM)2GB 정도이고, 무어의 법칙(Moore’s Law)에 따른다면 매년 1.2G정도씩 커질 것이기에, 블록헤더가 메모리에 로드되어야 한다고 가정하더라도 문제 될 것은 없을 것이다.

 

비트코인에서 하나의 블록은 약 2천개 정도의 거래가 모여서 이루어 집니다. 모든 거래내역에 대해 변경되지 않음이 보장되게 하기 위해 해시를 떠서 블록헤더에 기록해 놓고, 이전 블록의 해시값과  해당블록의 블록헤더를 입력값으로해서 블록해시를 구해나가면서 블록체인을 만들어가는 것이, 블록체인의 기본 사상입니다.   (아래 그림 참조)

 

 

 

그림에서 보듯이 모든 거래에 대한 해시를 "머클 루트"라는 명칭으로해서 기록하고 있습니다.

 

단순하게 거래의 무결성을 보장하려면, 모든 거래를 모아서 한번에 해시를 계산하고, 그 값을 보관하고 있으면 되겠습니다. 거래중 하나라도 수정이 되면 해시값이 틀려지게 되고, 만약 누군가가 거래를 조작하려한다면 새로 해시값을 계산해서 기록해야하는데, 그 해시값이 블록헤더에 저장되기에, 그 블록에 대한 해시값도 다시 계산해야하고, 이는 현재블록 이후의 모든 블록값에 대해 다시 해시값을 계산해야하는 사태가 벌어지는 것으로, 불가능하게 되는것입니다.

 

이처럼 거래모두에 대해서 단순하게 해시를 떠도 무결성은 보장되지만, 아주 오랜시간이 흐른 후, 이 블록에 있는 거래중 일부를 지워서 디스크공간을 줄이려할 때 문제가 발생할 수 있습니다. 즉, 거래중 일부를 지우면 그에 대한 해시가 달라지고, 이는 블록해시를 달라지게 하는 것이기에 불가능한 일입니다. 이처럼 일반적인 방법으로는 거래의 일부를 삭제할 수 없는데, 머클트리 방법으로 해시계산을 하면, 원래 목적하는 무결성도 만족하고, 향후 필요없는 거래를 삭제할 수도 있습니다.

 

머클 트리

머클 트리는 이진트리의 일종으로, 상위노드가 자식노드의 해시값으로 이루어진 트리입니다. 이 때 가장 가장 하단부 노드(자식노드가 없는 노드)들만 일반 데이터이고, 그 위 상위노드들은 자식노드의 해시값들로 구성됩니다.

 

이진 트리

이진트리는 컴퓨터 자료구조에서 매우 중요하게 다뤄지는 자료구조로, 최대 두 개의 자식노드를 가지는 자료구조입니다.

이렇게 구성하게되면, 아래 그림과 같이 부모노드와 자식노드간에 독특한 공식이 생깁니다. 즉, 부모노드의 번호를 a라고 한다면, 왼쪽 자식노드의 번호는 2a, 오른쪽 노드는 2a+1이 됩니다.

이런 특성들을 이용하면, 자료전체에서 특정한 값을 찾을 때 굉장히 빨리 찾을 수 있고, 자료의 일부를 추가하거나 삭제하더라도 그 구조를 유지시킬 수 있습니다.

 

비트코인에서 각 거래들을 가장 하위노드에 두고, 각 두개씩에 대해 해시를 구해서 상위노드를 만들고, 다시 그 해시들을 두 개씩 짝지어서 해시를 구하면서 노드를 구성해 나가면, 가장 상위단에 하나의 해시가 생길것이고, 이게 머클루트입니다.

이 값은, 전체 거래에 대해 해시계산을 한 것과 동일한 효과를 가지며 (하나라도 수정하면 값이 달라지는), 부수적으로 논문 그림에서 설명하듯이, 일부 거래값들을 삭제할 수도 있습니다.

극단적으로는, 머클루투값만 계산한 후 해당 거래들을 전부 삭제해서 블록을 구성 후, 그 블록들을 관리하는 것도 생각할 수 있는데, 실제로 비트코인에서는 이렇게 거래데이터는 없고, 머클루트를 포함한 블록헤더만을 가진 블록을, 모바일 폰 등 메모리가 부족한 기기를 사용하는 노드용으로 사용할 수 있게 하고 있습니다.   

 

-계속-

 

[전체 목차]

1. 서론  
2. 거래(1/2)  
2. 거래 (2/2)
3. 타임스탬프 서버 
4. 작업 증명 
5. 네트워크 
6. 인센티브 
7. 디스크공간 회수 
8. 지불 입증 간소화 
9. 금액의 결합과 분할 
반응형