현재 비트코인이 가진 가장 큰 문제 중 하나가 블럭체인의 크기 (현재 약 20G(?) 정도) 너무 커지는 것이고, 또한 거래가 늘어나면 그에 따라서 블럭체인의 데이터 크기가 더 빠르게 늘어나는 문제가 있다.
따라서, 이 문제를 해결하는 것이 비트코인이 해결해야 할 문제 중 하나이다.
먼저, 블럭체인은 헤더 부분(hash, ver, prev_block 등)과 거래데이터 부분(tx)으로 이루어지며, 전체 블럭 크기 중에서 거래 데이터 부분이 차지하는 크기는 약 90% 이상이고, 그 나머지 부분이 블럭 헤더 부분이 차지한다.
하지만 거래가 많이 이루어지면, 전체 블럭 중에서 거래 데이터 부분이 차지하는 비중이 더 커지게 된다.
블럭체인의 크기를 줄이는 방법은 왜 블럭체인이 필요한가를 이해하는 것에서 부터 출발한다.
블럭체인은 모든 거래에 대한 데이터를 가지고 있으며, 이는 바꿀 수 없는 특징을 가지고 있다.
결국, 블럭체인의 용도는 모든 거래 데이터를 확인하여 현재 특정 지갑주소에 얼마의 코인이 있는지를 알려주는 역할을 하는 것이다.
따라서 블럭체인의 크기를 줄이는 방법은 특정 블럭높이(block height) 또는 블럭체인 데이터의 크기가 일정한도를 넘을 때, 그때까지의 특정 지갑주소의 코인의 개수를 genesis(최초) 블럭부터 현재 블럭 높이까지 조사하여서, 모든 지갑주소와 코인 개수를 목록으로 기록하는 것이다.
이 블럭을 '코인목록 블럭'이라고 칭하기로 한다.
그리고 이런 코인목록 블럭을 일정한 주기로 만들게 된다.
이때, 코인목록 블럭은 기존의 블럭과 같이 블럭헤더 부분은 동일하고, 거래 데이터 부분(tx)에 코인을 가지고 있는 모든 지갑의 주소 및 코인의 개수를 목록으로 작성하여 기록하면 될 것이다.
블럭(block)에는 거래 데이터인 서명, 비밀키 및 개인키, 머클트리 등에 의해 발생된 데이터가 필요하며, 한개의 지갑주소에서 수백번의 거래가 있으면 수백개의 서명, 비밀키 등이 포함되어야만 한다.
하지만, 코인목록 블럭에는 특정 지갑주소(공개키)에서 몇백번의 거래가 있었다고 하더라도, 지갑주소 및 코인의 개수와 이에 대한 마지막 거래의 해쉬(txid)만을 가지고 있으면 되기 때문에 전체 거래의 데이터를 가지고 있는 것보다 크기를 크게 줄일 수 있다.
또한 특정 지갑주소에서 몇백번 거래가 있었다면 거래 데이터 부분(tx)에서 각각의 거래 데이터 보안을 위해 존재하는 머클트리 부분의 크기도 줄어들 것이다.
참고로 머클트리는 각각의 거래데이터 중 두개씩을 짝을 지어서 해쉬값으로 만들고 그 후 만들어지 해쉬값을 다시 두개를 합해서 하나의 해쉬값을 만들게 되어 최종적으로는 하나의 루트 머클트리 해쉬값을 만들게 된다.
이 루트 머클트리의 해쉬값이가 블럭헤더 부분에 mrkl_root에 포함되어 거래 데이터의 변조를 막게된다.
따라서 거래 데이터 부분(tx) 중에서 머클트리의 데이터량도 상당히 큰 편으로 거래수에 따라 다르지만 거래 데이터 부분 중 약 5~10%(?)를 차지할 것으로 추정해본다.(실제 계산은 안해보았음.)
이 경우, 지갑에는 genesis 블럭부터 가장 높은 블럭체인까지 전체 블럭체인의 모든 데이터를 모두 받을 수도 있거나 또는 최근의 코인목록 블럭부터의 데이터를 가지고 있도록 할지를 선택하는 버튼을 만들면 될 것이다.
참고로, 현재 비트코인을 가지고 있는 지갑주소는 약 몇백만개 정도로 추정되며 이를 통해서, 코인목록 블럭의 크기를 대략 추측할 수는 있다.
코인목록 블럭의 크기를 간략하게 계산해보자.
지갑 주소: 약 30바이트, 코인 개수 : 약 10바이트 및 이것의 해쉬: 약 20바이트 정도이므로,
여유롭게 하나의 지갑주소의 크기를 100 바이트라고 가정을 하고 코인을 가지고 있는 지갑주소가 약 500만개이면 코인목록 블럭의 크기는 대략 5,000,000 * 100 바이트 = 500,000,000바이트 => 약 500M 바이트로 크기가 굉장히 줄어든다.
그렇지만 비트코인 블럭의 경우 각 거래 데이터를 안전하게 보관하기 위해서 각 거래 데이터의 해쉬값을 다시 머클트리 방식으로 저장하게 되므로, 코인목록 블럭의 경우도 이를 위한 추가적인 보안 대책이 필요하므로 데이터 크기는 조금 더 늘어날 것으로 예상된다.
참고로, 지갑을 설치하고 지갑에서 싱크가 시작되면, 지갑은 genesis 블럭부터 가장 높은 블럭까지의 블럭 데이터를 순서대로 다운받게 되고, 이때 지갑 주소와 관련이 있는 거래내용을 읽어서 현재까지의 코인 개수를 표시하게 된다.
----------------------
Full node의 경우 처음 블럭부터 마지막 블럭체인을 다운 받으면서, utxo 목록을 만들게 됩니다.
결국, 예로 100번째 블럭이 새로 생성이 될 때 기존의 블럭체인에 utxo 블럭도 추가로 만들어 블럭체인에 올리면 됩니다.
하지만 이러면 하드포크를 해야 하는 문제가 생기므로, 사이드체인 형태 등으로 utxo 블럭을 만드는 것이 가능할 듯합니다.
비트코인이 블록체인 용량문제를 해결하지못하면 비트코인운 없어질것이라 생각하고있었는데
비트코인재단이 이에대해 얼마나 의지를 가지고 해결을 할지 궁금하네요.