Blockchain/개념원리

비트코인의 채굴 원리 (해시 함수, Bits, Nonce, PoW)

DevMonster 2021. 12. 15. 03:13
반응형

비트코인(bitcoin)의 채굴은 어떻게 하는걸까? 왜 채굴이란 단어가 쓰이는지 생각을 해본적이 있는가?

채굴은 광산에서 광석들을 획득하는 행위를 뜻한다.

광석을 찾기 위해 땅을 계속 파내려 가는 과정이 수반된다.

 

비트코인의 채굴(mining)도 일정한 조건이 맞으면, 광석대신 비트코인을 얻게된다.

조건이 맞을 때까지 한 땀 한 땀 파내려 가야한다.

 

채굴 과정을 이해하기 위해선 해시(Hash) 함수의 개념을 알아야된다.

 

해시(Hash) 함수란?

 

임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.

비트코인이 사용하는 해시 함수는 SHA-256 이다.

여기서 SHA는 Secure Hash Algorithm의 축약어이고, 256은 길이 256bit를 뜻한다.

한 글자를 넣어도 1000글자를 입력해도 SHA-256의 출력은 256bit 즉 64자리 문자이다.

예를 들어, devmonster 라는 입력을 SHA-256 변환기로 변환하면 아래와 같은 결과를 출력한다.

(* SHA-256 converter 라고 인터넷에 검색하면 변환기를 찾을 수 있다.)

 

입력: devmonster
출력: bc592e51b42cafa3bf4d6b2c75a84ab2729b3c07ba149cfbdf407c3ab236df0b

 

무슨 의미를 내포하는지 전혀 알 수가 없다. devmonster 라는 입력에서 d만 대문자 D로 변경하면 어떨까?

 

입력: Devmonster
출력: 5572fd34fd7bb2b3dea9c949aaf0bf4462918a82a95d3883a7435f3a222b4a91

 

한 글자만 달라져도 출력 값은 전혀 달라진다.

출력은 임의의 값이며, 원하는 값을 출력하기 위해 어떻게 입력해야 하는지 알 수가 없다.

 

입력: ?
출력: myblognameisdevmonsterhaveaniceday12312312312312312312312312312

 

위와 같이 문장을 담은 출력을 만들 공식이 없는 것이다.

한 땀 한 땀 입력값을 변경하면서 원하는 출력이 나왔는지 확인해야 한다.

이 것이 채굴의 기본원리다. 광산에서 광석을 찾기위해 한 삽 한 삽 파내려 가야하는 과정과 매우 흡사하지 않는가?

 

비트코인에선 어떤 출력이 나와야 채굴에 성공하는 것인가?

일단, 비트코인에서의 해시 함수 입력은 헤더이다.

헤더는 아래와 같은 정보를 가지고 있다.

 

1) 버전
2) 이전 블록의 해시 값
3) 비트코인 거래기록 통합 값
4) 타임스탬프
5) Bits
6) Nonce

 

위의 1) ~ 5) 까지의 값은 SHA-256 해시 함수의 고정 값으로 입력된다.

6)번 Nonce 만 채굴자들이 변경하게 되는데, 목푯값(target)보다 같거나 작은면 채굴에 성공한다.

이 목푯값은 아래와 같은 공식으로 계산된다.

 

목푯값(target) = Bits의 계수 * 2 ^ (8 * (Bits의 지수 - 3))

 

여기서 지수는 Bits의 첫 1 byte, 계수는 이후 3 byte 이다.

 

이해을 돕기 위해 포스팅이 작성되는 순간 채굴된 블록으로 설명해보겠다.

(* 비트코인의 블록을 확인하고 싶으면, bitcoin explorer 라고 검색하면 된다.)

 

현재 Block number는 714145이고, Bits는 386,638,367이다.

바이트 단위로 보기 위해 16진수로 변환한다.

 

Bits 10진수: 386,638,367
Bits 16진수: 170BA21F

 

16진수 한 글자당 4 비트이다. (8 비트 = 1 바이트)

앞에서 두 자리 1바이트인 17이 지수가 되고, 나머지 3 바이트인 0BA21F가 계수가 된다.

이를 각각 10진수로 다시 변환해서 목푯값 공식에 적용해야 한다.

 

Bits 16진수 지수: 17, 가수: 0BA21F
Bits 10진수 지수: 23, 가수: 762399

 

위 값을 목푯값 공식에 대입하면 아래와 같다.

 

목푯값(target) = 762399 * (2 ^ (8 * (23 - 3))) = 1.1142473867994430539355711127781e+54
                   = 1114247386799443053935571112778100000000000000000000000
    16진수  = ba21f0000000100000000000000000000000000000000

 

해당 블록의 해시 값이 목표값 보다 작은지 비교해 보자.

 

목표: 0000000000000000000ba21f0000000100000000000000000000000000000000
해시: 0000000000000000000338bdde63c67aab1204e4541060eaa0f828999300c0e7

 

해시가 목표보다 작은 값임을 확인할 수 있다.

이처럼 랜덤한 해시 출력값을 한 땀 한 땀 목푯값보다 같거나 작은지 비교하는 방식을 통해 채굴을 진행한다.

이를 PoW (Proof of Work) 라고 한다. 동의어는 작업 증명 방식이다.

 

앞에 0 (leading zeros)이 많아 질수록 난이도가 높다고 말한다.

이 난이도는 채굴 속도에 따라 정해진 공식으로 자동으로 변경되는데 다른 포스팅을 통해 다룰 예정이다.

728x90
반응형