블록의 구조

Seungmin Lee·2024년 8월 13일

비트코인의 블록 구조

비트코인의 블록 구조는 크게 헤더, 거래로 나뉨
블록 헤더 외에 블록 크기, 거래 개수도 있으며 거래를 담은 부분을 주로 바디(Body)라고 하며 대부분의 크기를 차지함

헤더

1. 버전(Version)

비트코인이 어떤 버전을 쓰고 있는지.
소프트웨어 프로토콜 업그레이드 추적을 위한 버전 번호

2. 이전 블록 헤더 해시

블록체인을 체인으로 만드는 중요한 개념
N번째 블록을 채굴하려는 노드가 N-1번째 블록을 전송받았을 때, 이전 블록(N-1번째)에 대한 ㅔ헤더 해시를 계산해 헤더에 넣는다는 의미

채굴? 작업증명 과정을 수행하고 댓가로 암호화폐를 지급받는 것
작업증명? 목표값보다 낮은 해시값을 찾기위해 헤더의 값들을 조합하고 nonce를 바꿔가면 대입해보는, 해시값을 찾기위한 행위

3. 타임스탬프

유닉스 타임(1970년 1월 1일) 기준으로 초 단위 해당 블록 채굴 시각을 기록

4. 머클 트리(Merkle Tree)

머클트리가 중요한 이유?

  • 데이터의 유효성 검증을 O (log_2 n)만에 할 수 있음
  • 모든 데이터를 가지고 있지 않아도 머클루트와 머클경로로 해결할 수 있어서 용량 절감이 엄청남

난이도 비트

  • Difficulty: 블록 채굴 난이도, 숫자는 블록 높이에 따라 자동 설정됨

  • Bits: 해당 난이도에 맞는 목표값, 계수와 지수로 이루어져 있음

    Difficulty = MAX_TARGET / current_target

MAX_TARGET은 첫 난이도로서 비트코인 블록체인이 처음 구동될 때 설정된 난이도 갑 1을 의미하며, 4Byte로 1d00ffff라고 표기.
current_target은 목표값,즉 bits.

앞자리의 0의 숫자(Leading Zeros)가 길수록 난이도가 높아짐.
왜? 0의 숫자를 1비트 증가시킬 때마다 검색 공간이 반으로 줄어들기 때문.

논스(Nonce)

이 모든 랜덤한 과정에 있어서 유일하게 변하는 값!
Number + Once 즉, 한번만 쓰이는 숫자!

  1. 채굴자들은 채굴하고자 하는 블록을 위해 우선 바디(트랜잭션)을 준비해둠
  2. 이전 블록이 완성되어 전달받자마자 해당 블록 헤더 해시를 계산하여 논스를 제외한 모든 헤더의 모든 값을 준비
  3. 논스와 목표값을 비교함으로써 채굴 시도

비트코인은 10분에 블록 1개가 생성되도록 자동 난이도 조절이 됨
예를 들어, 블록 1개 생성당 평균 5분이 걸렸다면 난이도 Up, 15분이 걸렸다면 난이도 Down

난이도 및 논스 추가

Block Hash

  • 블록의 식별자 역할
  • 6가지 블록 헤더 정보를 입력값으로 받아 Hash256 해시 함수를 적용해 계산되는 값으로 32바이트의 숫자값
  • 이름은 블록 해시이지만, 실제로는 블록 전체가 아닌 블록 헤더를 해시한 값

거래 정보의 해시값은 해당 거래가 포함된 블록의 머클 해시 계산에 입력값으로 사용되고,
머클 해시는 블록 해시의 계산에 입력값으로 사용됨

블록해시는 다음 블록의 이전 블록 해시값으로 저장되며, 다음 블록의 블록 해시를 계산하는 데 입력값으로 사용됨

따라서, 거래 정보가 변경되면 -> 머클 해시 변경 -> 블록 해시 변경 -> 다음 블록의 블록 해시 변경으로 연쇄적으로 이어짐
블록 해시는 작업 증명의 해답(논스값)을 찾아내야 구할 수 있으므로, 거래 정보를 변경한 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 함

완료된 거래 정보를 변경하려면, 변경하려는 거래 정보가 포함된 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 함. 엄청난 시간이 소요되고, 이 작업이 진행되는 동안에도 다른 노드들에 의해 새로운 블록들도 계속 추가되므로 사실상 완료된 거래 정보의 변경은 현실적으로 불가능

논스와 작업 난이도

논스값의 계산

  • 블록 해시값을 계산할 때 입력값 중 하나
  • 블록 해시값이 특정 숫자보다 작아지게 하는 값
  • 블록 헤더의 6가지 정보 중 확정되지 않아서 값을 변경할 수 있는 유일한 항목

논스값을 1씩 증가시키면서 반복적으로 계산한 블록 해시값이 특정 숫자보다 작은 값이 나오면, 그 때의 논스값으로 계산한 블록 해시가 그 블록의 해시값으로 확정!
블록 해시라는 식별자를 얻은 해당 블록은 새로운 블록으로서 블록체인에 추가되며 작업이 완료.

작업 난이도

블록 해시가 특정 숫자보다 낮게 나올 때의 논스값을 찾는 것이 작업증명(PoW)
작업 난이도는 논스 계산의 어려운 정도이고, 작업 난이도는 블록 헤더 정보에서 난이도 비트(Bits)라는 값으로 조절됨

난이도 비트❓
블록 헤더의 난이도 비트는 논스값을 계산하는데 기준이 되는 숫자이고 블록체인 전체에 걸쳐 일률적으로 적용됨

이더리움 논스

  • 이더리움의 논스는 트랜잭션의 논스(헤더의 논스X)
  • 모든 거래(트랜잭션)은 일회성
  • 거래(트랜잭션) 전송 시 논스는 1씩 증가
  • 트랜잭션은 순서대로. 현재 논스가 1이면 0인 논스를 못보냄
  • 논스가 2인 거래를 전송하려면 논스가 0~1까지 전송한 내역이 있어야 가능
    • 만약 논스가 2인 거래를 전송하면 거래가 처리되지않고 Transaction Pool에 남아있게 되고 이후 0~1까지 전송되면 처리됨
  • 논스는 계정에서 유일함. 동일한 논스는 존재X

논스가 필요한 이유

같은 논스를 가진 여러 트랜잭션이 전송되는 경우 가장 높은 가스비를 지불한 트랜잭션이 처리됨 -> 이중 지불 문제 방지

profile
<Profile name="seungmin" role="frontendDeveloper" />

0개의 댓글