안녕하세요,
우리가 흔히 비트코인 채굴하면 어떤 수학문제, 또는 퍼즐을 푸느라 전기를 많이 잡아먹는다고들 하는데,
과연 그게 어떤 행위를 한다는 것인지에 대해 알아보고자 합니다.
문송하지만, 암호학이나 프로그래밍에 대한 배경지식이 없다 보니 채굴이라는 과정을 기술적으로 이해하고 싶었습니다.
그래야 추상적으로만 들리던 블록체인 탈중앙화의 원리를 알 수 있겠다고 생각했기 때문입니다.
그래서 최대한 쉽게 이해되실 수 있도록 한번 설명해 보겠습니다.
먼저 채굴이라는 작업증명방식(Proof of Work, POW)을 이해하기 위해 가장 먼저 이해해야 하는 개념은 ‘해시’ 와 ‘블록’ 입니다.
1. 해시
간단합니다. 해시란 어떠한 Input 값을 넣으면 16진수의 64자리 숫자 배열이 나오는 함수입니다
(16진수는 0~9, a~f 까지의 16가지 숫자를 말함).
즉, 제가 Input 값으로 ‘홍길동’을 넣으면 9C6B9B1B1.... 라는16진수의 64자리 고유한 숫자를 뱉어냅니다.
[그림 1]
여기서 중요한 부분은
- 누구나, 언제나, 어디서나 홍길동의 해시값을 구해도 9C6B… 값이 나온다는 점 (홍길동의 디지털 지문이라고 볼수있음)
- 한 글자만 달라도, 예를들어 ‘홍길동전’을 넣는다면 B8BA08B069B…로 전혀 다른 아웃풋이 나온다는 점 (아웃풋은 랜덤임)
- 홍길동이 아니라 100페이지짜리 홍길동전을 다 넣는다고 해도 아웃풋은 64자리 숫자로 일정하다는 점
(이 개념을 응용한다면 디지털화 된 사진, 동영상 등도 64자리 숫자로 해시화 가능) - 해시값을 가지고 인풋값을 역으로 유추할 수는 없다는점. ( X->Y값은 고정, but Y -> X 값 찾는 것은 불가능, 역상저항성이라고 함)
입니다.
2. 블록
해시의 원리를 이해했다면 블록으로 넘어가 봅시다. 비트코인 네트워크에 있는 하나의 블록 구성은 간단하게 아래와 같습니다.

[그림 2]
실제 블록안에 포함된 정보는 훨씬 더 다양하지만 (난이도, 타임스탬프, 코인베이스 등등), 채굴의 개념을 이해하기 위해서 중요한 부분만 크게 4가지를 말씀드리면,
① 블록넘버: 블록체인의 번호. 1번이면 첫번째 블록을 의미
② 난스: 채굴에 사용될 가장 중요한 숫자 (가장 중요)
③ 자료: 거래장부 내역이 작성되는 곳. 실제 트랜젝션이 일어난 내역을 여기에 담아서 블록화 함
④ 해시: ①+ ②+ ③을 인풋으로 한 해시값
입니다.
자 여기서 채굴이란 무엇인지를 말씀드리겠습니다.
채굴자는 먼저 약 10분동안 발생한 여러 거래 내용들을 모읍니다.
그러면 ① 번의 블록번호와 ③ 번의 거래내용들은 변하지 않는 상수가 되겠죠,
그리고 난스값을 1,2,3,4,5,6,….. 이렇게 하나씩 무차별 대입을 시도합니다.
그럼 난스값을 1씩 증가시킬 때마다 ④ 번 해시값은 계속해서 변화하겠죠?
그러다가, 우연히 해시값이 0000 으로 시작하는 난스값을 먼저 찾게된다면, 바로 그게 채굴에 성공했다라고 보는 겁니다.
이해되셨나요?
예를 들어보겠습니다.
현재까지 100개의 블록들이 연결되있다면, 다음번에 채굴할 블록의 번호는 101이겠죠 (상수)
다음 A가 B에게 1비트코인, C가 D에게 3비트코인을 준 두개의 거래 기록을 블록에 담는다고 하면 (상수)
여기서 논스를 무차별 대입합니다

[그림 3]
여기서 난스가 0일때는 블록+난스+자료의 해시값이 6993f….입니다

[그림 4]
그런데 어떤 채굴자가 31489라는 난스를 대입했더니 블록+난스+자료의 값이 00003d… 이렇게 시작을 합니다.
그러면 이 31489 난스값을 가장 먼저 찾은 채굴자가 채굴에 성공을 하게 되는 것이고, 보상으로 비트코인을 받게 되는 겁니다.
여기서 0000..으로 시작하는 난스 31489를 찾기위해서는 0부터 무차별 대입을 해나가야 하지만, 반대로 난스값을 알고 0000..으로 시작하는지 검증하는 것은 누구나 금방 대입해보면 알 수 있습니다.
이 방식은 내가 에너지를 쏟아서 난스를 찾았다는 사실, 즉 내 작업을 남들에게 증명할 수 있는 방식이라고 해서 작업증명방식(Proof of Work)이라고 하는 겁니다.
0이 4개로 시작하는 난스값을 찾는 것은 제 PC로도 할수있을 정도로 크게 어렵지는 않습니다. 그러나 0의 자리수가 점점 늘어난다면?? 난이도는 기하급수적으로 올라가겠죠?
현재 이 시점에서 비트코인의 난이도는 어느정도일까요? 한번 직접 찾아봅시다.
먼저 https://www.blockchain.com/explorer 사이트로 접속하면 Latest Block의 내용을 볼 수 있습니다.
현재 12월 22일 저녁 9시 50분 시점, 블록넘버는 715244번 입니다 (Height, 높이라고 표현함)

해시값은 000000000000000000092d5eba73c2454ef4ccf72b55ac50e312bf31d056a537 이네요. 즉 첫 19자리 숫자가 0으로 시작해야 하는 난이도 입니다. 이건 제 PC로는 찾기가 어려울 것입니다.
밑으로 내려가면 난스값은 3,967,710,241이라고 나와있습니다.
채굴기에 GPU같은 것들이 쓰이는 이유도 이렇습니다. 난스값을 병렬로 빠르게 때려 넣어서 빨리 0으로 19자리 시작하는 해시값을 찾아내야하기 때문이죠.
우선 이번 글에서는 여기까지 설명 드리도록 하겠습니다
궁금하신 부분 있으시면 댓글 남겨 주시고, 이 내용은 https://youtu.be/zmG380S2_N0 영상을 기반으로 작성했습니다
감사합니다
한가지 궁금한게
왜 해시값이 0000000...으로 시작되는걸 찾아야하는건가요?
약속인걸까요??
이러한 채굴난이도는 0의 자리수를 늘리고 줄이는 것으로 조절이 가능하며, 한 블록의 난스값을 찾는데 약 10분 정도가 소요되도록 알고리즘화 되어있습니다.
만약 채굴경쟁이 심화되서 채굴자들이 많아진다거나, 성능좋은 채굴기를 통해 컴퓨팅 파워가 강해지면 10분보다 빠른 속도로 채굴에 성공하겠죠? 그러면 자동으로 난이도는 올라가도록 설계가 되어있습니다. 반대로 10분보다 오래걸린다면 난이도가 낮아지게 되겠죠 (난이도 조절 쿨타임은 2주)
이 메커니즘을 통해 비트코인 블록 속에 담긴 거래내역들의 보안성과 신뢰성을 담보할 수 있는 것이죠.
예를들어 비트코인을 해킹하고자 마음먹은 사람이 있다고 한다면,
1. 먼저 수십억원의 전기세와 채굴장비를 들여서 채굴에 성공하고, 거래내역들을 조작한다
2. 그렇게 된다면 비트코인의 가치가 떨어질 것이다 (조작된 거래내역이 블록에 박제되기 때문에)
3. 그럼 내가 해킹을 하기위해 투자했던 그 많은 돈들은 다 휴지조각이 되버린다.
4. 따라서 그럴 돈이 있으면 그 돈으로 성실히 거래내역들을 기록해서 비트코인을 받는게 이득이다.
라는 사고실험을 해볼수있습니다.
오늘도 이렇게 새로운 지식을 얻게 됐네요.
그리고 질문 하나만 드리겠습니다.
0이 19개로 시작하는 난이도 일때,
19개까지는 0이고 그 뒷자리는 다른 해시값으로 나오는
또 다른 난스값이 있을 수 있나요?
1. 있을 수 없다.
2. 있을 수 있지만 그 중 가장 먼저 찾은 난스값으로 채굴을 인정한다.
이부분이 궁금하네요.^^
정답은 2번에 가깝습니다. 조금 더 자세히 설명 드리겠습니다.
비트코인 오픈 네트워크 상에는 수많은 채굴자들이 있기 때문에,
A라는 채굴자가 채굴 성공한 다음 블록이 네트워크 모든 노드(사용자)들에게 전파되기 전
저 멀리 있는 다른 채굴자 B도 채굴에 성공하여 두개의 채굴된 블록이 병렬로 가게되는 현상도 발생할 수 있습니다.
그러나 이렇게 2개의 블록체인으로 나뉘는 현상은 일시적이고, 결국 각자의 블록체인 중 더 긴 블록으로 통합되게 됩니다.
만약 A 버전의 블록이 더 길다면, 그쪽으로 통합되서 B 버전의 블록은 A버전으로 통합되는 것이죠.
우리가 비트코인을 거래소 간 송금할 때, 통상적으로 6 컨펌 (Confirmation)을 거쳐야 입금이 완료되는 것도 이 때문입니다.
6 컨펌이란, 내가 송금한 거래내역이 블록에 실리고나서 6개의 블록이 더 붙을때까지를 기다리는 것인데, 이것은 혹시나 동시에 채굴된 다른 짧은 쪽 블록에 내 거래가 실려서 거래가 실리지 않거나 이중지불이 일어날 가능성을 막기 위해서 입니다 ^^
말씀 주신대로, 큰 틀에서는 채굴자 마다 소프트웨어 버전도 조금씩 다르고, 블록에 포함할 트랜잭션이 다르기 때문에 각자 다른 조건에서 해시값을 구하는 것이 맞습니다. 머클트리는 각 트랜잭션 쌍을 해시화하는 것이기 때문에 머클루트 해시값도 당연히 다르겠죠.
다만 본문에서는 ''각 채굴자관점에서 나머지 값을 상수''로 놓고 난스를 때려넣어서 0000~으로 시작하는 값을 찾는다에 방점을 두고 있었습니다. 상수라는 표현에 오해가 있을수있었겠군요.
다음에 기회가 된다면 심화과정으로 머클트리, 코인베이스, 헤더와 바디 등 블록에 실제로 담기는 내용, 노드의 종류 등이 대해 좀 더 다뤄보도록 하겠습니다!