#7 - 채굴(마이닝)이란 무엇인가? (2/N)


main.jpg


안녕하세요. 어미새입니다.

이전 포스팅에서는 '채굴'이 어떤의미인지에 대해서 간략하게 살펴보았습니다.
이전 포스팅을 읽지 않으셨다면 이전 포스팅을 읽고 오시는것을 추천드립니다!

#6 - 채굴(마이닝)이란 무엇인가? (1/N)



블록체인 기술에서 '채굴'이 어떤 의미이고 왜 필요한지에 대하여 개념정리를 해봤습니다.
'채굴' 보상은 아래와 같은 시나리오에서 발생합니다.

  1. 어떤 거래가 발생하고 이 거래내역을 검증함으로써 '보상'이 발생된다.
  2. 일정 거래내역을 묶어서 관리하는 '블록'을 생성하는 댓가로 '보상'이 발생된다.

채굴에 대한 설명을 하기 앞서 우리가 배운 내용을 정리해보겠습니다. (이 정리가 오늘 배울 개념과도 연결됩니다!)

  1. 블록 체인을 구성하는 '블록'의 정보는 크게 헤더정보와 바디정보로 구성되어있습니다.
  2. 블록 바디에는 다수의 거래정보가 포함되어 있습니다.
  3. 블록 헤더 정보 중 머클루트는 블록 바디에 저장된 거래 내용을 머클트리한 결과 값입니다.
  4. 블록 헤더에 있는 6가지 정보를 해싱알고리즘을 통해 블록해시 값을 출력할 수 있습니다.
    (위의 내용은 포스팅 3~5편 내용을 순차적으로 정리한 내용입니다. 혹시 모르는 부분이 있다면 읽어보시면 많은 도움이 될 것이라고 생각됩니다.)


'채굴'과 관련된 용어와 이해야되는 부분이 너무 어렵고, 방대했기 때문에 어디서부터 어떻게 설명을할지 많은 고민이 있었습니다. 우선은 간략하게 개념 위주로 설명을 하고 심도 있게 다시 설명해야 하는 부분은 파트를 나누어서 따로 설명하기로 결정 하였습니다. (혹시 잘못된 부분을 말씀해주시면 언제든지 받아들이고 수정하겠습니다!)



'새로운 블록 생성'


새로운 블록을 생성하고 전파한 댓가의 '보상'으로 비트코인을 지급받는 방식을 '채굴'이라고 설명해드렸습니다. 그리고 '새로운 블록'을 생성한다는 것은'수학문제를 푸는 행위'와 같다고 설명해드렸습니다. 설명에 앞서 수학문제를 푸는 풀이과정을 이해하기 위해서는 반드시 해시함수에 대한 개념을 알고 있어야합니다.



'수학 문제란?'



도대체 어떤 수학문제를 푸는것일까요? 우선은 쉽게 이해할 수 있도록 설명하겠습니다.


비트코인 시스템에서는 채굴자들에게 정보가 일부 비어있는 '미완성 블록'을 제공합니다. 이때 비어있는 정보가 'nonce'정보입니다. 채굴자는 '미완성 블록'을 이용하여 비어있는 nonce 정보를 하나씩 변경하면서 수학문제의 답을 찾아야합니다.


수학문제의 답을 찾게되면 '완성된 블록'이 되고 '완성된 블록'을 생성해내면 '보상'을 받기위한 1단계 성립이 됩니다. (답을 찾으면 채굴이 끝난게 아닙니다! 우선은 수학 문제를 풀어내면 '채굴'이 된다고만 생각하세요!)


새로운 블록 즉 '완성된 블록'이 되기 위한 조건은 임이의 'nonce' 정보를 입력하여 출력된 '블록해시' 결과값이 난이도(target)보다 작을 경우 '완성된 블록'이 될 수 있습니다!



7_1.png


이러한 개념을 한마디로 정리하기가 어렵기 때문에 많은 사람들이 쉽게 수학문제를 풀고 문제를 푼 댓가의 보상으로 비트코인을 준다고 설명한 것 같습니다. 하지만 이렇게만 정리하고 넘어가면 안되겠죠? 자세히 살펴봐야합니다!


우선 이해를 돕기 위해 'nonce'에 임이의 결과 값을 넣어서 '블록해시'를 만드는 과정을 한번 살펴보겠습니다.

'미완성 블록'을 만들기 위해 실제 '완성된 블록'인 1번 블록의 정보를 활용해보겠습니다. 그렇기 위해서는 1번 블록이 어떻게 생겼는지 살펴봐야겠죠? 자세한 데이터를 얻기 위해 아래의 링크를통해 1번 블록의 구조를 Json형태로 받아보겠습니다. (https://blockchain.info/block-height/1?format=json)


전달 받은 데이터는 아래와 같습니다. (데이터가 너무 복잡하다고 전혀 어려워 하실 필요없습니다. 자세히 설명해 드리겠습니다 우선은 모르겠으면 구조만 보시고 넘어가세요!)


{ "blocks" : [

{
"hash":"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",
"ver":1,
"prev_block":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"mrkl_root":"0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
"time":1231469665,
"bits":486604799,
"fee":0,
"nonce":2573394689,
"n_tx":1,
"size":215,
"block_index":14850,
"main_chain":true,
"height":1,
"tx":[

{
"lock_time":0,
"ver":1,
"size":134,
"inputs":[
{
"sequence":4294967295,
"witness":"",
"script":"04ffff001d0104"
}
],
"weight":536,
"time":1231469665,
"tx_index":14854,
"vin_sz":1,
"hash":"0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
"vout_sz":1,
"relayed_by":"0.0.0.0",
"out":[
{
"spent":false,
"tx_index":14854,
"type":0,
"addr":"12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX",
"value":5000000000,
"n":0,
"script":"410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac"
}
]
}]
}

]}



위의 데이터를 토대로 nonce 정보가 비어있는 '미완성 블록'은 아래의 그림과 같습니다.



7_2.png


'블록해시' 결과 값을 구하는 공식은 5편에서 설명드렸기 때문에 생략하고 '미완성 블록'의 nonce 정보에 임이의 결과 값을 대입하는 예제 코드를 작성해보겠습니다. (예제는 0부터4까지 nonce의 값을 1씩 증가시키고 블록해시의 결과값을 출력하였습니다.)



7_3.png


'미완성 블록' 이라는 표현을 썻지만 어떤분은 '잠겨있는 블록'이라는 표현을 쓰기도 했습니다. 어쨋든 새로운 블록의 모든 구성 요소는 'nonce'의 정보를 제외하고 알 수 있습니다. 새롭게 만들 블록에 'nonce'의 값을 대입하여 target보다 작은 결과의 '블록해시'값을 찾는게 채굴자가 풀어야될 수학문제입니다. 우선 위의 예제 코드 결과를 보겠습니다.



7_4.png


2편에서 이야기 했던 해시함수에 대해서 기억하시나요? 해시함수는 출력값을 토대로 입력값을 유추할 수 없습니다. 그 이유는 입력된 값의 일부만 변경되어도 전혀 다른 출력값이 나오는 눈사태 효과때문입니다. 즉 target보다 작은 '블록해시'정보를 찾기 위해서 어떤 'nonce'의 값이 필요한지 그 누구도 알 수 없다는 의미입니다.

target 보다 작은 '블록해시'를 구하기 위해서는 nonce정보를 0으로 대입한 후 '블록해시'값을 출력하고 target과 비교합니다. 답이 아니면 다시 1씩 증가시켜 target보다 작은 결과 값이 나올때까지 반복해서 찾을 수 밖에 없습니다. 즉 수학문제를 푸는 과정은 생각보다 단순합니다. nonce를 0부터 대입하여 target보다 작은 블록해시 결과 값이 도출될때까지 무한정 증가시키는겁니다! 그렇기 때문에 이러한 과정을 빠르게 연산할 수 있는 GPU를 활용한 채굴 나아가 asis라는 채굴 전용 칩이 등장하게 된것입니다.


자 어느정도 이해가 되셨나요? 심플하게 다시 정리를 해보자면..


  1. '채굴'은 일종의 보상의 개념이다.
  2. 보상을 받기 위해서는 '미완성 블록'을 '완성된 블록'으로 변환시키는 수학문제를 풀어야 한다.
  3. 수학문제의 정답이 되기 위한 조건은 '블록해시'정보가 'target'정보 보다 작아야 한다.
  4. 해시함수의 특징으로 인해 'target'보다 작은 '블록해시'를 만들어내기 위한 'nonce'의 값은 절대 유추할 수 없다.
  5. 'nonce'의 값을 유추할 수 없기 때문에 'nonce'의 정보를 0부터 1씩 증가하여 답이 맞는지 확인하는 단순 반복작업이 필요하다.


그렇다면 이제 난이도(target)의 값은 무엇이고 왜 필요한지에 대한 의문점이 생깁니다.

다음 포스팅에서는 난이도(target) 값을 어떻게 구하는지 그리고 실제 채굴되는 연산과정의 예제 코드를 PHP로 작성해보겠습니다.

이상 긴글 읽어주셔서 감사합니다!


[참고 자료]
https://jayground8.github.io/what_is_hash_and_mining/
https://bitcoinwisdom.com/bitcoin/difficulty
http://d2.naver.com/helloworld/8237898
http://coinnews.tistory.com/14
http://bithumb.cafe/archives/5214
https://cafe.coinbang.co.kr/bbs_detail.php?bbs_num=63&tb=board_coininfor&b_category=
@twinbraid/2b3hcu

H2
H3
H4
3 columns
2 columns
1 column
15 Comments