# 4 - 머클트리(Merkle Tree) 및 머클루트(Merkle Root)에 관한 정의


main.png


안녕하세요. 어미새입니다.


저번 포스팅에서는 블록체인 기술이 무엇인지, 블록의 구조는 어떻게 구성되어 있는지에 대해서 간략하게 알아봤습니다. 저번 포스팅 내용을 요약하면 아래와 같습니다.

  1. 블록체인은 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조이다.
  2. 블록체인에서 사용되는 '블록'은 일정 시간마다 여러 건의 거래내역을 하나의 블록으로 나타내며, 블록체인의 원소 역할을 수행한다.
  3. 블록의 구성요소는 크게 블록 헤더와 블록 바디로 나눌 수 있다.
  4. 블록 체인은 이전에 생성된 블록과 새롭게 생성된 블록을 체인처럼 계속적으로 연결하는 데이터 구조를 의미한다.

혹시 이전 포스팅을 읽지 않으셨던 분은 읽고 오시는걸 추천 드립니다!(내용이 이어지거든요~)

@yahweh87/3


이번 포스팅에서는 지난 시간에 이어서 블록헤더 정보 중 '머클루트'에 대해 심도있게 이야기 해보겠습니다. 특히 '머클루트(Merkle Root)'의 값은 어떻게 생성된 값이고 실제로 어떻게 구하는지에 대해서 포스팅할 예정입니다.

이번 포스팅의 이해를 위해서는 반드시 해시함수에 대한 이해가 필요합니다. 혹시 해시함수에 대해서 잘 모르시는 분은 아랫글을 먼저 읽어주세요~ 아주 쉽게 잘 정리해놨습니다!

@yahweh87/2


'머클트리(Merkle Tree)' 와 '머클루트(Merkle Root)'


'머클루트(Merkle Root)'란 블록체인의 원소 역할을 수행하는 블록의 부분에 저장된 트랜잭션들의 해시트리라고 생각하시면 되겠습니다.

'머클트리(Merkle Tree)' 혹은 '해시트리(Hash Tree)'라는 데이터 구조는 Ralph Merkle이라는 사람이 1979년에 특허를 낸 개념입니다. 머클트리의 목적은 빠른 검색이 아니라 데이터의 간편하고 확실한 인증을 위해 사용합니다.


tree_root.png


저번 포스팅을 통해서 블록의 구조는 크게 블록헤더와 블록바디 정보로 구성된다고 설명드렸습니다.
그리고 블록의 바디정보는 각 거래정보인 트랜잭션들의 정보로 구성이된다고 설명드렸습니다.
이렇게 블록의 바디정보에 저장된 트랜잭션의 정보들이 유효한지 빠르게 검사하기 위한 역할을 수행하는 것이 '머클루트' 정보가 되겠습니다.

그럼 머클 트리는 어떻게 구성되고 최종적으로 머클루트는 어떻게 만들어질까요?

  1. 최초 데이터를 SHA256 형태의 해시값으로 변환한다.
  2. 가장 가까운 노드 2개를 한쌍으로 묶어 합친 후 해시값으로 변환한다.
  3. 계속해서 해시값으로 변환하여 마지막 하나가 남을때까지 이 과정을 반복한다.




root_1.png


위의 그림처럼 각 해시된 결과값 TXID의 노드를 2개씩 짝지어 합친 후 다시 SHA256 함수를 통해 해시 값으로 변환하고 최종적으로 하나의 결과 값이 나올때 까지 이 과정을 계속해서 반복합니다. 최종적으로 남은 하나의 노드 값이 '머클루트' 결과 값이 되는겁니다!

자 여기서 다시 한번만 정리해보겠습니다.

  1. 블록헤더의 머클루트 값은 블록바디의 거래내역 정보인 TXID의 해시트리 결과 값이다.
  2. 머클루트의 역할은 각 거래 정보의(TXID)의 정보들이 변경되었는지에 대한 유효성을 검사하는 역할을 수행한다.
  3. 머클루트의 결과 값을 통해 블록 해시의 정보가 구성됨으로 그 블록의 유효성 또한 검사할 수 있다.

3번의 내용은 추후 블록해시(Block Hash)편에서 자세히 다루도록 하겠습니다.


조금은 이해가 되셨나요?



저는 블록체인 전문가도 아니고 이제 막 블록체인 기술에 대하여 학습하고 공부한 내용을 포스팅 하고 있습니다.

그렇기 때문에 이렇게 포스팅을 마무리 할 수 없었습니다. 실제 블록의 모습과 블록바디에 저장된 거래내역의 TXID 정보 그리고 이 TXID를 해시트리한 결과 값인 머클루트의 값이 정말 그렇게 계산되는지 확인해보겠습니다.

지금부터 실제 머클루트의 값을 구하는 과정을 확인해기 위해서는 실제 생성된 블록의 정보를 눈으로 쉽게 확인할 수 있는 방법이 필요합니다. 다행이도 비트코인의 블록정보를 쉽게 볼 수 있도록 제공해주는 사이트가 있습니다.

'블록체인 인포' (https://blockchain.info/ko) 라는 사이트입니다. 꼭 접속해서 여러분들도 정보를 확인해 보았으면 좋겠습니다.

블록체인 인포 사이트에 들어가시면 가장 최신 블록의 정보가 표시됩니다. 제가 보고 있는 현 시점에서 블록체인 인포 사이트의 최신블록의 이름(블록 높이)는 #508186 입니다.


recent_block.png

자 그러면 최신 블록인 #508186을 선택(클릭)하여 해당 블록의 정보를 자세히 살펴보겠습니다.


block_info.png

말로만 들었던 비트코인의 블록 정보를 확인해 볼 수 가 있습니다. 각 해당 요소들에 대한 설명에 대해서는 추후 계속적인 포스팅에 대해서 설명해 드리겠습니다. 이번 시간에 필요한 머클루트 정보는 빨간색으로 표시된 부분입니다. 여러분들도 확인해 보셨나요?

그럼 스크롤을 조금 더 내려 블록바디라고 표현한 각 거래정보 즉 TXID 정보를 확인해보겠습니다.


block_sc.png

해당 블록에 정말 거래 내역이 많았군요. 거래수는 2271건입니다. 이번 포스팅에서 머클루트의 값을 직접 구해보는 것이 목적입니다. 그런대 2271번의 해싱질을 하기에는 너무나 많은 거래내역이군요. 거래내역이 2건 내지 4건인 블록을 한번 찾아보겠습니다!

#99997번째 블록이 딱 거래내용이 2건 있었습니다.


block_info_2.png

블록#99997의 Merkle Root는 '5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e'입니다. 그리고 거래내용은 아래와 같습니다.


block_info_2_1.png

앞서 설명드린 것 처럼 TX1, TX2의 합산한 값을 SHA256으로 변환하는 코드를 짜고 그 결과 값을 확인해보면 되겠죠?


block_info_2_2.png

제가 이해한 것 처럼 거래내용1번과 거래내용2번의 합산한 값을 SHA256방식으로 변환하였습니다!
결과 값을 볼가요?


block_info_2_3.png

응? 왜죠?ㅠㅠ


분명히.. 인터넷에 있는 모든 자료를 취합해서 이해했다고 생각했습니다만..
가장 가까운 노드부터 합산하여 계속적으로 SHA256으로 변환하면.. 머클루트라고.. 그런데 결과는 와장창..
여러분은 알고 계셨나요?? 머클루트는 이렇게 구하는게 아니라는걸요??



열심히 또 찾아본 결과 머클루트의 결과 값을 정확하게 구하기 위해서는 엔디안이라는 개념이 필요합니다. 저도 명확한 개념정리가 되어 있지 않아 이번 포스팅에서는 엔디안의 개념에 대해 언급하지 않겠습니다. 추후 정확하게 조사 후 포스팅하겠습니다.


자 그럼 머클루트를 정확하게 구하는 코드를 구현해보겠습니다.


block_info_2_4.png

위의 변경된 코드 처럼 4번의 정제 과정을 통해야지만 정확한 머클루트의 값을 구할 수 있습니다. 그럼 위의 코드를 실행하여 해당 블록의 머클루트값과 비교해보겠습니다.




block_info_2_5.png

드디어 블록의 바디 정보인 TXID 정보를 이용하여 머클루트 결과 값이 만들어졌다는 사실을 확인해 볼 수 있었습니다. 다음 포스팅에서도 계속해서 비트코인의 블록 헤더 정보들에 대한 심도있는 포스팅을 진행하도록 하겠습니다.


지금까지 긴 글 읽어주셔서 감사합니다!


P.S

  1. 혹시 머클루트의 값을 구하는 연산 과정에 대해서 명확하게 알고 계시는 분이 있다면 설명좀 부탁드리겠습니다!
  2. 혹시 이 글을 읽고 테스트를 진행하고 싶은 개발자를 위해 PHP로 작성된 머클루트 구하는 소스 자료를 첨부해드립니다. (http://learnmeabitcoin.com/code/merkleroot.php.txt)



다음편 보기 / #5 - 블록해시에 관한 정의
(@yahweh87/5)


[참고자료]

@jayground8/hashmerkleroot
@jsralph/merkle-trees
@twinbraid/5uzvbu-02
http://twinbraid.blogspot.kr/2017/11/blog-post.html
https://blockchain.info/ko/block/

H2
H3
H4
3 columns
2 columns
1 column
23 Comments