# 4 - 머클트리(Merkle Tree) 및 머클루트(Merkle Root)에 관한 정의
안녕하세요. 어미새입니다.
저번 포스팅에서는 블록체인 기술이 무엇인지, 블록의 구조는 어떻게 구성되어 있는지에 대해서 간략하게 알아봤습니다. 저번 포스팅 내용을 요약하면 아래와 같습니다.
- 블록체인은 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조이다.
- 블록체인에서 사용되는 '블록'은 일정 시간마다 여러 건의 거래내역을 하나의 블록으로 나타내며, 블록체인의 원소 역할을 수행한다.
- 블록의 구성요소는 크게 블록 헤더와 블록 바디로 나눌 수 있다.
- 블록 체인은 이전에 생성된 블록과 새롭게 생성된 블록을 체인처럼 계속적으로 연결하는 데이터 구조를 의미한다.
혹시 이전 포스팅을 읽지 않으셨던 분은 읽고 오시는걸 추천 드립니다!(내용이 이어지거든요~)
https://steemit.com/kr/@yahweh87/3
이번 포스팅에서는 지난 시간에 이어서 블록헤더 정보 중 '머클루트'에 대해 심도있게 이야기 해보겠습니다. 특히 '머클루트(Merkle Root)'의 값은 어떻게 생성된 값이고 실제로 어떻게 구하는지에 대해서 포스팅할 예정입니다.
이번 포스팅의 이해를 위해서는 반드시 해시함수에 대한 이해가 필요합니다. 혹시 해시함수에 대해서 잘 모르시는 분은 아랫글을 먼저 읽어주세요~ 아주 쉽게 잘 정리해놨습니다!
https://steemit.com/kr/@yahweh87/2
'머클트리(Merkle Tree)' 와 '머클루트(Merkle Root)'
'머클루트(Merkle Root)'란 블록체인의 원소 역할을 수행하는 블록의 부분에 저장된 트랜잭션들의 해시트리라고 생각하시면 되겠습니다.
'머클트리(Merkle Tree)' 혹은 '해시트리(Hash Tree)'라는 데이터 구조는 Ralph Merkle이라는 사람이 1979년에 특허를 낸 개념입니다. 머클트리의 목적은 빠른 검색이 아니라 데이터의 간편하고 확실한 인증을 위해 사용합니다.
저번 포스팅을 통해서 블록의 구조는 크게 블록헤더와 블록바디 정보로 구성된다고 설명드렸습니다.
그리고 블록의 바디정보는 각 거래정보인 트랜잭션들의 정보로 구성이된다고 설명드렸습니다.
이렇게 블록의 바디정보에 저장된 트랜잭션의 정보들이 유효한지 빠르게 검사하기 위한 역할을 수행하는 것이 '머클루트' 정보가 되겠습니다.
그럼 머클 트리는 어떻게 구성되고 최종적으로 머클루트는 어떻게 만들어질까요?
- 최초 데이터를 SHA256 형태의 해시값으로 변환한다.
- 가장 가까운 노드 2개를 한쌍으로 묶어 합친 후 해시값으로 변환한다.
- 계속해서 해시값으로 변환하여 마지막 하나가 남을때까지 이 과정을 반복한다.
위의 그림처럼 각 해시된 결과값 TXID의 노드를 2개씩 짝지어 합친 후 다시 SHA256 함수를 통해 해시 값으로 변환하고 최종적으로 하나의 결과 값이 나올때 까지 이 과정을 계속해서 반복합니다. 최종적으로 남은 하나의 노드 값이 '머클루트' 결과 값이 되는겁니다!
자 여기서 다시 한번만 정리해보겠습니다.
- 블록헤더의 머클루트 값은 블록바디의 거래내역 정보인 TXID의 해시트리 결과 값이다.
- 머클루트의 역할은 각 거래 정보의(TXID)의 정보들이 변경되었는지에 대한 유효성을 검사하는 역할을 수행한다.
- 머클루트의 결과 값을 통해 블록 해시의 정보가 구성됨으로 그 블록의 유효성 또한 검사할 수 있다.
3번의 내용은 추후 블록해시(Block Hash)편에서 자세히 다루도록 하겠습니다.
조금은 이해가 되셨나요?
저는 블록체인 전문가도 아니고 이제 막 블록체인 기술에 대하여 학습하고 공부한 내용을 포스팅 하고 있습니다.
그렇기 때문에 이렇게 포스팅을 마무리 할 수 없었습니다. 실제 블록의 모습과 블록바디에 저장된 거래내역의 TXID 정보 그리고 이 TXID를 해시트리한 결과 값인 머클루트의 값이 정말 그렇게 계산되는지 확인해보겠습니다.
지금부터 실제 머클루트의 값을 구하는 과정을 확인해기 위해서는 실제 생성된 블록의 정보를 눈으로 쉽게 확인할 수 있는 방법이 필요합니다. 다행이도 비트코인의 블록정보를 쉽게 볼 수 있도록 제공해주는 사이트가 있습니다.
'블록체인 인포' (https://blockchain.info/ko) 라는 사이트입니다. 꼭 접속해서 여러분들도 정보를 확인해 보았으면 좋겠습니다.
블록체인 인포 사이트에 들어가시면 가장 최신 블록의 정보가 표시됩니다. 제가 보고 있는 현 시점에서 블록체인 인포 사이트의 최신블록의 이름(블록 높이)는 #508186 입니다.
자 그러면 최신 블록인 #508186을 선택(클릭)하여 해당 블록의 정보를 자세히 살펴보겠습니다.
말로만 들었던 비트코인의 블록 정보를 확인해 볼 수 가 있습니다. 각 해당 요소들에 대한 설명에 대해서는 추후 계속적인 포스팅에 대해서 설명해 드리겠습니다. 이번 시간에 필요한 머클루트 정보는 빨간색으로 표시된 부분입니다. 여러분들도 확인해 보셨나요?
그럼 스크롤을 조금 더 내려 블록바디라고 표현한 각 거래정보 즉 TXID 정보를 확인해보겠습니다.
해당 블록에 정말 거래 내역이 많았군요. 거래수는 2271건입니다. 이번 포스팅에서 머클루트의 값을 직접 구해보는 것이 목적입니다. 그런대 2271번의 해싱질을 하기에는 너무나 많은 거래내역이군요. 거래내역이 2건 내지 4건인 블록을 한번 찾아보겠습니다!
#99997번째 블록이 딱 거래내용이 2건 있었습니다.
블록#99997의 Merkle Root는 '5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e'입니다. 그리고 거래내용은 아래와 같습니다.
앞서 설명드린 것 처럼 TX1, TX2의 합산한 값을 SHA256으로 변환하는 코드를 짜고 그 결과 값을 확인해보면 되겠죠?
제가 이해한 것 처럼 거래내용1번과 거래내용2번의 합산한 값을 SHA256방식으로 변환하였습니다!
결과 값을 볼가요?
응? 왜죠?ㅠㅠ
분명히.. 인터넷에 있는 모든 자료를 취합해서 이해했다고 생각했습니다만..
가장 가까운 노드부터 합산하여 계속적으로 SHA256으로 변환하면.. 머클루트라고.. 그런데 결과는 와장창..
여러분은 알고 계셨나요?? 머클루트는 이렇게 구하는게 아니라는걸요??
열심히 또 찾아본 결과 머클루트의 결과 값을 정확하게 구하기 위해서는 엔디안이라는 개념이 필요합니다. 저도 명확한 개념정리가 되어 있지 않아 이번 포스팅에서는 엔디안의 개념에 대해 언급하지 않겠습니다. 추후 정확하게 조사 후 포스팅하겠습니다.
자 그럼 머클루트를 정확하게 구하는 코드를 구현해보겠습니다.
위의 변경된 코드 처럼 4번의 정제 과정을 통해야지만 정확한 머클루트의 값을 구할 수 있습니다. 그럼 위의 코드를 실행하여 해당 블록의 머클루트값과 비교해보겠습니다.
드디어 블록의 바디 정보인 TXID 정보를 이용하여 머클루트 결과 값이 만들어졌다는 사실을 확인해 볼 수 있었습니다. 다음 포스팅에서도 계속해서 비트코인의 블록 헤더 정보들에 대한 심도있는 포스팅을 진행하도록 하겠습니다.
지금까지 긴 글 읽어주셔서 감사합니다!
P.S
- 혹시 머클루트의 값을 구하는 연산 과정에 대해서 명확하게 알고 계시는 분이 있다면 설명좀 부탁드리겠습니다!
- 혹시 이 글을 읽고 테스트를 진행하고 싶은 개발자를 위해 PHP로 작성된 머클루트 구하는 소스 자료를 첨부해드립니다. (http://learnmeabitcoin.com/code/merkleroot.php.txt)
다음편 보기 / #5 - 블록해시에 관한 정의
(https://steemit.com/kr/@yahweh87/5)
[참고자료]
https://steemit.com/kr/@jayground8/hashmerkleroot
https://steemit.com/kr/@jsralph/merkle-trees
https://steemit.com/kr/@twinbraid/5uzvbu-02
http://twinbraid.blogspot.kr/2017/11/blog-post.html
https://blockchain.info/ko/block/
한번 구현해 보고 싶은 생각은 있으나,
몸이 따르지 않네요. ^^
나중에 시간나실때 한번 해보시면 좋을 것 같습니다! (저는 아직 초보라서 구현하는데 엄청 오랜 시간이 걸렸습니다 ㅠㅠㅋ)
정성 가득한 글이네요~ 저처럼 깊게 공부하고싶은 사람한테 안성맞춤입니다. 감사드립니다^^
넵 감사합니다~ 저도 이제 막 공부를 시작한 초보라서 글에 오류가 있을 수 있습니다!
계속적으로 공부하고 공부한 내용 포스팅해서 공유할 예정입니다~
그리고 틀린 부분이 있었다면 수정해 나가겠습니다 ^^;
올려주신 글 다 읽어봤습니다! 몇가지 궁금한게 있는데요.
감사합니다!!
답변이 조금 늦었네요! 올바른 답변이었는지는 잘 모르겠네요 하하;;
답변감사드립니다~ ㅎㅎ 머클트리가 개인적으로 궁금했는데 재밌네요. 머클트리가 블록내에 꼭 필요한 정보인지 곰곰히 생각해볼 수 있게된거같아요
도움이 되셨다니 정말 다행입니다!
내일쯤엔 블록해시 정보에 대해서 심도있게 이야기해볼 생각입니다!
아마 내일 포스팅 내용을 보신다면 조금 더 이해하는데 도움이 될 것 같습니다 ^^;
대화에 껴서 죄송합니다:)
승재님 2,3번 질문에 답이 될 지 모른다는 생각에 댓글을 답니다.
각 각 의 트랜잭션 바디에는 scriptPubKey와 scriptSig가 들어있습니다.
B -> A라는 사람에게 전달했을때, 거래가 이뤄지고 나면 해당 output(utxo)마다 Locking script로 잠겨서 소유권이 넘어가게 되는데,
A가 다시 이것을 사용하려면는 사용하기 위해서는
A의 utxo에 해당되는 scriptSig(개인키로 생성된 서명)를 입력해서 둘이 일치하는지(잠궈둔 서명을 해체하면서)를 확인해서 소유권을 입증해야합니다..
.. 글로 설명하기 참힘드네요ㅠㅠ
트랜잭션이 이런 구조로 되어있다네요. 책에서 가져온건데 지금 바뀌었는지는 모르겠습니다..
와 친절한 설명 너무 감사합니다! 저도 트랜잭션 바디 정보에 대해서 자세하게 살펴봐야겠습니다!
seungjae1012 님께서 이 댓글을 꼭 보셨으면 좋겠네요!
아이 아닙니다ㅜㅜ 저도 설명하려니 제가 아는 것이 별로없구나 라고 느껴서 덕분에 다시 mastering bitcoin책 보기 시작했습니다:) yahweh님 덕분입니다
! 정말 잘정리되었네요 ㅎㅎ정성글 감사합니다!
mastering bitcoin 보면서 저는 공부했는데 고것도 참고해보시면 좋을것 같아요👍👍
학습하는데 도움이 되는 좋은 정보 감사합니다~ 꼭 구매해서 읽어봐야겠네요~!
구매하지 않아도 구글에 검색하면 pdf파일 있습니다. 무료로 공개해둔걸로 알고있습니다
오 그렇군요! 꿀팁 감사합니다!
좋은 글 잘 읽고갑니다~! 리스팀 해놓고 나중에 또 찾아보겠습니다 ㅎ
넵 감사합니다~!! 조금이라도 도움이 될수있다니 뿌듯합니다~^^;
아이고오.... 앞의 글까지는 어찌어찌했는데, "SHA256으로 변환하면.. 머클루트라고.. 그런데 결과는 와장창..여러분은 알고 계셨나요?? 머클루트는 이렇게 구하는게 아니라는걸요??" 여기서 맨탈이 나갔네요😂 어렵네요... 여러 번 읽으면 되겠죠??? 너무 고맙습니다~
넵~ 충분히 이해하실 수 있으세요!! 급하게 하시지 마시고 여러번 반복해서 보시면 반드시 이해하실겁니다!! 즐거운 연휴보내세요~
머클트리... 관련해서 궁금한 점이 몇가지 있지만,
최근에 읽은 인터넷 글 중 가장 알기 쉽게 설명되어 있는 글이네요!
계속 부탁해요~~
감사합니다:)
머클트리 또 보러오겠습니다. 감사합니다!