1-1. 블록체인 기술 정의
이전글보기
2. 채굴방식(마이닝) POW, POS, DPOS 란?
3. 스마트 컨트랙트란(Smart Contracts)?
4. 퍼블릭 블록체인, 프라이빗(컨소시움) 블록체인 비교
5. 튜링 완전(turing-complete)이란?
블록체인(Blockchain)
블록체인은 최초의 블록(Genesis Block) 부터 시작해서 바로 앞의 블록에 대한 링크를 가지고 있는 링크드 리스트인 자료구조입니다. 다시말해 블록과 블록을 체인으로 이어준 형태입니다. 블록체인에서 사용되는 블록은 일정 시간마다 생성이 됩니다. (비트코인의 경우 10분에 한 번씩 생성)
즉 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결한 구조를 의미합니다. 블록의 집합체인 블록체인은 여러 노드에 걸쳐 분산되어 저장 및 관리되며 모든 거래 정보를 포함하는 거대한 분산 장부 또는 공통장부(원장: Ledger)관리 기술이라 할 수 있습니다.
블록(Block)
블록이란 블록체인의 원소 개념으로 다수의 거래정보의 묶음 을 의미합니다. 블록은 Height라고 불리고 있습니다. 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 탑의 형태로 구성된다고 생각하여 Height라는 말을 쓴다고 합니다. 하지만 이 Height는 정확한 블록의 이름이 아닙니다. 블록의 정확한 이름은 TXID 라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보를 모두 합산한 후 SHA256으로 변환된 값 입니다.
블록 구성요소
블록은 블록 헤더와 거래 정보, 기타 정보로 구성됩니다. 여기서 거래 정보와 기타 정보는 블록 바디라 볼 수 있습니다. 거래 정보는 입출금과 관련한 여러가지 정보를 가지고 있고 기타 정보는 블록 내에 있는 정보 중에서 블록 헤더와 거래 정보에 해당하지 않는 정보를 말하며, 블록 해쉬 계산에 사용되지 않습니다.
블록 구조
블록해시 (Block Hash)
블록 해시는 블록의 식별자 역할을 합니다. 블록 해시는 블록의 헤더 정보인 버전, 이전 블록 해시, 머클 루트, 타임, bits, 논스 정보를 모두 더한 후 SHA256으로 2번 변환한 결과 값입니다. 블록해시여서 블록 전체의 해시값으로 생각될 수 있지만, 블록 헤더를 해시한 값입니다.
블록 헤더 (block header)
블록 헤더는 version, previousblockhash, merklehash, time, bits, nonce 6개의 정보로 구성되어 있습니다.
- version: 소프트웨어/프로토콜 버전
- previousblockhash: 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬
- merklehash: 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값
- time: 블록이 생성된 시간
- bits: 난이도 조절용 수치
- nonce: 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가하는 계산 회수
버전 (version)
해당 블록의 버전입니다. 현재 이 블록 헤더를 만든 비트코인 프로그램의 버전 정보입니다.
이전블록해시 (previousblockhash)
이전 블록 해시 정보는 이전 블록의 주소 값을 가리키는 요소입니다. 각 블록의 헤더 정보에는 이전 블록의 해시값을 갖고 있기 때문에 아래의 그림과 같이 블록끼리 연결될 수 있습니다.
머클해시 (merkle hash)
머클해시는 블록의 바디 부분에 저장된 트랜잭션(거래 정보)들의 해시 트리입니다. 각 트랜잭션과 가까운 노드끼리 쌍을 지어 해시 값을 구하고 최종적으로 구해진 해시 값이 머클해시 값입니다. 머클해시 값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증할 수 있으며 머클해시 값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록해시의 무결성도 함께 검증할 수 있습니다. 쉽게 말해 해당 블록이 유효한지에 대한 무결성을 검증하기 위한 요소가 머클해시입니다.
아래의 그림은 머클해시와 블록해시를 구하는 과정을 나타낸 그림입니다.
완료된 거래정보의 변경이 사실상 불가능한 이유
거래 정보의 해시값은 해당 거래가 포함된 블록의 머클해시 계산에 입력값으로 사용되고, 머클해시는 블록 해쉬의 계산에 입력값으로 사용됩니다. 블록 해시는 다음 블록(A라 하면)의 previousblockhash 값으로 저장되며, previousblockhash은 A 블록의 블록 헤더 정보로서, A 블록의 블록 해쉬를 계산하는데 입력값으로 사용됩니다. 따라서, 거래 정보가 변경되면 merklehash가 변경되고, merklehash가 변경되면 블록 해쉬가 변경되고, 블록 해쉬의 변경은 다음 블록의 블록 해쉬 변경으로 연쇄적으로 이어지게 됩니다. 그리고 블록 해쉬는 작업 증명(PoW)의 해답(nonce값)을 찾아내야 구할 수 있으므로, 거래 정보를 변경한 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 합니다.
예를 들어, 블록 하나를 채굴하는데 평균 10분이 소요되고, 현재 총 블록 수가 약 40만 블록이라고 할때, 최초의 원조 블록인 Genesis 블록에 포함된 거래를 변경하면 약 400만 분, 약 7.6년의 시간이 소요됩니다. 만약 거래를 변경한다 해도 새로운 블록들이 평균 10분 마다 하나 씩 계속 생성되므로 예상 소요시간은 계속적으로 늘어나기 때문에 이를 모두 뒤집는 것은 사실 상 불가능합니다. 즉, 완료된 거래 정보를 변경하려면, 변경하려는 거래 정보가 포함된 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 하는데, 이는 많은 시간이 소요되고, 그 동안 다른 노드들에 의해 블록이 계속 추가되므로, 완료된 거래 정보의 변경은 현실적으로 사실상 불가능합니다.
타임 (time)
해당 블록의 대략적인 생성시간을 의미합니다. 타임 스탬프는 유닉스 기준일 자로 표시되며 1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 값입니다.
bits
bits는 난이도 해시 목표 값을 의미하는 지표입니다.
nonce
블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할을 수행합니다.
요약
- 블록체인은 블록과 블록을 연결한 구조
- 블록체인에서 블록은 여러 건의 거래내역을 가지고 있음
- 블록의 구성요소는 헤더와 바디로 나뉘어져 있음