비트코인(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)이 많아 질수록 난이도가 높다고 말한다.
이 난이도는 채굴 속도에 따라 정해진 공식으로 자동으로 변경되는데 다른 포스팅을 통해 다룰 예정이다.
'Blockchain > 개념원리' 카테고리의 다른 글
DeFi란 무엇인가? 금융 시스템 붕괴와 제도권 안착의 기로에 서다 (0) | 2022.01.06 |
---|---|
ICO(Initial Coin Offering)로 활용되는 ERC-20 토큰 함수 이해하기 (0) | 2021.12.18 |
NFT(Non-Fungible Token) 기본 이해 - 대체 불가 토큰 vs 대체 가능 토큰 (0) | 2021.12.17 |