[Blockchain]Bitcoin mining step by step

오영주·2021년 12월 21일
2

블록체인

목록 보기
9/10
post-custom-banner

Detailed mining process

  • 비트코인의 분산화된 합의는 네트워크상의 노드들 사이에서 독립적으로 일어나는 아래의 프로세스에 따라 이루어진다.
    1. 모든 full node 가 각 거래에 대해 독립적으로 검증
    2. 작업 증명(PoW) 알고리즘을 이용하여, 마이너들은 검증된 거래들을 새로운 블록에 추가한다.
    3. 모든 노드들이 새 블록을 검증한 후 블록체인에 연결한다.
    4. 모든 노드가 작업증명을 통해 연결한 체인들 중 가장 긴 체인을 선택한다.
  • 위 네 과정을 자세히 보고, 이 과정들이 어떻게 서로 상호작용하는지 확인하자

1. 각 거래의 검증

  • 자세한 검증 과정은 (https://en.bitcoin.it/wiki/Protocol_rules)여기에서 확인할 수 있다. 아래는 이중 몇가지를 가져온 내용이다.
      1. 트랜잭션의 구문과 데이터 구조가 정확한지 확인
      1. 코인 베이스 거래는 전송할 수 없음. 새로운 블록이 생성될 때 보상으로 제공되는 코인 베이스의 경우, 일반적인 거래처럼 다른 노드에게 전송할 수 없다.
      1. 각각의 입력값에 대해, 참조 출력값이 풀 내의 어떠한 거래 내부에 이미 존재한다면 해당 거래는 거부되어야 한다.
      1. 짝을 이루는 거래가 풀에 존재하지 않는 경우 고아 거래 풀에 추가된다.
      1. 각각의 입력값에 대해 참조 출력값은 존재해야 하며, 해당 UTXO가 이미 소비된 상태가 아니어야 한다.
      1. 입력값 금액이 출력값 총액보다 작은 경우 해당 거래를 거절해야 한다.
        입력값이 출력값보다 작을 수 없다.
      1. 새로운 블록에 포함되기에 거래 수수료가 너무 작은 경우, 해당 거래를 거절할 수 있다.

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

profile
data scientist
post-custom-banner

0개의 댓글