안녕하세요. 어미새입니다.
저번 포스팅에서는 해시함수에 대해 알아봤습니다. 저번시간 내용을 간략하게 정리해보면 아래와 같습니다.
해시함수
- 해시함수는 임이의 길이를 갖는 메시지를 입력받아 고정된 길이의 해시값을 출력하는 함수이다.
- 해시 함수를 사용하는 목적은 메시지의 오류나 변조를 탐기 위해, 즉 데이터의 무결성을 제공하기 위해 사용한다.
해시함수의 특징
- 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력 한다.
- 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)
- 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.
(@yahweh87/2)
이번 포스팅에서는 블록체인의 간략한 정의와 블록체인에서 사용되는 '블록(Block)', 블록을 구성하는 블록의 구성요소에 대해 간략하게 알아보겠습니다!
(이번 포스팅은 최대한 간략한 개요 정도만 설명할 예정이며 추후 계속적인 포스팅을 통하여 심도있게 각 구성요소를 알아볼 계획입니다.)
블록체인(Block-chain)
블록체인은 말 그대로 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조입니다. 블록체인에서 사용되는 '블록'은 일정 시간마다(비트코인의 기준으로 10분에 한 번씩 생성됩니다.)
즉 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결하는 데이터 구조를 의미합니다. 블록체인은 모든 거래 정보를 포함하는 거대한 분산 장부라고 할 수 있습니다. 블록체인은 분산되고, 독립 적이며, 공통 장부(원장, Ledger) 관리 기술이라고 할 수 있습니다.
그럼 본론으로 들어가서 블록체인에 구성요소인'블록(Block)'이 무엇인지 자세히 알아보도록 하겠습니다.
'블록(Block)이란 무엇인가?'
앞서 간략하게 설명드린 것처럼 블록은 블록체인의 원소 개념으로, 다수의 거래 정보의 묶음을 의미합니다. 블록에는 블록의 이름이 있습니다. 이 이름은 Height(높이)라는 용어로 표현되고 있습니다. 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다. 하지만 이 높이는 정확한 블록의 이름이 아닙니다. 블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보를 모두 합산한 후 SHA256으로 변환된 값입니다.
'블록의 구성요소'
블록을 구성하는 요소들은 여러 가지 요소들이 있습니다만 크게 2가지로 구분해보면 블록 헤더와 블록바디로 나누어볼 수 있습니다. 아래의 그림은 여러 가지 인터넷 자료들을 참조하여 만든 블록 구조 도입니다.
지금부터 블록 구성요소에 대해서 하나씩 간략하게 살펴보도록 하겠습니다. 이번 포스팅의 목표는 각 블록의 구성요소와 각요소들의 역할에 대한 개념 정리 정도만 되었으면 좋겠습니다.
(너무 깊이 있게 살펴보기엔 내용이 방대하기 때문에 자세한 내용은 구성요소 하나 하나를 재 포스팅하여 명확한 개념 정리를 하도록 하겠습니다.)
'블록 해시(Hash of the block)'
블록 해시는 쉽게 '블록'의 이름 정보라고 생각하시면 될 것 같습니다. 블록 해시는 블록의 헤더 정보인 버전, 이전 블록 해시, 머클 루트, 타임, bits, 논스 정보를 모두 더하여 합을 구한 후 SHA256으로 변환한 결과 값입니다.
위의 그림처럼 블록 헤더 정보(버전 + 이전 블록 해시+ 머클 루트 + 타임 + bits + nonce)의 합산 정보를 구한 후 SHA256으로 변환하면 블록의 블록 해시 값을 구할 수 있습니다.(여기서 합산한다는 의미 그리고 단순히 SHA256으로 변환해서는 정확한 블록 해시 값을 구하 수 없습니다.)
우선 개념적으로는 헤더 정보를 모두 합산하여 SHA256 변환하면 블록 해시 값을 추출할 수 있다고만 이해하시고 추후 합산하는 과정이나 블록해시의 자세한 설명은 따로 포스팅 하겠습니다.
'버전'
말 그대로 해당 블록의 버전입니다. 현재 이 블록 헤더를 만든 비트코인 프로그램의 버전 정보로 이해하시면 될 것 같습니다.
'이전 블록 해시(Previousblockhash)'
앞서 블록체인은 거래 정보의 묶음인 블록이 체인 형태로 연결되어 있다고 설명해 드렸습니다. 이름에서도 직관적으로 알 수 있습니다만 이전 블록 해시 정보는 이전 블록의 주소 값을 가리키는 요소입니다.
위의 그림처럼 각 블록의 헤더 정보에는 이전 블록의 해시정보를 가지고 있습니다. 각 블록이 이전 블록의 헤시 정보를 가지고 있기 때문에 각 블록이 서로 서로 연결되어 있는 구조가 될 수 있습니다.
'머클 루트(Merkle Root)'
'머클 루트'는 블록의 바디 부분에 저장된 트랜잭션(거래 정보) 들의 해시 트리라고 생각하시면 되겠습니다. 각 트랜잭션과 가까운 노드 끼리 쌍을 지어 해시 값을 구하여 최종적으로 구해진 해시 값이 머클루트 해시 값이 되겠습니다.
머클루트의 역할은 아래와 같습니다.
- '머클루트'(머클해시)값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증할 수 있다.
- '머클루트'(머클해시)값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록의 해시의 무결성도 함께 검증할 수 있다.
쉽게 말해 해당 블록이 유효한지에 대한 무결성을 검증하기 위한 요소가 머클루트 혹은 머클해시라는 구성요소입니다. (다음 포스팅에서 이 머클루트에 대한 개념을 정리 할 예정입니다!)
'타임(Time)'
해당 블록의 대략적인 생성 시간을 의미합니다. 타임 스탬프는 유닉스 기준일 자로 표시되며 1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 값입니다.
'bits'
bits는 난이도 해시 목표 값을 의미하는 지표입니다. 이 부분에 대해서는 마이닝 즉 채굴이 어떻게 이루어지는지에 대한 포스팅에서 자세히 다루도록 하겠습니다.
'Nonce'
난스는 블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할을 수행합니다. 이 부분에 대해서도 채굴과 관련된 포스팅에서 자세히 다루도록 하겠습니다.
위의 내용을 다시 한번 정리를 좀 해보면..
- 블록체인은 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조이다.
- 블록체인에서 사용되는 '블록'은 일정 시간마다 여러 건의 거래내역을 하나의 블록으로 나타내며, 블록체인의 원소 역할을 수행한다.
- 블록의 구성요소는 크게 블록 헤더와 블록 바디로 나눌 수 있다.
- 블록 체인은 이전에 생성된 블록과 새롭게 생성된 블록을 체인처럼 계속적으로 연결하는 데이터 구조를 의미한다.
지금까지 블록체인 기술 그리고 블록체인을 구성하는 블록 요소 및 블록 구조에 대한 간략한 개념정리를 해봤습니다.
다음 포스팅에서는 머클루트에 대한 포스팅을 할 예정입니다. 많은 관심 부탁드립니다!
긴글 읽어주셔서 정말 감사합니다!
다음편 보기 / #4 - 머클트리(Merkle Tree) 및 머클루트(Merkle Root)에 관한 정의
(@yahweh87/4-merkle-tree-merkle-root)
[참고 사이트]
http://hanaloum.blogspot.kr/2014/06/block-1_9584.html
https://www.slideshare.net/YechanAn/blockchain-77203988
http://blog.naver.com/PostView.nhn?blogId=renucs&logNo=220958282185&parentCategoryNo=&categoryNo=36&viewDate=&isShowPopularPosts=false&from=postView
https://homoefficio.github.io/2016/01/23/BlockChain-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90/
http://privacy.jiransoft.co.kr/%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%EA%B3%BC-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EA%B8%B0%EC%88%A0/
https://brunch.co.kr/@ppineapple17/1