블록체인의 기반인 블록을 채굴(Mining)하는 방법 중 PoW 방식에 대해 알아보자.
PoW (Proof of Work: 작업증명)
말그대로 엄청난 작업을 해서 그 작업을 증명함으로 인해 블록을 채굴하는 방식이다.
그럼여기서 말하는 작업(work)이란 무엇일까?
바로, Nonce
를 찾는 일이다.
PoW 방식에는 난이도 목표값(target value)이라는 것이 존재한다.
이 목표값보다 같거나 작은 block의 hash를 만족시키는 Nonce
를 찾는것이 채굴이다.
해서 채굴자들은 Nonce 를 계속 변경해 가며 block의 hash 값을 목표값보다 같거나 작은 값으로 만들어주는 Nonce를 찾는다.
그 Nonce 값을 찾은 채굴자는 채굴보상과 함께 해당 블록에 기록된 거래수수료(transaction fees) 를 보상받게된다.
실제 PoW 방식을 채택하고있는 비트코인을 예로 들어 설명해보겠다.
https://blockchain.info 라는 사이트에 들어가보면 지금까지 생성된 모든 블록의 정보를 볼 수 있다.
거기서 현재시점에서 가장 최근 블록인 #512706 번째 블록으로 예를 들어보겠다.
위 그림을 보면 Difficulty, Bits, Nonce, Hash 4가지의 값을 볼 수 있을것이다.
- Difficulty는 실제 #512706 블록을 채굴하는데 걸린 난이도 값이고,
- Bits는 난이도 비트(difficulty bits) 값 즉, 목표값을 지수(exponent)와 계수(coefficient)로 나눠서 적어둔 수이다.
- Nonce는 블록 헤더정보의 해시값을 목표값 보다 작은값으로 만들어주는 변경할 수 있는 데이터다.
(엄밀이 말하면 header에 포함된 머클루트도 변경의 여지는 있다. 이는 차후에 설명..) - Hash는 블록 헤더정보(6가지)를 통해 만든 목표값보다 같거나 작은 해시값.
블록의 헤더
- ver (소프트웨어 버전정보)
- prev_block (부모 블록의 해시)
- merkle_root (트랜잭션의 머클트리 탑해시값)
- timestamp (블록의 timestamp)
- bits
- nonce
위 6가지 순서로 byte로 이어준후에
HEX 디코딩 -> SHA256 + digest() 더블해시 -> HEX 인코딩 처리해주면
block의 hash값 구할 수 있다.
그럼 위 내용을 가지고, #512706 블록을 검증해보겠다.
일단, 우리가 만족시켜야하는 목표값을 알아야하는데 목표값은 Bits 값을 통해 구할 수 있다.
target = coefficient * 2**(8 * (exponent -. 3))
** 는 거듭제곱을 의미
1. 10진수로 표시된 Bits 값을 16진수로 변환
391481763 -> 0x175589A3
2. 앞에 두자리인 0x17은 지수, 0x5589A3 은 계수
3. 위 공식에 대입
target = 0x5589A3 * 2**(0x08 * (0x17 - 0x03))
target = 0x5589A3 * 2**(0x08 * 0x14)
target = 0x5589A3 * 2**(0xA0)
4. 10진법으로 변환
target = 5605795 * 2**160
target ≒ 8.192878571041389E54
5. 16진수로 다시 변환
target ≒ 0x0000000000000000005589A30000000000000000000000000000000000000000
계산법에 따라 타겟 목표값이 위와 같이 나온다.
보면, #512706 block의 hash 값이 해당 목표값보다 낮음을 알 수 있다.
위 방법을 통해서 PoW 방식은 Nonce를 찾아 채굴을 하고, 채굴한 순간 해당 블록을 네트워크를 통해 전파시킨다.
전달받은 다른 노드들은, 일련의 검증절차에 따라 블록을 검증하고 유효하면 자신의 체인에 연결하게 된다.
그럼 기존에 채굴하고 있던 것은 멈추고 새로 MEMPOOL (트랜잭션이 모여있는 풀) 에서 데이터를 가져와 새로 채굴을 시작한다.
그럼 동시에 채굴 됐을 때는 어떻게 처리 되는가? 이는 다음 포스팅에서 정리하도록 하겠다.
참조: 비트코인, 블록체인과 금융의 혁신 - 안드레아스 M. 안토노풀로스