본문으로 건너뛰기

블록

비트코인 네트워크에는 서울에서도 지구 반대편에서도 송금 기록이 계속 만들어집니다. 이 기록을 낱장으로 흩어 두면 어떤 거래가 먼저였는지 정할 수 없고, 같은 돈을 두 곳에 보내려는 이중 지불도 판정하기 어려워집니다.

은행이라면 본점 전산이 거래 순서를 정해 줍니다. 하지만 비트코인에는 그런 본점이 없습니다. 그래서 거래 기록을 일정량씩 묶고, 묶음마다 차례를 새기는 방식으로 전 세계 참여자가 같은 순서에 합의합니다. 이 거래 묶음이 블록입니다.

블록은 장부의 한 페이지입니다

비트코인 전체를 전 세계 사람들이 함께 쓰는 하나의 거래 장부라고 생각해 보겠습니다. 거래가 생기는 즉시 장부에 확정되는 것이 아니라, 현재 펼쳐진 페이지 위에 다른 거래들과 함께 쌓입니다. 이후 페이지를 넘기며 한꺼번에 봉인하면 공식 기록에 포함됩니다.

블록은 이 장부의 한 페이지입니다. 한 블록에는 일정 시간 동안 모인 거래가 담기며, 블록이 생성되면 해당 기록이 장부에 추가됩니다.

블록이 만들어지는 간격은 평균 10분입니다. 정확히 10분마다 시계처럼 하나씩 생성되는 것은 아닙니다. 어떤 블록은 1분 만에 생성될 수 있고, 어떤 블록은 1시간 가까이 걸릴 수도 있습니다. 네트워크는 난도를 조정해 긴 시간으로 보았을 때 평균 간격이 10분에 가까워지도록 합니다.

너무 짧은 간격을 택하면 새 블록 소식이 전 세계에 퍼지기 전에 다음 블록이 나와 혼선이 잦아질 수 있습니다. 반대로 너무 길면 거래가 확정되기까지 오래 기다려야 합니다. 10분이라는 평균 간격은 이 두 가지 불편 사이에서 선택된 값입니다.

블록의 구성

블록은 크게 블록 헤더와 거래 목록으로 나뉩니다.

블록 헤더

블록 헤더는 블록의 표지 정보와 같은 역할을 합니다. 주요 필드는 다음과 같습니다.

  • 버전: 블록의 버전 번호이며, 업그레이드 지원 신호를 보내는 데에도 쓰입니다. 전체 검증 규칙이 이 필드에 담기는 것은 아닙니다. 블록 헤더 명세, BIP9
  • 이전 블록 해시: 바로 앞 블록의 해시값입니다. 이 값으로 블록들이 순서대로 연결됩니다.
  • 머클 루트: 블록에 포함된 거래 목록을 요약한 머클 트리의 루트값입니다.
  • 타임스탬프: 블록과 관련된 시간을 나타내는 값입니다.
  • 난도 목표: 작업 증명에서 충족해야 하는 조건을 나타냅니다.
  • 논스(Nonce): 채굴자가 작업 증명 과정에서 바꾸어 가며 시도하는 값입니다.

블록 헤더에는 블록 본문의 거래 전체를 짧게 요약한 값과 바로 앞 블록의 요약값이 함께 들어갑니다. 특히 이전 블록 해시는 현재 블록이 어느 블록 다음에 이어지는지 보여 주는 연결 고리입니다.

거래 목록

블록의 거래 목록에는 해당 블록에 포함된 거래들이 담깁니다. 첫 번째 거래는 코인베이스 거래로, 채굴자에게 신규 발행 보조금과 거래 수수료를 지급하기 위한 특별한 거래입니다. 그 뒤에 일반적인 비트코인 거래들이 이어집니다.

거래 목록은 블록의 본문에 해당합니다. 블록 헤더가 페이지의 표지 정보라면, 거래 목록은 페이지에 실제로 적힌 기록입니다.

블록은 어떻게 연결되는가

모든 블록은 바로 앞 블록의 해시값을 블록 헤더에 기록합니다. 앞 블록의 내용을 짧게 눌러 담은 지문을 다음 블록이 함께 보관하는 방식입니다. 따라서 각 블록은 자신이 어느 블록의 다음 페이지인지 스스로 보여 줍니다.

과거의 한 블록 내용을 몰래 고치면 그 블록의 해시값이 달라집니다. 그러면 다음 블록에 기록된 원래 해시값과 맞지 않게 됩니다. 그 뒤의 모든 블록도 다시 만들어야 하며, 각 블록의 작업 증명도 다시 수행해야 합니다. 새로 만든 체인이 검증 규칙을 충족하고 기존 체인의 누적 작업량을 넘어서야 다른 노드들이 그 체인을 선택할 가능성이 생기므로, 블록이 계속 쌓일수록 과거 기록을 바꾸기는 어려워집니다. 비트코인 개발자 문서

이 때문에 블록은 단순히 거래를 보관하는 묶음에 그치지 않습니다. 블록끼리 서로 맞물리게 하여 과거 기록을 보호하는 잠금장치 역할도 합니다. 오래된 블록일수록 그 위에 더 많은 블록이 쌓이므로 수정하기가 더 어려워집니다.

블록의 전파와 검증

채굴자가 작업 증명을 충족하는 블록을 찾으면 블록을 네트워크의 다른 노드로 전파합니다. 각 노드는 받은 블록이 규칙에 맞는지 스스로 검사합니다.

블록 헤더의 연결 정보와 작업 증명 조건을 확인하고, 포함된 거래가 유효한지도 살핍니다. 검증을 통과한 블록이라고 해서 경쟁하는 모든 블록보다 즉시 선택되는 것은 아닙니다. 노드는 유효한 체인 가운데 누적 작업량이 가장 큰 체인을 따르며, 경쟁하는 유효한 체인이 있으면 그 조건에 따라 어느 체인을 자신의 활성 체인으로 삼을지 결정합니다. 비트코인 개발자 문서

블록 생성 간격이 평균 10분이라는 점은 카드 결제가 몇 초 만에 끝나는 경험과 비교하면 느리게 느껴질 수 있습니다. 그래서 더 짧은 간격을 선택한 다른 설계도 나왔습니다. 어느 방식이 더 나은지는 속도, 전파 시간, 보안처럼 무엇을 더 중요하게 보느냐에 따라 달라집니다.

정리

블록은 일정 시간 동안 모인 거래를 한 묶음으로 봉인한 장부의 한 페이지입니다. 블록 헤더에는 버전, 이전 블록 해시, 머클 루트, 타임스탬프, 난도 목표, 논스가 들어가며, 거래 목록에는 코인베이스 거래와 일반 거래가 담깁니다.

새 블록은 평균 10분마다 생성되지만 간격은 일정하지 않습니다. 각 블록이 앞 블록의 해시값을 물고 이어지기 때문에 과거의 한 기록을 바꾸면 그 뒤의 연결과 작업 증명을 연달아 다시 계산해야 합니다. 다시 만든 체인이 기존 체인의 누적 작업량을 넘어야 선택될 수 있으므로 과거 변경에는 큰 작업이 필요합니다. 블록은 이러한 연결과 노드들의 독립적인 검증을 통해 비트코인의 거래 기록을 보존합니다.

링크 복사하기X에 공유페이스북에 공유쓰레드에 공유