비트코인의 기원
이 모듈에서는 비트코인의 기원에 대해 알아보고, 비트코인의 가장 기본적인 구성요소들인 블록체인의 블록과 머클 트리에 대해 공부하겠습니다. 비트코인은 2008년 가을, 익명의 개발자 또는 개발 단체인 사토시 나카모토에 의해 개발된 최초의 암호화폐 기반의 디지털 지불 시스템입니다. 비트코인은 분산 장부 기술을 사용하였는데 이것을 블록체인이라고 부르고 있습니다. 비트코인에서 처음 사용된 블록체인은 다음과 같은 특징이 있습니다.
첫째는 중앙 집중식 관리자가 없는 시스템입니다. 참여자들끼리 거래의 내용을 공유하고 거래를 인증하고 정보를 저장합니다.둘째는 모든 거래 내역과 역사가 공개됩니다. 기록된 데이터들은 수정할 수 없습니다. 그리고 강한 보안 방법으로 데이터들이 안전합니다.비트코인의 디지털 지불 시스템에는 총 코인 수가 제한되어 있습니다.
비트코인은 마이닝을 통해 발행함으로써 기존 통화의 인플레이션 및 디플레이션 문제를 해결하는 2,100만 개 비트코인 한도의 시스템입니다. 화폐는 일종의 ‘믿음’이 포함되어 있습니다. 현대 사회에서 통용되는 화폐들은 국가 혹은 은행이라는 신뢰할 수 있는 기관에서 그 ‘믿음’을 제공해줍니다. 하지만 디지털 세상에서 블록체인은 제삼자의 어떠한 개입 없이 믿음을 만들어낼 수 있습니다.
블록체인에서는 장부를 네트워크에 참여하는 모든 노드에 공개하고, 이 동일한 장부를 저장하도록 하여 ‘믿음’을 제공합니다. 블록체인은 모든 참여자가 공유하는 ‘하나의 거대한 분산 공개 장부’라고 할 수 있습니다. 비트코인에서는 어떤 장부가 공개되고 어떤 형태의 데이터들이 저장되는 것입니다.
비트코인에서 블록체인(분산 공개 장부)은 최초의 블록 0부터 제일 최근에 생성된 블록 N까지의 블록이 Linked list로 연결된 데이터 구조입니다. 이렇게 블록이 체인처럼 연결된 데이터를 모든 참여자가 저장하고 있는 것입니다. 그럼 비트코인에서 블록의 구조와 블록이 포함하고 있는 정보들에 대해서 좀 더 자세히 살펴보도록 하겠습니다. 블록은 공개 장부인 블록체인에 거래를 포함시키기 위해, 하나에 합쳐 놓은 컨테이너 데이터 구조입니다.
블록체인에서 데이터가 갱신되는 한 주기 또는 최소 단위라고 생각할 수 있습니다. 블록 헤더는 여러 개의 블록 메타데이터로 구성되어 있습니다. 이는 크게 3개의 그룹으로 나눠볼 수 있습니다. 첫째, 현재의 블록이 블록체인에 있는 이전 블록과 연결되어 있음을 나타내는 이전 블록의 해시값입니다. 블록은 해당 메타데이터를 이용해서 이전의 블록과 연결됩니다.
둘째, 머클 트리 루트입니다. 머클 트리 루트는 블록 내의 거래 전부를 효율적으로 요약하는 데 사용되는 데이터 구조입니다. 셋째, 타임 스탬프, 난이도, 그리고 난스는 채굴 경쟁과 관련이 있는 필드들입니다. Timestamp는 블록이 생성된 시간을 의미합니다. Proof-of-work(작업증명)는 새로운 블록을 블록체인에 추가하는 작업을 완료했음을 증명하는 것입니다.
새로운 블록을 블록체인에 추가하려면, 그 새로운 블록의 블록 해시를 계산해야 하고, 그 블록 해시를 계산해 내려면 블록 헤더 정보 중의 하나인 nonce 값을 계산을 통해서 구해야 합니다. 결국 새로운 블록의 nonce 값을 구하는 것이 작업증명이라고 이야기할 수 있습니다. Nonce는 PoW에서 사용되는 카운터 역할을 합니다. Difficulty Target은 Nonce를 찾는 작업 난이도를 조절하는 필드입니다. 이것은 nonce 값을 계산하는데 기준이 되는 특정 숫자를 나타내며, 비트코인 블록체인 전체에 걸쳐 동일하게 적용되는 숫자입니다.
블록의 구조
블록체인에는 블록 단위의 데이터가 체인에 포함되게 되는데, 우선 이 블록의 구조에 대해서 살펴보겠습니다. 블록은 공개 장부인 블록체인에 거래들을 포함시키기 위해, 하나에 합쳐 놓은 컨테이너 데이터 구조입니다. 블록체인에서 데이터가 갱신되는 한 주기 또는 최소단위라고도 생각할 수 있습니다.왜냐하면 트랜잭션 단위로 장부가 업데이트되지 않고 블록에 포함된 트랜잭션들이 블록체인에 한 번에 저장되기 때문입니다.
블록은 메타데이터를 담고 있는 헤더와 그 뒤에 블록 크기를 결정하는 거래내역(트랜잭션)들로 이루어져 있습니다. 따라서 우리는 블록을 크게 두 개의 부분으로 나눌 수 있습니다. 첫째는 블록 헤더이고, 다른 하나는 다수의 거래내역을 포함하는 블록 바디입니다.
블록 헤더의 크기는 80바이트인 반면 거래의 평균 크기는 최소 250바이트입니다. 평균적으로 블록에는 500개 이상의 거래가 담겨 있습니다. 따라서 모든 거래가 포함된 후 완성된 블록은 블록 헤더의 크기보다 약 1,000배 정도가 큽니다. 블록 헤더는 여러 개의 블록 메타데이터로 구성되어 있습니다.
이는 크게 3가지로 나눠볼 수 있습니다. 첫째, 현재의 블록이 블록체인에 있는 이전 블록과 연결되어 있음을 나타내는 이전 블록의 해시값입니다. 블록은 해당 메타데이터를 이용해서 이전의 블록과 연결됩니다. 둘째, 머클 트리 루트입니다. 머클 루트라고도 부릅니다. 머클 트리 루트는 블록 내의 거래 전부를 효율적으로 요약하는 데 사용되는 데이터 구조입니다.
셋째, 타임 스탬프, 난이도, 난스(Nonce)는 채굴 경쟁과 관련이 있는 필드들입니다. 이에 대해서는 마이닝 파트에서 더 자세히 설명하도록 하겠습니다. 여기서 간단히 언급하자면, Timestamp는 블록이 생성된 시간을 의미합니다. Proof-of-Work(작업증명)는 새로운 블록을 블록체인에 추가하는 작업을 완료했음을 증명하는 것입니다.
새로운 블록을 블록체인에 추가하려면, 그 새로운 블록의 블록 해시를 계산해야 하고, 그 블록 해시를 계산해내려면 블록 헤더 정보 중의 하나인 nonce 값을 계산을 통해서 구해야 합니다. 결국 새로운 블록의 nonce 값을 구하는 것이 작업 증명이라고 이야기할 수 있습니다. Nonce는 PoW에서 사용되는 카운터 역할을 합니다.
이 nonce 값을 0부터 1씩 차례대로 높이면서 블록 해시 값이 특정 숫자보다 작아지게 하는 값을 찾아야 합니다. Difficulty Target은 Nonce를 찾는 작업의 난이도를 조절하는 필드입니다. 이것은 nonce 값을 계산하는데 기준이 되는 특정 숫자를 나타내며, 블록체인 전체에 걸쳐 동일하게 적용되는 숫자입니다. 간단하게는 0의 개수로 난이도를 조절할 수 있습니다.
블록 해시의 0의 개수가 적어질수록, nonce 값이 맞을 확률이 증가한다고 생각할 수 있습니다. 그렇다면 블록체인에서 블록을 어떻게 식별할까요? 블록체인에 연결된 수많은 블록 중에 지금 만들어지는 블록은 추후에 어떻게 식별될 수 있을까요? 비트코인에서 블록의 주요 식별자는 블록 해시(Block Hash)입니다. 한 블록의 암호화 해시로 블록을 식별할 수 있는데, 이것은 블록의 고유한 값이 되기 때문입니다.
조금 더 명확히 말하면 블록 헤더 해시라고 말할 수 있습니다. 이는 해시함수의 입력으로 들어가는 것이 블록의 전체 값이 아닌 블록 헤더이기 때문입니다. 이 블록 해시 값은 다음 블록에 previous hash 값으로 포함되며 블록들이 체인처럼 연결될 수 있는 역할도 하고 있습니다. 이를 이용해서 중간의 블록이 수정되면 해시 값이 바뀌기 때문에 이후로 연결된 모든 블록의 previous hash, block hash가 달라지게 되므로, 이것은 블록체인의 비가역성(Irreversibility)이라는 특징을 부여합니다.
이렇게 블록 헤더만 가지고 해시 값을 만드는 것에 대해, 블록 바디에 있는 거래가 변경되는 것에 대해서도 어떻게 변하지 않음을 보장할 수 있을까? 라는 의문을 가지실 수 있습니다. 이는 블록 헤더의 Merkle Root에 의해 해결될 수 있습니다. Merkel root는 블록 바디에 들어있는 모든 거래 내용의 축약본이고, 만약 블록 안의 거래가 수정되면 이 merkle root도 변하기 때문에 전체 블록 헤더의 해시 값도 변하게 됩니다.
이런 이유로 블록 전체가 변경되지 않았다는 것을 보장할 수 있습니다. 블록 해시는 block header에 SHA-256 해시 함수를 두 번 적용시켜서 나온 결과를 사용하며, 총 32바이트의 길이를 가집니다. 이렇게 생성된 블록 해시는 하나의 블록을 유일하게, 그리고 명확하게 식별하는 식별자의 역할을 할 수 있습니다. 추가적으로 블록의 높이도 식별자로 이용될 수 있습니다.
블록의 높이는 최초 0부터 시작하여 블록이 생성될 때마다 1씩 증가합니다. 블록의 높이는 인덱스로 활용되며 블록체인에서 블록의 위치를 나타내는 중요한 지표입니다. 하지만 이것은 유일하게 블록을 식별하지 못합니다. 예를 들어서 블록체인의 분기(fork)가 발생했을 때, 동일한 두 개의 블록이 같은 블록의 높이를 가질 수 있기 때문에 블록의 높이로는 어떤 블록인지 식별할 수 없습니다. 다만 메인 블록체인에 연결되는 것은 두 개의 동일한 높이의 블록 중 하나만 포함될 것입니다.
이것은 비트코인 네트워크에서 다른 마이너가 동시에 블록의 채굴을 성공시켰을 경우에 발생 가능하고, 이에 대해서는 뒤에서 더 자세히 설명하겠습니다. 그래서 결국 여러 개의 블록이 블록체인에서 해당 블록의 높이를 두고 경쟁하는 구조로 이해할 수 있습니다. 비트코인의 블록체인에서 첫 번째 블록은 genesis block이라 불리고, 사토시 나카모토가 비트코인을 개발하여 처음 블록을 생성시킨 2009년에 만들어졌습니다.
이 블록은 블록체인 안에 있는 모든 블록들의 공통 선조가 됩니다. 블록체인에 연결되어 있는 어떠한 블록이라도 계속 이전 블록을 따라가 보면 결국에는 이 genesis block에 도달하기 때문입니다. 실제로 이 블록은 비트코인 코어 등의 클라이언트 소프트웨어들 안에 고정적으로 인코딩되어 있습니다. 따라서, 비트코인을 시작하는 어떠한 노드들도 적어도 하나의 genesis block을 가지고 시작하고, 이것은 변경될 수가 없습니다.
비트코인의 explorer 중 하나인 blockchain.info로 접속하게 되며, 여기서 Genesis block의 구조를 볼 수 있습니다. 비트코인의 노드들은 제네시스 블록부터 시작해서 전체 블록체인 복사본을 각자 유지합니다. 이 블록체인은 새로운 블록들이 생성될 때마다 끊임없이 갱신되고, 체인을 연장시킵니다.
블록이 체인에 연결되는 단계
블록이 체인에 연결되는 단계에 대해서 설명 드리겠습니다. 우선, 한 노드가 네트워크로부터 유입(생성)되는 블록들을 수신합니다. 노드는 해당 블록을 검증하고, 기존의 블록체인에 검증을 통과한 블록을 연결합니다. 특히 링크를 설정하기 위해서, 노드는 들어오는 블록의 헤더를 검사하고 previous block hash를 찾습니다.
현재 블록1이 생성되어 있는 상태에서, 블록 2가 만들어져 네트워크를 통해서 들어왔다고 가정합니다. 이때 노드는 블록2의 헤더를 보고 이전 블록의 해시를 찾습니다. 더 이전 블록 해시는 이전 블록인 블록1의 블록헤더 해시와 동일해야 합니다. 이렇게 자신이 child(블록2)가 되고, 이것과 연결된 parent 블록을 찾았으면, 생성된 블록을 이용해서 블록체인을 연장시킵니다.
머클트리
다음 두 슬라이드에서는 머클 트리(Merkle Tree)에 대해서 설명하겠습니다. 앞에서도 잠깐 언급했지만, 비트코인 내에 있는 블록 각각은 머클 트리를 이용해서 해당 블록에 들어 있는 모든 거래의 요약본을 가지고 있습니다. 이것은 머클 루트(Merkle Root)라고 하며 블록 헤더 내에 포함됩니다.
머클 트리는 이진 해시 트리라고도 하는데, 이것은 규모가 큰 데이터 집합의 완전성을 효율적으로 요약하고 검증하는데 사용되는 데이터 구조입니다. 참고로 비트코인에서는 머클 트리를 구성할 때 꼭 리프가 짝수여야 합니다. 때문에, 만약 거래가 홀수로 있을 때는 마지막 거래를 복사해서 마지막 리프에 위치시켜 둡니다.
위의 그림에서 보자면, H_C를 복사해서 H_D에 위치시켜 놓고 짝수 개의 리프를 만드는 것으로 이해하면 되겠습니다. 이렇게 생성한 트리를 균형 트리, balanced tree라고 합니다. 머클 루트라고 불리는 해시 하나가 남을 때까지 노드 쌍을 반복적으로 해싱해서 머클 트리를 만듭니다.
H_A(트랜잭션 A의 해시)와 H_B(트랜잭션 B의 해시)를 더해서 해싱한 것이 H_AB가 됩니다. 그리고 H_C와 H_D를 연결해서 (32+32=64) 해싱한 것은 H_CD가 됩니다. 다시 이 두 개(H_AB와 H_CD)를 연결해서 해싱하면 머클 루트(H_ABCD)가 탄생하고, 그림처럼 머클 트리가 만들어집니다. 암호 해시 알고리즘으로는 SHA-256을 사용합니다.
H_A = SHA 256(SHA 256(Transaction A)) 이 수식은 한 개의 거래에 대해서 두 번 SHA-256을 적용하여, H_A를 만든다는 것을 뜻합니다. 나머지도 마찬가지입니다. 이 과정을 계속하다 보면 결국 하나의 해시 값만 남게 되고 앞에서 말씀드린 대로 이것이 머클 루트입니다. 머클 트리의 주요 특징을 다시 한번 살펴보면, 머클 트리는 블록 내에 있는 모든 거래를 요약하기 위해 비트코인에서 사용되며, 거래의 전체 집합에 대한 모든 디지털 지문을 만들어 냅니다.
머클 트리는 거래들이 블록 내부에 포함되는지의 여부를 검증하는데 아주 효율적인 프로세스를 제공합니다. 특정 거래가 블록 내에 포함되어 있다고 입증하기 위해서는 노드가 log 2(N)개의 32바이트 해시를 생성해서 특정 거래와 트리의 루트를 연결하는 머클 경로를 구성하면 됩니다.
왼쪽 그림은 머클 경로를 이용해서, H_K가 블록 내에 포함되어 있는지 확인하는 메커니즘입니다. 차례대로 H_L, H_IJ, H_MNOP, H_ABCDEFGH는 특정 거래와 머클 루트를 연결하는 머클 경로를 나타내고 이것을 이용하면 H_K가 블록 내에 포함되어 있다는 것을 알 수 있습니다. 또한, 이러한 방법은 거래의 건수가 증가할 때 특히 중요하며 장점이 발휘되는데, 왜냐하면 log 2(N)의 값이 노드의 증가보다 훨씬 더 완만하게 증가하기 때문입니다.
표를 보면 이러한 머클 트리의 효율성을 확인할 수 있습니다. 블록 안에 포함되는 거래의 개수가 16건, 4KB 크기에서 65,535건, 16MB 크기로 급속하게 증가하지만, 거래가 블록에 포함되었는지의 여부를 입증하는 데 필요한 머클 경로는 128바이트에서 512바이트로 아주 완만하게 증가했다는 것을 확인할 수 있을 것입니다.
참조
http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about
'SW > 블록체인' 카테고리의 다른 글
블록체인 : 트랜잭션 수수료, 트랜잭션의 입력/출력, 비트코인 스크립트 : 개념, 원리, 이해 (0) | 2022.01.25 |
---|---|
블록체인 : 비트코인을 구성하는 데이터 모델 : 트랜잭션 구조 : 개념, 원리, 개요 (1) | 2022.01.24 |
블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 (0) | 2022.01.22 |
블록체인 : 비트코인 한계, 블록체인 종류, 사용 사례, 산업 분야 (0) | 2022.01.21 |
블록체인 : 핵심 기술, 특징, 네트워크 동작 원리 (0) | 2022.01.20 |