이번 글의 선수지식으로는 비트코인의 transaction과 block에 대한 개념을 알고 있어야 합니다.
비트코인의 블록구조: up-to-date-items.tistory.com/95
비트코인이 어떻게 채굴되는지에 앞서 여러 기본 지식을 먼저 알아보겠습니다.
우선 비트코인이 한정된 수량(2100만개)이란 것은 모두가 알 것입니다. 그런데 많은 사람들이 잘못 알고 있는 사실이 하나 있습니다. 2100만개의 비트코인이 모두 채굴된 후에는 채굴로 얻는게 아무것도 없다는 것입니다. 이는 잘못된 사실입니다.
채굴에서 얻을 수 있는 것은 채굴로 인한 새로운 비트코인뿐만 아니라 블록내의 transaction fee들도 얻을 수 있습니다.
즉, 2100만개의 채굴이 끝나더라도 채굴자들은 블록내의 수수료로 이득을 취합니다.
비트코인의 경우 초창기에는 한 블록을 채굴할때마다 50개의 비트코인을 얻었는데 210,000개의 블록마다 (약 4년) 반감기가 존재하므로 시간이 많이 지날수록 채굴로 얻는 새로운 비트코인 보다는 채굴로 얻는 수수료가 더 높아질 것입니다.
* 반감기란 채굴로 얻는 새로운 비트코인의 개수가 절반으로 줄어드는 것을 뜻합니다.
채굴이란 transaction들을 모아서 새로운 블록을 만드는 것입니다. 그럼 우선 transaction들을 모아야겠죠? 이 transaction들을 모아놓는 곳을 memory pool 또는 transaction pool이라고 부릅니다. (이 글에서는 memory pool이라고 부르겠습니다.)
예를 들어 Alice라는 Full Node가 있다고 가정해보겠습니다. Alice는 여러 transaction들을 각 transaction이 유효한 transaction인지를 확인하는 여러 규칙과 비교해보고 맞으면 memory pool에 집어넣습니다.
그리고 블록생성을 위한 계산을 합니다. (이 계산은 아래에서 자세히 알아보겠습니다.) 이 계산을 다른 노드들보다 빨리 해낸다면 Alice는 memory pool에 있는 transaction들로 블록생성을 완료하고 나머지 노드들에게 자신이 블록생성을 했다고 알립니다.
여기서 Kane이라는 노드가 있다고 가정해봅시다. Kane역시 여러 transaction들을 memory pool에 담으며 블록생성을 위한 계산을 하고 있었는데 Alice가 먼저 계산을 끝내고 블록생성을 완료해서 새로운 블록을 받았다고 해봅시다. 그럼 Kane은 새로운 블록의 transaction들과 자신의 memory pool에 있는 transaction들을 비교하여 이미 새로운 블록에 들어있는 transaction들은 제거합니다.
위에서 채굴로써 얻는 수익은 새로운 비트코인뿐 아니라 transaction들의 수수료도 얻을 수 있다고 하였습니다. 그렇다면 채굴자들은 높은 수수료가 있는 transaction들을 위주로 memory pool을 구성할 가능성이 높습니다. 그래야 블록을 생성했을 때 자신이 얻는 수익이 더 높아질테니까요. 그러므로 비트코인 송금시에 적당한 수수료를 지불해야 나의 transaction이 빠른시간안에 반영될 것입니다.
이제 어떤 계산을 통해 채굴이 이루어지는지 알아보겠습니다.
비트코인의 블록헤더에는 Target과 Nonce가 들어있습니다.
Nonce는 아직 결정되지 않은 숫자입니다. (Target은 이미 결정되어 있습니다.)
채굴은 block header를 SHA-256 함수에 넣어서 나온 값이 Target과 같거나 낮으면 됩니다. Target은 4bytes이며 앞에 몇개의 자리수가 0으로 나타내어집니다. 예를 들면 0000F2423... 이런식입니다.
위의 예시처럼 Target이 0000F2423... 이라면, 채굴자는 block header SHA-256함수에 넣어서 나온값이
00000A32424F... 이런식이면 채굴에 성공하고 블록생성을 하게 됩니다.
왜냐하면 현재 SHA-256을 통해 나온 값은 앞자리 0이 5개이므로 앞자리 0이 4개인 Target보다 낮은 숫자이기 때문입니다.
(*Target값과 같아도 채굴에 성공합니다.)
그런데 block header에서 Nonce는 아직 결정되지 않은 숫자라고 했습니다. 즉, 채굴자는 Nonce 값을 조절하면서 Target보다 낮은 값을 찾을 수 있습니다. 예를 들어보겠습니다.
block header에서 Previous Block Hash, Version, Merkle Root 등의 정보가 있습니다. 이 정보들과 155라는 Nonce값을 SHA-256 함수에 집어넣으면 어떠한 값이 나오겠죠? 그런데 그 값이 Target보다 낮으면 채굴자는 이번에는 이 정보들과 2555라는 Nonce값을 SHA-256 함수에 넣어보는 겁니다. 이런식으로 Nonce값을 조절하면서 Target보다 낮은 값을 만들어내면 채굴에 성공하게 됩니다.
**하지만 Nonce값은 4 bytes입니다. 즉, 32비트이므로 unsigned int를 적용시 최대값은 약 42억정도 입니다. 여기서 이런 의문이 들 수 있습니다. 42억정도면 최근 기술로 봤을 때 금방 연산 가능할거같다고 말입니다. 이런 부분에 대해서는 채굴 심화편에서 다루겠습니다.
이번에는 난이도 조절에 대해 알아보겠습니다.
비트코인은 평균 10분마다 채굴이 되는 것을 목표로 난이도를 재설정하게 되는데 이 난이도는 2016개의 블록마다 재설정됩니다. 대략 2주의 기간인데 2주마다 블록생성시간을 확인해보고 평균값이 10분보다 빠르다면 난이도를 높이고 10분보다 느리다면 난이도를 낮추게 됩니다.
난이도를 높인다는 것은 Target값을 더 내리는 것입니다. 예를 들어 기존 난이도가 앞에 5개의 자리수가 0인 것보다 작은 값을 찾는것이였다면 6개의 자리수가 0인 것보다 작은 값을 찾게 만들면 난이도는 더 올라가게 됩니다.
예를 들어 1부터 1억까지 적혀있는 제비뽑기 종이가 있다고 가정하면 1000만보다 낮은 숫자를 뽑을 확률보다 1만보다 낮을 숫자를 뽑을 확률이 훨씬 낮기 때문입니다.
이렇게 어떤 노드가 채굴에 성공하면 자신이 채굴을 성공했다는 것을 주변 노드들에게 전파하고 주변 노드들은 유효한 채굴인지 검증을 하고 검증에 성공하면 그 블록을 연결시킵니다.
여기까지 비트코인의 채굴의 기본원리에 대해 알아보았습니다. 조금 더 자세히 알아보고 싶으신 분은 아래 링크를 참고하시길 바랍니다.
채굴심화: <링크>
'Bitcoin' 카테고리의 다른 글
비트코인의 orphan block (0) | 2021.03.21 |
---|---|
비트코인의 지갑 (0) | 2021.03.19 |
비트코인에서의 Base58 인코딩 (0) | 2021.03.18 |
비트코인의 머클트리(Merkle Tree) (0) | 2021.03.17 |
비트코인의 블록구조와 체이닝 (0) | 2021.03.17 |