Blockchain 들여다 보기 1

in #kr7 years ago (edited)

본Post의 목적

Bitcoin의 초심자들에게 가장 난해하고 이해하기 어려운 개념은 "Block 채굴"일 것이다. "채굴"은 Bitcoin을 "발권(發券)하는 것" ,즉 "화폐의 발행"에 대응하는 것인데,초심자들에겐 상당히 애매모호하게 다가올 것이다.
어떤 것들은 긴 설명을 하는 것 보다,한 실례를 보이는 것이 훨씬 나은 경우가 많다. 백문이 불여일견,백견이 불여일행이라 했다. 이 Post에서는 Genesis Block(Block #0)을 채굴의 실례로 삼아,이 Block의 내용을 Raw Hexadecimal형태로 들여다 보고,그 내용을 구체적으로 분석함으로써,채굴을 위해 풀어야 했었던 "문제"가 무엇이었는지,어떤 "답"을 찾아 채굴에 성공했는지를 복기(바둑용어) 하는 것을 목표로 한다.
이 Post를 읽으려면 약간의 사전 지식이 필요하다. 첫째, 필자의 Post인 "비트코인 따라잡기"는 최소한 읽은 것으로 간주하겠다. 둘째는 컴퓨터 분야의 초보적 기초지식이다.
가령,8 Bit가 뭔지,1 Byte가 뭔지,16진수(Hexadecimal Number)표시,Sha256 Hash함수가 뭔지도 모른다면,구글 검색기를 이용해서 약간의 기초지식을 갖춘 뒤에 도전해 보기 바란다. (책을 살 필요가 없다. Internet이 지식의 보고다)

1. Blockchain.info 에 대해서

앞으로 우리는 Blockchain.info라는 Web site를 주로 이용하게 될 것이다. 따라서, 이절에서는 이 Site를 보고 이해하고 사용하는 방법을 설명하겠다.
우선,마우스를 다음 링크위에 놓고, 마우스 우측 버튼을 누른후 "새탭에서 링크열기"를 선택해서 열라.
blockchain.info
Block이 채굴되고 있는 실시간 현황이 게시되어 있을 것이다. 아랫쪽에는 현재의 1BTC당 단가와 Market Capitalization(Market Cap:시가총액)이 Dollar로 표시되어 있을 것이다.
Market Cap을 단가로 나누면,현재까지 Mining된 총bitcoin의 량을 알 수 있을 것인데, 1630만BTC 근처로 산출 될 것이다. 서기2140년경 Block Reward가 드디어 0이 되면,더 이상의 Bitcoin은 채굴되지 않게 되는데,앞으로 남은 채굴량은 470만 BTC뿐이다. 즉, 이미 77%정도가 채굴된 것이다.

한편, Hash Rate도 표시되어 있는데,6,878,824 TH/s 근방일 것이다. TH/s는 Tera Hash /second를 뜻하고,1 Tera는 Giga다음의 단위로써 10의 12승에 해당한다. 현재 Mining에 참여하고 있는 모든 Node들의 Hash연산능력에 대한 추정치이다. 6,878,824 TH/s라는 수치는 파란색으로 써있을 것이다. 이것은 "링크"라는 의미이므로 마우스로 클릭해 보아라. Hashing Power가 년도별로 변화해온 Graph를 보여줄 것이다. Market Cap의 숫자도 파란색이므로 마우스로 클릭해 보라. 또한, BTC price 아래의 링크를 클릭하면,Price의 년도별 추이도 볼 수 있을 것이다.

다시 원래의 Page로 돌아와서 보면,제일 윗쪽에는 최근 채굴된 Block들의 Block 높이(현재는 477000 근방일 것이다)와 채굴시간등이 전시되어 있을 것이다. Block 높이(Block height)는 Block의 일련번호로 이해하면 된다. 이것도 파란색으로 써있을 것이다. 즉, 링크란 뜻이므로 아무것이나 하나를 클릭해 보자. 그러면,해당 Block의 상세내용이 전시될 것이다. 다시 원래의 Page로 돌아 오도록 하자. "수색"이라는 제목하에, 검색을 위한 곳이 있다. 거기에 부연 설명 되어 있는데로, 이 검색칸에는 다음과 같은 것을 입력하여 검색할 수 있다.

  • 그냥 숫자를 입력하면, Block Height라는 뜻으로 간주하여 해당 Block을 보여준다.
  • Bitcoin Address를 입력하면,그 Address가 포함된 모든 거래들의 이력과 총 입금액,출금액,현재의 잔액등을 보여 준다.
  • 어떤 거래(Transaction: 줄여서 Tx)의 상세내용을 알고자 한다면,그 거래의 고유부호(Transaction id: 줄여서 Txid)를 입력한다. Txid란 해당 거래서의 내용(raw binary)을 Sha256 Hash한 결과인바,32Byte의 data이다. 1Byte는 2개의 nibble이므로 64개의 16진수이다.
  • 어떤 Block의 내용을 보고자 하는 경우,그 Block의 고유부호(Block id)를 넣어서 검색해도 좋고,Block
    Height 숫자를 넣어도 좋다. Block id란 그 Block의 Header부분을 Sha256 Hash한 결과인바,32Byte data이다.

이상과 같이, 이 Blockchain.info site는, 잘만 활용하면, Blockchain에 관한 많은 정보와 지식을 얻을수 있다.

2. Genesis Block을 훝어보기

Genesis Block이란 Bitcoin의 창시자인 Nakamoto Hitoshi가 제일 처음 채굴한 Block으로써, 우리말로는 "창세기Block"이 되겠다. "Block #0"이라고도 표현한다. 이 절에서는 이 Block의 내용을 보면서 그 역사적인 의미도 되돌아 보고,전시된 내용 속에 나오는 여러 용어들의 의미를 설명하기로 한다.

위 1절에서 설명하였듯이, 그 검색칸에 0(숫자 0)을 입력후 검색해 보면 다음 같이,역사상 최초의 Block인 Genesis Block의 내용이 전시될 것이다.

GenBlock.PNG

우선, "요약"에서 Time Stamp를 보자. 2009년 1월3일 18시로 되어있다. 2008년의 Sub Prime위기와 불량채권으로 인한 미국 금융가의 도산위기,리만Brothers몰락, FED에 의한Bailout(마구잡이 화폐발행)등등이 있은 직후이다. 그러한 시대 배경하에서,하나의 반발로써,반골들에 의한,누구도 발권에 영향력을 행사할 수 없는,Fair하고 정직한 화폐체계로써, Bitcoin이 제시된 것이라 할 수 있다.

이 page의 상부 좌측에는 "요약", 상부 우측에는 "해시(Hash)"난이 있고, 다시 아래쪽에는
"거래"가 전시되어 있는데,아직은 이해가 되든 말든 상관없으니 일단 한번 쭉 부담없이 훝어 보라.

이 Block은 한개의 거래만 포함하고 있는데,채굴자가 50BTC의 보상을 받는 거래이다.
이 거래의 내용을 보면,좌측에
"없음. 입력하지(새로 생성된 동전)" 라고 되어 있고, 그 우측에는,
1A1zP1e. . . . . 50BTC
로 되어 있다. 즉, 1A1zP1e. . .라는 Address로 50BTC를 보낸 것으로 되어 있는데,좌변에는 Sender의 Address도 없고, 자금의 근거도 제시되지 않았다.
그도 그럴 것이, 이 거래는 BTC를 창출하는,화폐의 발행에 해당하는,자금의 출처를 제시할 필요가 없는, 특수한 거래이기 때문이다.
이러한 특수거래를 Coinbase Tx이라 한다(Tx은 항상 Transaction의 줄인말로 이해하라). 모든 Block은 제일 첫 거래로써 Coinbase Tx을 반드시 포함 한다. Coinbase Tx이 아닌 정상적 Tx이 포함되기 시작하는 것은 훨씬 나중의 일이 될 것이다. 우선, Bitcoin의 발행(채굴)이 충분히 있은 다음에야 비로써,보통의 거래들이 생겨날수 있는 것이다. 초기에는 채굴에 참가한 Node들도 거의 없었을 것이므로,아마도, 단 1개의 Node가 아무런 경쟁자Node없이 당분간 홀로 채굴을 계속하지 않았을까?

내연기관이 있더라도 시동을 걸자면,연료도 필요하고,특히 최초에는 Starter라는 전기 모타로 강제로 Crank shaft를 돌려서 4행정 Cycle을 시작해야 한다. 한동안은 Nakamoto씨 Group일원들끼리 Mining만 했을 것이다. 그러다가,이미 채굴된 Bitcoin들을 거래하는 통상적인 Tx도 나타나게 되고,호기심 많은 다른 이들도 Mining에 참가하고, Bitcoin으로 결제를 해주는 소매점도 나타나고,Bitcoin거래소도 등장하는등등 일련의 확대 과정을 겪어온 것이다. 지금은,이윤동기에 의해서 저절로 돌아가는 Autonomous Eco System이 되었다. 필자가 보기에는 이제 아기가 "제발로 걷기 시작하는" 돌을 훌쩍 지난 아이로 보여진다.

한편, 거래내용의 위쪽을 보면, "4a5e1e4baa. . . ."와 같은 파란색의 긴 부호가 보이는데,이것이 이 Transaction의 고유부호 역할을 하는 Txid이다(Transaction id로 발음). Transaction의 내용(raw binary)을 Hash한 결과인 32Byte의 data를 Txid로써 취하는 것이다. 나중에 구체적으로 설명하게 될것이다.

상변우측의 "해시"안에는 4개의 항목이 있는데,각각 32Byte크기의 16진수(Hexadecimal) data들이다. 이들은 각각 다음의 뜻이다. (아직은 무슨 뜻인지 모를 수 있으나,그냥 그려려니 하고,이해가 되는지 한번 읽어는 보자.)

  • 해시: 이 Block(Block #0)의 Header를 Hash한 결과값. 이 Block의 Block id(고유 식별부호)역할을 한다.
  • 이전Block : 이Block은 창세기 Block이어서 이전Block은 없다. 그러므로,그것의 id도 있을 수 없으나,"00000. . . 0000"으로 해둔 것. (Block #1부터는 "이전Block"이 의미를 갖게 된다.)
  • 다음Block :다음 Block의 Block id (Block Header의 Hash값).
  • Merkle Root: 이 Block에 포함된 Transaction들의 Txid들로 부터,일정한Rule에 따라 산출된 최종Hash값. 단,Tx이 단 한개인 경우에는 그 Transaction의 Txid가 그대로 Merkle Root가 된다.

위에서 처음 3개는 링크(파란색이다)이기도 하므로,가령 "다음Block"의 Hash(Block id)를 클릭하면 Block #1을 보여줄 것이다. 물론, 맨 윗쪽 우측에 보이는 검색창에 1을 넣어 검색해도 된다.

이하에서는 "요약"에 나오는 몇몇 용어에 대해서 부연 설명하겠다.

2.1 블록보상(Block Reward)

출발초기의 Block Reward는 50BTC 이었으나, 매 210000 Block마다(대략4년) 1/2로 반감하도록 되어있다. 2017년 현재는 12.5BTC가 Block Reward이다.
Block #210000과 Block #420000을 검색하여 열어보고, 그 전후로 Block Reward가 변한 것을 확인해 보라.
한편,1 Satoshi=0.00000001 BTC 인데,이것이 제일 작은 금액이다. BTC란 우리 사람들끼리 사용하는 단위일 뿐이고, 실제 Blockchain내의 기록에서, 금액은 integer(정수)값이며,Satoshi단위로 보는 것이다. 즉,초기 Block보상은 50억Satoshi였다는 이야기다. Coinbase Tx은 채굴자Node의 Software가 작성하여 끼워 넣는 것이며,이 50억Satoshi금액도 Software가 알아서 써 넣는 것이다.

2.2 해시난수,Bits,난이도

"해시난수"란 좀 어이없는 번역이다. Hash Nonce를 그리 번역한 모양인데,그냥 영어 그대로 두든지,아니면 "해시 넌스"로 하던지 했으면 좋았을 것이다. 난수(Random Number?)와는 전혀 관계가 없다. 그래서 필자는 "Hash Nonce"라는 용어를 쓰겠다. Bits와 Hash Nonce는 Block Header의 각각 5번째 및 6번째 항목인데,각각 4Byte 크기의 data이다. Block Header를 Hash한 결과가 Bits가 제시하는 어떤 조건에 합치해야만 Block이 채굴 된 것으로 인정되는데,합치되도록 하기 위해 채굴자가 이리 저리 변경할 수 있는 항목이 바로 Nonce다. 즉, Block #0의 경우,Nonce를 4,069,828,196(10진수 표시)로 했을 때 비로써 Block Header의 Hash가 Hexadecimal(16진수)로,
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
(32Byte길이: 우측의 "해시"항목에 보이고 있는 값)
가 되면서, Bits가 제시하는 목표치 안에 들게 되었다는 이야기다.
채굴자는 Nonce의 값으로써, 0부터 시작해서 1씩 증가시켜 가며,그때 마다 Hash를 얻어 목표치에 들었는지를 확인하는 작업을 반복하였을 것이다.
나중에 후술 하겠지만 Block #0의 Bits가 제시하는 조건은,Hexadecimal로,
000000ffff0000000000000000. . . . . . . . . .0000 (32Byte)
보다 크지 않은 결과를 얻으라는 것이었다(후에 상세 설명 예정).
초기에는 이 관문을 Pass하는 것이 그리 어렵지 않았다.
그러나,가령, 최근의 블록인 Block #477383의 경우 Bits가 제시하는 조건은,
0000000000000000015ddc00. . . . . . . . . . 0000 (32Byte)
보다 크지 않은 결과를 얻는 것이었다.
이 #477383을 채굴한 Node는 Nonce를 4,279,086,043(십진수 표시)로 했을 때,Block Header의 hash결과가
000000000000000001053e06c1b585f26a871409f02a42c784cc63e02ede1781
로 되어 채굴에 성공한 것이었다.
Bits가 제시하는 합격범위가 극적으로 좁아진 것을 알 수 있다. Block #0에 비해서 상대적으로 얼마나 더 어려워 졌는가 하는 것은 다음 같은 나눗셈을 하면 대략 구할 수 있을 것이다.
ffff0000000000/015d =(십진수로,개략)804,526,194,568?
이것이 소위 "난이도"이다.
이 처럼,Block의 "요약"에 나오는 "난이도"는 Genesis Block에 비하여 합격범위가 얼마나 좁아 졌는가를 알려주는 참고 정보이다. 그 뜻으로 부터,Genesis Block자체의 난이도는 1이다. 난이도는 Bits의 값이 좌우한다. Bitcoin System에서는 평균해서, 10분정도에 한개의 Block이 채굴되는 것을 목표로, 이 Bits값을 때때로 조절한다. 채굴에 참여하는 Node가 많아 질수록,또 채굴기 자체의 Hashing Power성능이 높아 질수록,System전체의 Total Hashing Power는 증가하며,평균Block채굴 시간 간격이 줄어들 것이다.
그러면,System은 Bits값을 조절하여 Diffculty를 높힌다.
Bits값의 조정 여부는, 매 2100Block마다,모든 Node들의 의견교환과 Concensus에 의해서 결정된다. 물론,이러한 것은 Node를 구동하는 Software에 의해서 자동으로 이루어 질 것이다.

2.3 번역.

이 "번역"도 터무니 없는 엉터리 번역이다. "Version"을 그렇게 새긴 모양인데,아주 잘못 번역한 것이다. Block Header의 첫 항목 4Byte 는 Bitcoin Protocol의 Version Number이다.
Protocol 이란 것은,쉽게 말해서 "헌법"과 규칙들에 해당하는데,System의 안전성 또는 기능의 개선을 위하여 Bitcoin Protocol은 필요에 따라 개정이 될 수도 있는 것이다.
결국, Header의 첫 항목(4Byte)인 Version은, 채굴에 성공한 그 Node가 사용하는 Software가 Bitcoin Protocol의 어떤Version을 준거하였는지를 밝힌 것이다.

2.4 거래수수료(Tx Fee)

Genesis Block은 Coinbase TX만 있고,정상적 Tx은 없으므로, Tx Fee는 없다.
그러나,가령 Block #477397 의 Coinbase Tx을 보면, Block Reward인 12.5BTC 이외에도
0.07631953 BTC를 더 받고 있음을 알 수 있을 것이다.
이것은 이 Block에 포함된 모든 정상적 Tx의 좌변(inpus이라함)에서 우변(Outputs라함)금액을 뺀 차액을 Tx Fee로써 채굴자가 거두고 있는 것이다.

즉,채굴자는 자기가 검증한 Tx들을 뫃아 그로부터 Tx Fee를 합산하고 나서,Coinbase Tx내용을 만들 때,"Block Reward plus Tx Fee"를 자기의 Address로 보내는 것으로 하여 작성한후,그 거래를 제일 첫 Tx으로 끼워 넣는 것이다. 그후 절차에 따라 Merkle Root를 계산하여 이를 Header에 써넣고,Time Stamp정보등등 Header의 나머지 항목을 다 기입한후,최후로 Nonce찾기(문제풀기)에 착수하게 되는데,바로 이 착수 시점에서의 시간이 Time stamp 시간이다. 자기가 제일 먼저 Nonce를 찾아야만 자기의 Block이 Blockchain에 추가되는 경쟁System인 것이다.

2.5 Merkle Root

Merkle Root는 Block에 포함된 Txid들로 부터,약속된 Hash과정을 밟아 만들어지는 Hash결과(32Byte)로서,Block Header의 3번째 항목에 들어가게 된다.
Block이란 크게 보아 Header부분와 Tx부분의 둘로 나눌 수 있는데,Tx부분을 대표하여 Merkle Root가 Header의 한 항목으로 자리 잡은 것으로 보면 되겠다. Tx부분의 일부라도,순서가 달라지거나 내용이 달라지면 Merkle Root도 완전히 달라지므로 Tx부분의 위변조가 불가능하다.
Tx이 Coinbase Tx한개만 있는 경우엔 Coinbase Tx의 Txid가 그대로 Merkle Root가 된다.
Merkle Root의 구체적 생성방법은 차츰 설명하게 될 것이다.

2.6 Block size

Genesis Block등 초기의 Block들은 Coinbase Tx 밖에 없었으므로,Block의 size는 285Byte(Header 80Byte+205Byte)정도 였지만,
현재는 1Mega Byte에 근접하는 Size를 갖는 경우가 대부분이다. Tx Fee를 더 얻고자 가능한한 많은 Tx을
포함하려 하기 때문이다. 어떤 이유였는지는 모르나,Block size는 1Mega Byte를 넘지 않아야 한다는 Protocol상의 Rule이 있어 왔다.
Bitcoin이 인기를 끌면서,거래가 폭증하여,체증이 생기는 현상이 몇년전부터 있어 왔다. 성장통인 것이다. Tx이 흘러 넘치므로,채굴자들은 Tx Fee가 큰 Tx을 선별하여 골라 Block에 채워넣다 보니,거래금액이 아예 적거나,또는 Tx Fee가 적게 책정된 거래는 계속 우선 순위에서 밀리면서 Blockchain에의 등록이 심하게 지연되는 현상이 있어 왔던 것이다. 필자도, 어떤 경우,"Send"를 한후 수일이 지나서야 겨우 Blockchain에 거래가 등록되는 경험을 한 적이 있었다.

이상이 Genesis Block의 개요이다. 다음 Post에서는,Genesis Block의 내용을, 16진수 Hexadecimal형태로, 들여다 보면서,Header와 Tx의 구조를 상세히 설명할 것이다.

Sort:  

좋아요!