이전 포스팅에서는 '채굴'이 어떤의미인지에 대해서 간략하게 살펴보았습니다.
이전 포스팅을 읽지 않으셨다면 이전 포스팅을 읽고 오시는것을 추천드립니다!
블록체인 기술에서 '채굴'이 어떤 의미이고 왜 필요한지에 대하여 개념정리를 해봤습니다.
'채굴' 보상은 아래와 같은 시나리오에서 발생합니다.
채굴에 대한 설명을 하기 앞서 우리가 배운 내용을 정리해보겠습니다. (이 정리가 오늘 배울 개념과도 연결됩니다!)
'채굴'과 관련된 용어와 이해야되는 부분이 너무 어렵고, 방대했기 때문에 어디서부터 어떻게 설명을할지 많은 고민이 있었습니다. 우선은 간략하게 개념 위주로 설명을 하고 심도 있게 다시 설명해야 하는 부분은 파트를 나누어서 따로 설명하기로 결정 하였습니다. (혹시 잘못된 부분을 말씀해주시면 언제든지 받아들이고 수정하겠습니다!)
새로운 블록을 생성하고 전파한 댓가의 '보상'으로 비트코인을 지급받는 방식을 '채굴'이라고 설명해드렸습니다. 그리고 '새로운 블록'을 생성한다는 것은'수학문제를 푸는 행위'와 같다고 설명해드렸습니다. 설명에 앞서 수학문제를 푸는 풀이과정을 이해하기 위해서는 반드시 해시함수에 대한 개념을 알고 있어야합니다.
도대체 어떤 수학문제를 푸는것일까요? 우선은 쉽게 이해할 수 있도록 설명하겠습니다.
비트코인 시스템에서는 채굴자들에게 정보가 일부 비어있는 '미완성 블록'을 제공합니다. 이때 비어있는 정보가 'nonce'정보입니다. 채굴자는 '미완성 블록'을 이용하여 비어있는 nonce 정보를 하나씩 변경하면서 수학문제의 답을 찾아야합니다.
수학문제의 답을 찾게되면 '완성된 블록'이 되고 '완성된 블록'을 생성해내면 '보상'을 받기위한 1단계 성립이 됩니다. (답을 찾으면 채굴이 끝난게 아닙니다! 우선은 수학 문제를 풀어내면 '채굴'이 된다고만 생각하세요!)
새로운 블록 즉 '완성된 블록'이 되기 위한 조건은 임이의 'nonce' 정보를 입력하여 출력된 '블록해시' 결과값이 난이도(target)보다 작을 경우 '완성된 블록'이 될 수 있습니다!
이러한 개념을 한마디로 정리하기가 어렵기 때문에 많은 사람들이 쉽게 수학문제를 풀고 문제를 푼 댓가의 보상으로 비트코인을 준다고 설명한 것 같습니다. 하지만 이렇게만 정리하고 넘어가면 안되겠죠? 자세히 살펴봐야합니다!
우선 이해를 돕기 위해 '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 정보가 비어있는 '미완성 블록'은 아래의 그림과 같습니다.
'블록해시' 결과 값을 구하는 공식은 5편에서 설명드렸기 때문에 생략하고 '미완성 블록'의 nonce 정보에 임이의 결과 값을 대입하는 예제 코드를 작성해보겠습니다. (예제는 0부터4까지 nonce의 값을 1씩 증가시키고 블록해시의 결과값을 출력하였습니다.)
'미완성 블록' 이라는 표현을 썻지만 어떤분은 '잠겨있는 블록'이라는 표현을 쓰기도 했습니다. 어쨋든 새로운 블록의 모든 구성 요소는 'nonce'의 정보를 제외하고 알 수 있습니다. 새롭게 만들 블록에 'nonce'의 값을 대입하여 target보다 작은 결과의 '블록해시'값을 찾는게 채굴자가 풀어야될 수학문제입니다. 우선 위의 예제 코드 결과를 보겠습니다.
2편에서 이야기 했던 해시함수에 대해서 기억하시나요? 해시함수는 출력값을 토대로 입력값을 유추할 수 없습니다. 그 이유는 입력된 값의 일부만 변경되어도 전혀 다른 출력값이 나오는 눈사태 효과때문입니다. 즉 target보다 작은 '블록해시'정보를 찾기 위해서 어떤 'nonce'의 값이 필요한지 그 누구도 알 수 없다는 의미입니다.
target 보다 작은 '블록해시'를 구하기 위해서는 nonce정보를 0으로 대입한 후 '블록해시'값을 출력하고 target과 비교합니다. 답이 아니면 다시 1씩 증가시켜 target보다 작은 결과 값이 나올때까지 반복해서 찾을 수 밖에 없습니다. 즉 수학문제를 푸는 과정은 생각보다 단순합니다. nonce를 0부터 대입하여 target보다 작은 블록해시 결과 값이 도출될때까지 무한정 증가시키는겁니다! 그렇기 때문에 이러한 과정을 빠르게 연산할 수 있는 GPU를 활용한 채굴 나아가 asis라는 채굴 전용 칩이 등장하게 된것입니다.
그렇다면 이제 난이도(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=
https://steemit.com/kr/@twinbraid/2b3hcu