안녕하세요! Ji-nun입니다!
오늘은 최근 최대 관심사인 BitCoin의 바탕 기술인 BlockChain에 대해서 알아보겠습니다.
BlockChain 은 작년말 국내에서 학회까지 출범됐을 정도로 아주 뜨거운 주목을 받고있는 기술이자 개념입니다.
본 포스팅에 앞서 해당 정보의 출처는 아래와 같습니다.
포스팅에 있어서 원작물에서의 큰 변경은 없습니다.
제가 새롭게 알게 된 내용을 복습하는 겸, 여러분과 같이 공유하고 싶어서 올립니다.
이 내용만으로는 이해가 안될 수도 있습니다. 제 경우엔 그렇습니다.
추가적으로 좋은 정보가 있으면 포스팅 하단에 참고자료와 사이트를 계속 추가할 예정입니다.
BlockChain 기초 개념
시작하기 전에 블록체인과 비트코인의 구분부터 해보겠습니다.
블록체인은 비트코인의 운영 바탕이 되는 체계이고, 비트코인은 블록체인을 화폐 발행과 운영에 응용한 것입니다.
고로 핵심이 되는 기반 기술 체계는 블록체인이며, 비트코인은 블록체인을 바탕으로 만들어낸 서비스의 하나입니다.
BlockChain
블록체인은 최초의 블록(Genesis Block)부터 시작해서 바로 앞의 블록에 대한 링크를 가지고 있는 링크드 리스트입니다.
블록체인은 여러 노드에 걸쳐 분산되어 저장 및 관리되며, 블록에는 거래 정보가 포함되어 있으므로,
블록의 집합체인 블록체인은 모든 거래 정보를 포함하는 거대한 분산 장부라고 할 수 있습니다.
Block
블록은 블록체인의 원소로서 개념적으로는 다수의 거래 정보의 묶음을 의미합니다.
블록은 블록 헤더와 거래 정보, 기타 정보로 구성됩니다.
- 블록 헤더는 version, previousblockhash, merklehash, time, bits, nonce 이 6개의 정보로 구성됩니다.
- 거래 정보는 입출금과 관련한 여러가지 정보를 가지고 있습니다.
- 기타 정보는 블록 내에 있는 정보 중에서 블록 헤더와 거래 정보에 해당하지 않는 정보를 말하며,
블록 해쉬 계산에 사용되지 않습니다.
Block Header
블록 헤더는 다음의 6가지 정보로 구성됩니다.
1. version : 소프트웨어/프로토콜 버전
2. previousblockhash : 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬
3. merklehash : 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값
4. time : 블록이 생성된 시간
5. bits : 난이도 조절용 수치
6. nonce : 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때 까지의 1씩 증가하는 계산 횟수
Block Hash
블록의 식별자 역할을 하는 블록 해쉬는 6가지의 블록 헤더 정보를 입력값으로 하고, 여기에 SHA-256 해쉬 함수를 2회
적용해서 계산되는 값이며, 32바이트의 숫자값입니다.
이름은 블록 해쉬이지만 그 값은 블록 전체를 해쉬한 값이 아니라, 블록 헤더를 해쉬한 값입니다.
지금까지의 내용을 바탕으로 블록 해쉬를 구하는 과정을 그림으로 나타내면 다음과 같습니다.
이제 이 그림을 중심으로 얘기를 풀어가보겠습니다.
완료된 거래 정보의 변경이 사실상 불가능한 이유
거래 정보의 해쉬값은 해당 거래가 포함된 블록의 merklehash 계산에 입력값으로 사용되고,
merklehash 는 블록 해쉬의 계산에 입력값으로 사용됩니다.
블록해쉬는 다음 블록(A라고 하면)의 previousblockhash 값으로 저장되며,
previousblockhash 는 A블록의 블록 헤더 정보로서, A블록의 블록 해쉬를 계산하는데 입력값으로 사용됩니다.
따라서, 거래 정보가 변경되면 merklehash가 변경되고, merklehash가 변경되면 블록 해쉬가 변경되고,
블록 해쉬의 변경은 다음 블록의 블록 해쉬 변경으로 연쇄적으로 이어지게 됩니다.
[ 거래 정보 변경 → merklehash 변경 → 블록 해쉬 변경 → 다음 블록의 블록 해쉬 변경 ]
그리고 블록 해쉬는 작업 증명의 해답(nonce 값)을 찾아내야 구할 수 있으므로,
거래 정보를 변경한 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 합니다.
블록 하나를 채굴하는데 평균 10분이 소요되며, Bitcoinchats.com 에서 확인한 2016-01-23 시기의
총 블록 수가 약 40만 블록이므로, 최초의 원조 블록인 Genesis 블록이 포함된 거래를 변경하려면
약 400만 분 (약 7.6년)의 시간이 소요됩니다.
그 7.6년의 시간 동안에도 새로운 블록들도 평균 10분 마다 하나 씩 계속 생성되므로 이를 모두 뒤집는 것은
사실 상 불가능합니다.
| 완료된 거래 정보를 변경하려면,
| 변경하려는 거래 정보가 포함된 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 하는데,
| 이는 많은 시간이 소요되고, 그동안 다른 노드들에 의해 블록이 계속 추가되므로,
| 완료된 거래 정보의 변경은 현실적으로 불가능합니다.
채굴(Mining)
채굴은 일반인들이 비트코인을 쉽게 이해할 수 있도록 만든 용어로서,
작업 증명(Proof of Work)과 보상을 합친 개념이라고 생각하면 됩니다.
작업 증명(Proof of Work)
작업 증명은 새로운 블록을 블록 체인에 추가하는 '작업'을 완료했음을 '증명'하는 것이라고 이해하면 됩니다.
새로운 블록을 블록체인에 추가하려면, 그 새로운 블록의 블록 해쉬를 계산해내야하고,
그 블록 해쉬를 계산해내려면 그 블록의 블록 헤더 정보 중의 하나인 nonce 값을 계산을 통해 구해야 합니다.
| 결론적으로 이 nonce 값을 구하는 것이 바로 작업 증명입니다.
nonce 값의 계산
결론부터 말하자면 nonce 값은,
이 nonce 값을 입력값 중의 하나로 해서 계산되는 블록 해쉬값이 특정 숫자보다 작아지게 하는 값을 말합니다.
그리고 해쉬 함수의 특성상, 어떤 해쉬값(A라고 하면)을 결과로 나오게 하는 입력값을 찾으려면,
A에서 역산을 하는 방식으로는 찾을 수 없고,
결과가 A가 될 때까지 무작위로 입력값을 계속 바꿔가면서 찾아낼 수 밖에 없습니다.
그 입력값을 바꿀 수 있는 유일한 통로가 바로 nonce 입니다.
다시 말해, 아래 그림의 '블록 헤더'란에 포함된 6가지 정보 중에서 확정되지 않아서
값을 바꿀 수 있는 유일한 항목이 nonce 입니다.
이 nonce 값을 1씩 증가시키면서 반복적으로 계산한 블록 해쉬값이 특정 숫자보다 작은 값이 나오면,
그 때의 nonce 값으로 계산한 블록 해쉬가 그 블록의 블록 해쉬로 확정되고,
블록 해쉬라는 식별자를 얻은 그 블록은 새로운 블록으로서 블록 체인에 추가되며 작업이 완료됩니다.
| 블록 해쉬가 특정 숫자보다 낮게 나올 때의 nonce 값이 바로 작업 증명을 나타내는 nonce 값 입니다.
이 과정을 그림으로 살펴보면 아래와 같습니다.
아래의 그림은 블록 해쉬가 000000a84... 보다 작게 나오는 nonce 값을 구하는 과정을 나타내고 있습니다.
앞에서 설명한 대로 nonce 외의 모든 항목의 값은 이미 정해져 있습니다.
nonce 값이 0 일 때의 해쉬를 구해보니 000000a84... 보다 큰 fa8cbaeed... 가 나와서 작업증명에 실패했습니다.
다시 nonce 가 1 일 때의 해쉬를 구해보니 932d16e2e... 가 나와서 또 실패
nonce 가 2 일 때의 해쉬, 3 일 때의 해쉬 ... 를 계속 반복해서 구하고 실패하다가,
nonce 가 82,764,351 일 때의 해쉬를 구해보니
드디어 000000a84... 보다 작은 000000a83... 이 나와서 작업 증명에 성공했습니다.
그렇다면 작업 증명 성공 여부의 기준이 되는 000000a84... 라는 값은 어떻게 정해질까요?
바로 작업 난이도에 의해 정해집니다.
(앞의 그림에서는 이해를 돕기 위해 작업 난이도보다는 더 구체적인 채굴 난이도로 표시했으나,
이제 그 작업이 무엇인지 알았으니 앞으로는 작업 난이도라고 합니다.)
작업 난이도
블록 해쉬가 특정 숫자보다 낮게 나올 때의 nonce 값을 찾아내는 것이 작업 증명이라고 했습니다.
작업 난이도는 nonce 값 계산의 어려운 정도를 나타냅니다.
작업 난이도는 블록 헤더 정보에서 bits 라는 값으로 조절됩니다.
앞에서 블록 해쉬는 32바이트의 숫자라고 했는데, 이해를 쉽게 하기 위해 블록 해쉬를 부호없는
1바이트의 숫자라고 해봅시다.
그럼 1바이트의 숫자값을 블록 해쉬값으로 산출하는 해쉬 함수는 0 ~ 255 사이의 값을 결과로 산출합니다.
블록 해쉬가 128보다 작아야 한다고 하면, 0~255 사이의 값을 산출하는 해쉬 함수를 적용해서
128보다 작은 블록 해쉬 값이 나올 확률은
128보다 작은 수(0~127)의 개수 = 128 / 해쉬 함수가 산출할 수 있는 모든 값(0~255)의 개수 = 256,
즉, 128/256 이므로 50%의 확률입니다.
블록 해쉬가 64보다 작아야 한다면 64/256, 즉 25%의 확률로 nonce 값을 구할 수 있습니다.
블록 해쉬가 32보다 작아야 한다면 확률은 12.5%로 줄어듭니다.
여기서 128, 64, 32라는 특정 숫자가 바로 블록 헤더 정보의 bits 입니다.
실제로 bits 의 값이 128, 256 이런 식으로 저장되지는 않고, 지수와 계수를 사용하는 별도의 표현 방식이 있습니다.
난이도는 2,160개의 블록이 생성되는데 소요되는 시간의 평균 시간인 21,600분(10분/블록 * 2,160블록)보다
오래 걸리면 낮아지고, 적게 걸리면 높아지는 방식으로, 대략 21,600분을 주기로 전체적으로
평균 10분이 소요되는 하나의 난이도가 전체에 적용됩니다.
| 블록 헤더의 bits 는 nonce 값을 계산하는데 기준이 되는 특정 숫자를 나타내며,
| 블록체인 전체에 걸쳐 일률적으로 적용되는 숫자입니다.
보상
보상은 새로 발행되는 비트코인과 해당 블록에 포함되는 거래의 거래 수수료의 합입니다.
비트코인의 새로운 발행은, 채굴자가 블록을 처음 구성할 때 채굴자의 지갑으로 일정량의 비트코인이
입금되는 거래를 그 블록의 첫 거래(generation transaction)로 추가하는 방식으로 이루어집니다.
새로 발행되는 비트코인은 최초에 50BTC에서 시작해서 블록체인에 21만개의 블록이 추가될때마다 절반으로 줄어듭니다.
거래 수수료는 각 거래 당사자끼리 자율적으로 정할 수 있고,
거래가 블록에 추가되는 우선 순위를 결정하는데 거래 수수료가 입력값으로 사용되기도 합니다.
| 보상은 nonce 값을 찾아내고, 그 결과 새로운 블록을 블록체인에 추가해서,
| 해당 블록에 포함된 모든 거래를 유효한 거래로 확정시켜준 대가라고 할 수 있습니다.
채굴 보상이 줄어든다면 채굴에 의해 유지되는 블록체인이 지속될 수 있는가?
비트코인의 총 발행량은 2,100만BTC로 정해져 있습니다.
결국 채굴하더라도 언젠가는 비트코인은 더이상 발행되지 않으므로,
거래 수수료만이 유일한 보상으로 남게 됩니다.
어떤 상황에서든 채굴이 의미가 있으려면, 채굴에 소요되는 비용보다 수익이 더 커야하며,
이는 비트코인의 신규 발행이 없는 상황에서도 마찬가지입니다.
이 조건을 만족시켜야 채굴이 계속되고 블록체인이 지속될 수 있습니다.
비트코인 신규 발행이 없는 상황에서 이 조건이 만족되려면 다음과 같은 시나리오가 충족되어야 합니다.
채굴 비용의 감소
채굴 비용의 감소는 결국 작업 증명 해답을 찾는데 얼마의 시간이 소요되느냐에 달려있습니다.
이는 작업의 난이도에 달려 있으므로, 거래 수수료만이 유일한 보상인 상황에서 블록체인이 유지되려면
작업의 난이도가 현재보다 더 낮아져야 합니다.
거래 수수료의 증가
거래 수수료의 증가는 결국 거래 수수료율의 증가를 의미하는데, 거래의 성격과 다른 화폐와의 경쟁 등
시장 상황에 따라 정해지겠으나 대폭 높아지기는 어려울 것입니다.
| 신규 발행이 사라지는 2140년 경 이후에는
| 결국은 채굴 난이도가 낮아지는 방식으로 블록체인이 유지될 것입니다.
정리
| 블록 체인은 모든 거래 정보를 포함하는 거대한 장부로서,
| 여러 채굴자의 컴퓨터에 복제되어 관리되는 분산 장부입니다.
| 블록은 다수의 거래 정보의 묶음이며, 이런 블록이 체인처럼 연결되어
| 전체 블록체인을 형성합니다.
| 채굴은 블록에 담긴 거래 정보를 유효한 것으로 확장시키기 위해
| 어떤 숫자값을 찾아내는 작업 증명(Proof of Work)과 그에 따른 보상을 합친 개념입니다.
| 비트코인은 블록체인 시스템을 암호화 화폐 분야에 적용한 서비스의 일종입니다.
※참고자료
- 블록체인 사이트(BitCoin)
- 비트코인 논문(원본 링크)
- 비트코인 논문 한글 번역본은 첨부파일에 있습니다.
※참고하면 좋을 사이트
MOBI Inside - [블록체인에 대하여] (2) 암호화폐와 비트코인 작동원리
출처 포스팅의 질문 내용 정리
Q: nonce 를 1씩 증가시켜서 조건에 맞는 블록해쉬를 찾으면 거래별로 거래수수료에 따라서
블록에 포함시킬지 말지를 결정하는게 컨펌인지?
A: nonce 값을 찾아서 블록해쉬가 구해진 그 블록이 블록체인에 연결되면,
그 안에 포함되어 있는 거래들이 모두 1컨펌을 받게됩니다.
Q: PoS 원리는 어떻게 되는지?
A: PoS는 nonce 를 바꿔가면서 특정값 이하의 해쉬값을 구하는 과정이 필요하지 않고,
어떤 정책이나 시간적인 주기에 따라 정해진 시점에 여러 노드 중에서 블록 생성자를 결장하는 방식입니다.
결정하는 로직은 만드는 방식에 따라 달라질 수 있겠지만, 대체로 노드 별 지분(Stake)과
노드별 블록 생성 후 도과 기간을 기준으로 정하는 걸로 알고 있습니다.
그래서 지분이 높으면 블록 생성의 확률이 높아지고, 오랜 시간 동안 블록을 생성하지 못했다면
블록 생성 확률이 높아지게 됩니다.
Q: 개별 거래의 해쉬값이랑 머클트리의 해쉬값도 SHA256으로 적용되는지?
A: 네 맞습니다. 정확하게 말씀드리면 SHA256을 2회 적용한 값을 사용합니다.
제 나름대로 생각을 정리하며 포스팅합니다.
정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.
본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.
E-mail : silent_lhr@naver.com
공감은 로그인이 필요없습니다.
공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.