[Blockchain]Bitcoin mining step by step
Detailed mining process
- 비트코인의 분산화된 합의는 네트워크상의 노드들 사이에서 독립적으로 일어나는 아래의 프로세스에 따라 이루어진다.
- 모든 full node 가 각 거래에 대해 독립적으로 검증
- 작업 증명(PoW) 알고리즘을 이용하여, 마이너들은 검증된 거래들을 새로운 블록에 추가한다.
- 모든 노드들이 새 블록을 검증한 후 블록체인에 연결한다.
- 모든 노드가 작업증명을 통해 연결한 체인들 중 가장 긴 체인을 선택한다.
- 위 네 과정을 자세히 보고, 이 과정들이 어떻게 서로 상호작용하는지 확인하자
1. 각 거래의 검증
- 자세한 검증 과정은 (https://en.bitcoin.it/wiki/Protocol_rules)여기에서 확인할 수 있다. 아래는 이중 몇가지를 가져온 내용이다.
- 트랜잭션의 구문과 데이터 구조가 정확한지 확인
- 코인 베이스 거래는 전송할 수 없음. 새로운 블록이 생성될 때 보상으로 제공되는 코인 베이스의 경우, 일반적인 거래처럼 다른 노드에게 전송할 수 없다.
- 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 이미 존재한다면 해당 거래는 거부되어야 한다.
- 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아 거래 풀에 추가된다.
- 각각의 입력값에 대해 참조 출력값은 존재해야 하며, 해당 UTXO가 이미 소비된 상태가 아니어야 한다.
- 입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절해야 한다.
입력값이 출력값보다 작을 수 없다.
- 새로운 블록에 포함되기에 거래 수수료가 너무 작은 경우, 해당 거래를 거절할 수 있다.
2. 블록에 추가
- 비트코인 네트워크에 있는 노드들은 peer 로부터 전달받아, 스스로 검증한 transaction 들을 Memory pool(=transaction pool)에 추가한다. 각 transaction 들은 블록에 포함되기 전까지 Memory pool에서 대기하게 된다.
- 간단히 예시로 transaction 이 block 에 추가되는 과정을 보자.
- 위와 같은 block 과 memory pool 이 있을때에 앨리스라는 사람이 비트코인을 이용해 커피 한 잔을 사려고 한다고 가정해보자.
- 앨리스가 커피를 구매할 때쯤, 비트코인 네트워크상에 277314번까지의 블록이 생성되어 있는 상태이다. 이때, 채굴 노드는 다른 노드들처럼 앨리스의 커피 구매라는 transaction을 수집하고 검증하며, 다른 노드들에게 전파하려 할 것이다.
- 노드가 채굴하는 동안 비트코인 네트워크를 통해 277315번째 블록을 전달받을 수 있는데, 이렇게 새로운 블록이 도착했다는 것은 277315번 블록에 대한 경쟁이 끝나고, 다음 번 블록, 277316번 블록을 생성하기 위한 경쟁이 시작된다는 것을 의미한다. 이전 10분 동안 노드는 277315번 블록을 위한 문제를 푸는 동시에, 다음 번 블록에 대비하여 거래들을 수집하고 있었을 것이다.
- 메모리 풀에는 이렇게 수집된 수백 개의 거래가 있다고 가정해보자. 277315번 블록이 도착해서 검증되자마자, 노드는 메모리 풀 내에 있는 거래들 중 277315번 블록에 포함된 거래들을 모두 삭제한다. 이후 남아있는 거래들은 모두 미승인 상태이며, 새로운 블록에 기록되기 위해 대기 중이다.
- 이 미승인 거래들을 기록 하기 위해, 노드는 즉시 비어 있는 블록을 새로 만들며, 이 블록이 277316번째 블록이 될 수 있는 후보가 된다. 이 블록은 아직 증명되지 않아, 유효한 블록이 아니기 때문에 후보 블록이라고 칭하며, 뒤에 설명할 작업증명(PoW) 알고리즘에 대한 솔루션을 찾은 경우에만 유효화된다.
- 따라서 앨리스가 커피를 구입한 것에 대한 거래가 포함된 후보 블록이, 채굴 노드에 의해 채굴되면 비로소 277316번째 블록에 앨리스의 거래가 추가된다.
PoW
- 새로운 블록을 블록체인에 추가하기 위해서는 블록 헤더의 해시를 계산해야 한다. 이 블록 해시값이 블록 내에서 설정한 숫자, 즉 난이도보다 작다면 문제의 해답을 찾은 것이다.
- 해시값은 원본 데이터에 따라 결과값이 달라지게 되는데, 블록 헤더의 필드들 중 nonce를 제외한 나머지 필드는 그 값이 고정되어 있다. 따라서 PoW 알고리즘에서는, 특정 범위에 포함되는 출력값을 얻기 위해, 적절한 nonce 값을 찾는 것이 목표다. 즉, nonce 값은 이 nonce 값을 입력값 중 하나로 취하여 계산되는 블록 해시값이 특정 숫자보다 작아지게 하는 값을 말한다.
- 해시 함수의 특성에 따라 역방향 계산이 어렵기 때문에 특정 결과에 도달할 때까지 nonce 값을 무작위로 바꿔가며 값을 찾아야 한다.
- 이러한 연산은 어렵고 복잡한 연산은 아니지만, 특정 nonce 값을 찾기 위해 기하학적인 횟수의 연산을 실행해야 한다.
Difficulty bit (난이도 bit)
- 위에서 블록 해시값이 특정 숫자보다 작아지게 하는 값을 찾는 과정이 nonce 값을 찾는 마이닝 과정이라고 했는데, 이 특정 숫자는 어떻게 정해지는지 알아보자
- 이 특정 숫자는 난이도 값이라고 불리는데, 블록 헤더 내의 ‘난이도 비트’ 정보에 따라 결정된다.
- 해당 필드는 얼마나 많은 리딩 비트가 0이어야 하는지 나타내는 단위로, 목표값의 0의 개수가 많을수록 난이도가 더 어려워진다. 리딩 0의 숫자를 1비트씩 증가시킬 때마다, 가능한 검색 공간의 크기가 절반으로 줄어들기 때문이다. 이는, 한정된 범위를 만족하는 특정 값을 도출해내는 것이 더 어려워짐을 의미한다.
- 0의 개수가 많아질수록 허용 가능한 범위가 더 작아진다. 따라서 1비트씩 난이도가 상승할 때마다, 솔루션을 찾는 데 걸리는 시간이 기하급수적으로 증가한다.
Difficulty bit 의 조절
- 위에서 말한 난이도는 어떻게, 누가 조정하게 되는지 알아보자.
- 비트코인 네트워크상에서 블록은 10분에 하나씩 블록이 생성되는것을 목표로 하며, 이 생성 주기를 바탕으로 통화 발행 빈도와 거래 정상 속도가 결정된다. 블록의 생성 시간을 10분으로 유지하기 위해서, 채굴의 난이도는 컴퓨터 능력의 증가 속도와 채굴에 참여하는 컴퓨터의 수에 따라 조정하게 된다.
- 난이도 재설정은 풀 노드 전부에서 독립적으로 실행한다.
- 2,016 개의 블록이 네트워크상에 추가될 때마다 노드들은 난이도 목표값을 재설정한다. 난이도 재설정 동작은 다음과 같은 방정식으로 요약할 수 있다.
- 2,016개의 블록이 생성되는데 소요되는 시간이, 평균 시간인 20,160분보다 오래 걸린다면, 채굴 난이도를 낮추고, 적게 걸린다면 채굴 난이도룰 높이는데, 이 난이도 조정에 따라 블록이 생성되는 주기를 10분으로 유지한다. 이 난이도는 노드 별로 다른 값을 가지는 것이 아니라, 블록체인 전체에 걸쳐 일률적으로 적용되는 수치이다.
후보 블록은 어떤 transaction들로 채워지는가
- 블록 내부의 첫 50KB는 우선순위가 높은 거래들에게 할당되고, 블록의 최대 크기 이내의 나머지 공간들은 최고 수수료를 가진 거래부터 우선적으로 선택되게 된다.
- 우선순위
- Transaction 의 우선순위는 소비될 UTXO의 나이를 근거로 정해진다.
- UTXO의 나이는 블록체인에 기록된 이후 지난 시간과 같다. 해당 UTXO가 블록체인상에 얼마나 깊이 파묻혀 있는지를 나타낸다. 나이가 많고 큰 입력값을 가진 UTXO가 나이가 어리고 작은 입력값을 가진 UTXO에 비해 높은 우선순위를 가진다.
- 트랜잭션의 우선순위는 입력값의 가치와 나이의 총합을 거래의 크기로 나누어 계산한다.
- 위에서 언급했듯 블록 내부의 첫 50KB는 우선순위가 높은 거래들에게 할당되어 있기때문에, 수수료 없이도 처리될 수 있다. 그러나 자신이 생성한 거래가 블록에 빨리 포함되길 원하는 경우, 수수료를 높임으로써 시간을 줄일 수도 있다.(나이가 많지 않아도 블록에 포함될 기회를 얻을 수 있기 때문)
블록 생성 보상
- 블록 생성에 대한 보상은 (코인베이스) + (블록에 적힌 transaction 들의 거래수수료)이다.
- 코인베이스
- 이전 글에서, 채굴에 대한 댓가로 비트코인과 거래수수료를 얻을 수 있다고 했었는데, 이때의 블록 생성으로 얻는 코인 보상을 코인베이스(블록을 생성하면서 새롭게 생성된 코인을 의미)라고 부른다.
- 블록에 첫 번째로 추가되는 거래는 특수 형태의 거래로, 생성 거래(transaction) 혹은 코인베이스 거래 라고 부른다.
- 코인 베이스 보상금은 네트워크의 반감 횟수에 따라 결정된다. 최초의 비트코인 코인베이스는 50비트코인이었다. 210,000개의 블록마다 반감기가 한 번 발생하기 때문에, 현재 블록의 높이를 반감기 간격으로 나눔으로써 반감 횟수를 결정할 수 있다. 반감 횟수만큼 보상금이 절반씩 감소한다.
- 거래 수수료
- 거래 수수료의 총액은 거래의 입출력 값을 각각 더한 후, 두 값을 빼서 계산할 수 있다.
3. 블록의 유효성 검증
- 아래 항목들을 충족하지 못할 경우 해당 블록들은 유효성 검증을 통과하지 못한다.
- 해당 블록의 데이터 구조는 문법적으로 유효해야 한다.
- PoW의 원리에 따라, 블록 헤더의 해시값은 사전에 정의된 목표 난이도보다 작아야 한다.
- 해당 블록의 타임 스탬프는 향후 2시간 이내여야 한다.
- 해당 블록의 크기가 허용 가능한 한도 내에 있어야 한다.
- 마지막으로, 블록 내에 포함되는 제일 첫 거래는 코인베이스 생성거래여야 한다.
4. 가장 긴 체인의 선택
- 비트코인 합의 메커니즘의 마지막 단계는 블록을 체인 안에 모아 가장 많은 작업 증명을 보유하고 있는 체인을 선택하는 것이다.
- 노드가 새로운 블록을 검증하고 나면, 해당 블록을 기존의 체인에 연결함으로써 체인을 연장하려고 한다. 블록체인에는 메인 블록체인에서 나와 브랜치를 형성하는 2차 체인이 존재한다. 누적 난이도가 가장 큰 값을 가진 블록들로 구성된 체인이면 어떠한 것이라도 메인 체인이 될 수 있다. 대부분의 경우, 가장 많은 블록으로 연결된 체인이 메인 체인이 된다.
- 블록체인 네트워크상에서 동시에 둘 이상의 새로운 블록이 생성되면, 블록체인의 분기(fork)가 발생하게 된다.
- 이 그림과 같이, 네트워크상에 2개의 블록이 동시에 생성되었다고 가정해보자. 네트워크상에 같은 높이로 존재하는 두 블록을 각각 초록색과 주황색으로 표시했다. 이 블록들은 가까운 이웃 노드들에게 전파된다.
- 이 상태에서, 한 노드의 마이닝에 의해 초록색 블록을 부모 블록으로 가지는 새로운 검정색 블록이 생성되었다고 해보자.
- 이 검정색 블록이 네트워크상에서 전파되어 나가다가, 주황색 노드가 체인에 연결된 노드를 만나게 될 것이다.
- 주황색 블록이 체인에 연결되어 있는 노드들의 경우, 새롭게 전달받은 검은색 블록의 부모 블록인 초록 블록이 존재하지 않기때문에, 이러한 경우 블록체인의 분기가 발생한다.
- 주황색 블록을 연결하고 있던 노드의 경우는 그림과 같이 분기된 체인을 형성하게 된다. 이때 주황색 체인이 2차 체인으로 변경되고, 더 긴 길이를 가지는 녹색-검은색 블록을 메인체인으로 연결하게 된다.
- 2차 체인으로 분류된 주황색 블록은 녹색-검정 블록이 메인체인으로 연결됨에 따라 고아 블록이 된다.
고아블록(orphan block)
- 유효한 블록이긴 하지만, 부모 블록이 현 체인에서 발견되지 않는 블록을 고아 블록이라고 한다. 기록은 있으나 메인체인에서 유지되지 않기 때문에 아무런 의미를 지닐 수 없는 블록이다.
- 분기된 두 체인에서 동시에 블록이 생성되어 연결되는 경우가 있을 수 있다. 이 경우, 두 체인은 체인을 더 길게 연결하려는 경쟁을 하게 되는데, 이 경쟁에서 승리해 더 긴 체인을 유지하는 체인이 메인체인이 된다.
- 그렇다면, 주황색 블록(고아블록)에 포함된 거래들은 어떻게 되는 것일까?
- 생성된 거래들은 네트워크 전체로 전파되기 때문에, 주황색 블록에 포함된 거래들은 이미 녹색 또는 검은색 블록에 포함되었거나 추후에 포함될 것이다.
- 거래 자체가 유효하기만 한다면, 시간이 걸릴 뿐 반드시 블록에 포함되게 된다.
컨퍼메이션(confirmation)
- 컨퍼메이션은 특정 트랜잭션이 블록에 포함된 이후 몇 개의 블록이 뒤에 더 추가되었는지를 알려주는 지표이다. 컨퍼메이션이 충분히 크다는 것은, 이 트랜잭션은 충분히 오랫동안 변동 없이 블록에 보관되어왔기 때문에, 취소될 가능성이 적다라는 것을 의미한다.
- 1 컨퍼메이션은 해당 거래가 블록에 포함되어 블록체인에 연결되었음을 나타낸다. 체인이 분기된 경우, 분기된 체인 중 하나의 체인이 확실히 메인 체인으로 선택되기까지의 기준을 6 컨퍼메이션으로 정하고 있다. 두 체인이 경쟁하게 된다 하더라도 새로운 블록이 6개가 추가로 생기기 전에 경쟁이 끝나게 됩니다.
- 따라서, 자신이 생성한 거래가 포함된 블록이 체인에 연결된 이후 6 컨퍼메이션을 가진다면, 해당 블록이 추후에 버려질 가능성이 없다는 것을 의미한다.
Reference