Tech Lab4 min read

비트코인 내부 구조, 한 번에 연결하기: UTXO → 트랜잭션 → 블록 → 머클 트리 → 노드

비트코인의 핵심 구성요소(UTXO, 트랜잭션, 블록, 머클 트리, 노드)를 “왜 이렇게 연결되는지” 흐름으로 설명해 큰 그림을 잡게 해주는 필러 글.

#bitcoin#utxo#transaction#block#merkle#tree#merkle#root#node#blockchain#basics

비트코인을 처음 공부할 때 제일 답답한 순간이 있다.
UTXO를 이해한 것 같다가도, 트랜잭션을 보면 갑자기 헷갈리고, 블록 구조로 넘어가면 “이게 왜 필요하지?”가 된다.
그런데 사실 이건 다 따로따로가 아니라, 한 줄로 이어지는 흐름이다.

UTXO(잔돈 조각) → 트랜잭션(조각을 쓰는 규칙) → 블록(기록 묶음) → 머클 트리(묶음의 무결성 요약) → 노드(규칙을 실행하고 검증하는 사람들)

이 글은 그 연결을 한 번에 잡는 데 목적이 있다. 정의를 길게 외우기보다, “왜 이렇게 설계됐는지”가 보이면 디테일은 따라온다.


1) UTXO는 “잔고”가 아니라 “쓸 수 있는 조각들”이다

이더리움처럼 “계정 잔고가 3 BTC”라고 적혀 있는 방식이 아니라, 비트코인은 쓸 수 있는 조각(UTXO: Unspent Transaction Output) 들이 남아 있고, 그 조각을 모아서 결제한다.

예를 들어 내가 0.3 BTC짜리 UTXO 하나와 0.8 BTC짜리 UTXO 하나를 가지고 있다면, 비트코인 세계에서 내 ‘잔고’는 사실상 다음처럼 생긴 셈이다.

  • 0.3 BTC 조각 1개
  • 0.8 BTC 조각 1개

여기서 중요한 감각은 이거다.

  • 잔고 = 숫자 한 칸이 아니라
  • (내가 잠금 해제할 수 있는) 조각들의 합

2) 트랜잭션은 “조각을 소비하고, 새 조각을 만든다”

비트코인 트랜잭션은 단순히 “A가 B에게 1 BTC 보냄”이 아니다.
UTXO 관점으로 보면 트랜잭션은 이렇게 동작한다.

  • 입력(Input): 내가 가진 UTXO 조각들을 꺼내서 쓴다
  • 출력(Output): 받는 사람에게 갈 새 UTXO 조각을 새로 만든다
  • 그리고 남는 돈은 보통 거스름돈(Change) 이라는 이름으로 “내 주소로 돌아오는 새 UTXO”가 된다

감각을 잡는 예시

내가 0.8 BTC짜리 UTXO 하나를 가지고 있고, 친구에게 0.5 BTC를 보내고 싶다고 하자.

그러면 트랜잭션은 보통 이렇게 된다.

  • Input: 0.8 BTC UTXO 1개(내가 서명으로 잠금 해제)
  • Output:
    • 0.5 BTC (친구의 새 UTXO)
    • 0.29 BTC (내 거스름돈 새 UTXO)
  • 수수료(Fee): 0.01 BTC (Output 합이 Input보다 작을 때 차이가 수수료)

여기서 수수료는 “따로 보내는 값”이 아니라 입력 합 - 출력 합의 차이로 자연스럽게 생긴다.


3) ‘서명’은 트랜잭션을 허용하는 열쇠고, 스크립트는 규칙이다

비트코인에서 “내가 이 조각을 쓸 자격이 있다”는 걸 증명하는 방식이 서명이다.
그리고 그 자격을 어떻게 확인할지는 스크립트(scriptPubKey / scriptSig)로 정의된다.

초보자가 자주 하는 오해는 이거다.

  • “비트코인은 스마트 컨트랙트가 없으니까 규칙이 없다”
    → 규칙은 있다. 다만 제한적인 스크립트로 설계되어 있을 뿐이다.

(이 글에서는 스크립트 디테일을 깊게 파기보다, 흐름을 잡는 데 집중한다.)


4) 블록은 “검증된 트랜잭션 묶음”이고, 헤더는 요약 정보다

블록은 크게 두 덩어리로 이해하면 편하다.

  • 블록 헤더(Header): 이 블록을 대표하는 요약 정보
  • 블록 바디(Body): 트랜잭션 목록(및 관련 데이터)

헤더에는 대략 이런 것들이 들어간다(이름을 외우는 게 핵심은 아님).

  • 이전 블록 해시(체인으로 연결하는 고리)
  • 머클 루트(이 블록 안 트랜잭션들의 요약 해시)
  • 시간, 난이도, 논스(채굴/검증과 관련)

즉, 블록 바디에 트랜잭션이 잔뜩 있어도,
헤더만 보면 “이 블록이 무엇을 대표하는지”를 빠르게 확인할 수 있다.


5) 머클 트리는 “트랜잭션 전체를 한 줄 요약”하는 구조다

머클 트리는 왜 필요할까?

블록 안에 트랜잭션이 2,000개가 있을 때, 어떤 트랜잭션 하나가 블록에 포함되어 있는지만 확인하려고 2,000개를 다 받아야 한다면 너무 비효율적이다.

머클 트리는 트랜잭션들을 해시로 만들고, 그 해시들을 두 개씩 묶어 또 해시하고, 이 과정을 반복해서 최종 루트(머클 루트) 하나로 압축한다.

머클 트리가 주는 실용적인 이득

  • “이 트랜잭션이 이 블록에 들어있다”를 증명할 때
  • 전체 트랜잭션을 다 받지 않고도(혹은 일부만으로)
  • 머클 증명(merkle proof) 만으로 확인이 가능해진다

이게 SPV(가벼운 검증) 같은 개념과 연결된다. 즉, 머클 트리는 “보안”뿐 아니라 “확장성/효율”을 위한 설계이기도 하다.


6) 노드는 이 모든 규칙을 실행하고 “안 되는 건 안 된다”라고 말하는 존재다

노드는 단순히 블록을 저장하는 서버가 아니다.
노드는 다음을 한다.

  • 트랜잭션이 규칙에 맞는지 검증한다(서명/UTXO 소비/중복 소비 등)
  • 블록이 규칙에 맞는지 검증한다(난이도/형식/머클 루트 등)
  • 유효한 데이터만 다른 노드에 전파한다
  • 유효하지 않은 데이터는 버린다

그래서 비트코인 네트워크의 신뢰는 “누군가 착해서”가 아니라, 노드들이 규칙을 강제하기 때문에 성립한다.


7) 머릿속에 남겨야 할 한 문장

비트코인을 한 문장으로 요약하면 이렇게 말할 수 있다.

비트코인은 UTXO 조각을 트랜잭션으로 소비하고, 그 기록을 블록으로 묶고, 머클 루트로 요약한 뒤, 노드들이 규칙으로 검증하며 유지되는 시스템이다.

이 한 문장이 자연스럽게 떠오르면, UTXO/트랜잭션/블록/머클/노드가 더 이상 따로 노는 개념이 아니다.


자주 묻는 질문(짧게)

Q1. 왜 “계정 잔고”처럼 단순하게 안 하고 UTXO를 쓰나요?

UTXO 방식은 “조각을 소비한다”는 모델이라, 거래 검증과 추적이 명확해지는 장점이 있다.
대신 사용자 입장에서는 거스름돈 개념 때문에 구조가 더 복잡해 보일 수 있다.

Q2. 수수료는 어디에 적히나요?

대부분의 경우 “수수료”라는 별도 필드가 있는 게 아니라
입력 합 - 출력 합의 차이가 수수료가 된다.

Q3. 머클 트리랑 해시는 둘 다 무결성 아닌가요?

해시는 기본 도구이고, 머클 트리는 해시를 “트리 구조로 조직”해서
부분 증명(머클 증명)을 가능하게 만든다.

참고 링크

다음으로 읽어볼 글