Post

비트코인

블록체인의 원형을 이해한다.

비트코인

Bitcoin

비트코인을 제대로 이해하려면 “디지털 금”이나 “송금 수단”이라는 관점보다 먼저 분산 합의 시스템(Distributed Consensus System) 으로 봐야 한다.

비트코인의 핵심 문제는 다음과 같다.

1
2
3
인터넷에서는 파일을 복사할 수 있는데, 돈은 복사되면 안 된다.

중앙기관 없이 누가 진짜 돈을 가지고 있는지 어떻게 증명할 것인가?

1. UTXO 모델

대부분 사람들은 계좌 방식(Account Model)으로 생각한다. 하지만 비트코인은 사용하지 않은 거래 출력(Unspent Transaction Output)들의 집합이다.

비트코인은 “계좌 잔액”을 저장하지 않는다. 대신 네트워크 전체가 다음을 추적한다.

1
누가 어떤 UTXO를 사용할 권한이 있는가?

1.1 계좌 모델과 UTXO 모델의 차이

1.1.1 계좌 모델

은행이나 이더리움 방식에 가깝다.

  • A의 잔액 = 10 BTC
  • B의 잔액 = 0 BTC

A가 B에게 3BTC를 보내면:

  • A 잔액: 10 → 7
  • B 잔액: 0 → 3

장부가 “잔액”을 직접 수정한다.(잔액 데이터를 기준으로 관리됨)

1.1.2 UTXO 모델

비트코인은 잔액을 수정하지 않는다. A가 가진 것은 잔액이 아니라 여러 개의 UTXO다.

1
2
3
4
5
6
A의 UTXO
- 5 BTC
- 3 BTC
- 2 BTC

합계 = 10 BTC

A가 B에게 4 BTC를 보내려면, 기존 UTXO 중 일부를 입력값(Input) 으로 사용한다.

1
2
3
4
5
6
7
입력:
- 5 BTC UTXO

출력:
- B에게 4 BTC
- A에게 거스름돈 0.9999 BTC
- 수수료 0.0001 BTC

기존 5 BTC UTXO는 완전히 소비된다. 대신 새로운 UTXO 두 개가 생긴다.

1
2
B의 새 UTXO = 4 BTC
A의 새 UTXO = 0.9999 BTC

1.2 핵심 원칙: UTXO는 쪼개 쓰지 않는다

UTXO는 일부만 사용할 수 없다. 사용할 때는 통째로 소비된다.

현금과 비슷한데 5만원으로 3만원 물건을 사면 5만원은 사라지고 3만원 결제에 2만원 거스름돈이 생긴다. 이와 같은 원리이지만 차이점은 수수료가 빠진다는 점이다.

2. Proof of Work

계산하기는 어렵지만 검증하기는 쉬운 문제를 사용해, 블록 생성 권한과 네트워크 보안을 결정하는 합의 방식.

비트코인에서 PoW는 단순히 채굴 방식이라기 보단 다음 요소를 동시에 담당한다.

  • 신규 BTC 발행
  • 거래 순서 결정
  • 블록 생성자 선정
  • 이중지불 방지
  • 체인 재작성 비용 증가
  • 검열 저항성 확보

2.1 신규 BTC 발행

채굴자가 블록을 만들면 특별한 거래를 하나 생성할 수 있다. 이를 Coinbase Transaction이라고 한다. PoW는 성공 시 입력값(송금)이 없어도 예외적으로 돈을 “창조”한다.

즉 PoW가 화폐 발생 권한을 배분하는 역할을 한다.

2.2 거래 순서 결정

핵심은 PoW 자체가 직접 순서를 정하게 되는 것이 아니라, 채굴된 블록이 순서를 확정(합의)한다는 것

예를 들어 아래의 2개의 거래가 동시에 네트워크에 퍼질 수 있다면 어느 거래가 먼저일까?

  • A가 B에게 1 BTC 전송
  • A가 C에게 같은 1 BTC 전송

채굴자가 블록을 만들 때 아래와 같이 거래를 순서대로 포함시킨다. 여기서 순서라는 것은 먼저 전송 버튼 누른 거래가 아닌 먼저 네트워크에 도착한 거래를 의미한다.

1
2
3
4
Block 100
 ├─ Tx1
 ├─ Tx2
 └─ Tx3

그런데 만약 두 채굴자가 동시에 블럭을 만들게 되면 포크 발생하게된다. 앞선 블럭에 이어서 두개의 체인이 만들어지는 것을 의미한다. 여기서 다음 블럭을 만들 때 나눠진 2개의 체인 중 하나에 속하게 되는데 그렇게 되면 속하지 않은 체인을 폐기된다.

그러면 여기서 폐기된 체인안의 블럭들은 고아 블록(Orphaned Block) 또는 Stale Block이 된다. 만약 고아 블럭 안의 거래들이 다른 곳에 없는 정상 거래들이라면 이런 거래들은 다시 미확정 상태가 되어(mempool 안에 들어감) 다음 블럭에서 다시 채굴될 수 있다. 당연히 이미 다른 블럭에 포함된 거래라면 그냥 없어져도 된다.

하지만 이중지불 거래가 발생할 수도 있는데 만약 아래와 같이 무효가 된 거래가 이미 사용된 UTXO라면?

1
2
3
4
5
6
7
8
9
10
11
12
13
100A:
Tx1
Alice → Bob 1 BTC

100B:
Tx2
Alice → Charlie 1 BTC

둘 다 같은 UTXO를 사용한다고 가정(UTXO X 를 두 거래가 동시에 소비)

100A가 승리하면 UTXO 소비 완료(사라짐)

그 순간 Tx2는 무효가 된다.
1
2
3
4
5
6
7
100B 폐기
↓
Tx2 mempool 복귀 시도
↓
이미 사용된 UTXO 발견
↓
거부

즉:

  1. UTXO 상태 롤백
    • 100B가 만든 UTXO 제거
    • 100B가 소비한 UTXO 복구
  2. 100A 체인 적용
    • 100A, 101A 적용
  3. 100B 거래 재검사
    • 거래 유효성 검사(유효하면 Mempool 재투입) 채굴될 수 있음
    • 무효하면 폐기

이러한 문제는 6컨펌을 기다리면서 해소할 수 있는데:

1컨펌은 99 -> 100A 수준으로 100B와 같은 경쟁 체인이 나타날 수 있습니다.

하지만 6컨펌이면 이미 100A~105A까지가 쌓인 상태로 이걸 뒤집으려면 엄청난 해시파워가 필요합니다. 그래서 사실상 확정 상태로 간주할 수 있습니다.

6컨펌이라는 건 “내 거래가 포함된 블록 위에 추가로 5개의 블록이 더 쌓여서, 총 6개의 블록 깊이(depth)를 갖게 된 상태”를 의미한다. 6컨펌이면 공격자는 6블럭 이상을 따라잡아야한다.

2.3 블록 생성자 선정

비트코인에는 선거도 없고 대표자도 없기 때문에 미확정 거래들로 누가 블록을 만들지를 합의하는 알고리즘을 만들 필요가 있다. PoW는 “누가 먼저 정답 해시를 찾았는가”로 결정하게 되는데 이는 아래와 같이 무작위 추첨기를 제공함으로써 합의 알고리즘을 제공한다.

1
2
3
4
5
6
7
8
9
보유 해시 파워 비율
A = 10%
B = 30%
C = 60%

블럭 생성 확률
A : 10%
B : 30%
C : 60%

2.4 이중지불 방지

PoW 체인에서는 기본적으로 먼저 블록에 포함된 거래를 채택합니다. 본질적으로 이중지불 방지는 이 UTXO가 이미 사용되었는가를 검증하는 것이다. 송금에 필요한 UTXO는 소멸될 것이고 그러면 같은 UTXO를 사용한 거래는 무효가 되기 때문이다.

그러면 왜 PoW가 필요할까?

예를 들어 아래와 같이 네트워크가 둘로 나뉘어 졌다고 했을때 두 거래는 같은 UTXO를 사용하게 된다.

1
2
3
4
5
Tx1
Alice → Bob

Tx2
Alice → Charlie

이 시점에서는 노드 A의 Tx1도 유효하고 노드 B의 Tx2도 유효하다 왜냐하면 아직 블록에 포함되지 않았기 때문이다. 즉 내가 BTC를 과하게 사용했다는 것을 미확정 상태에서는 전 세계가 합의하지 않았다고 볼 수 있다. 정확하게는 같은 BTC를 두 번 쓰려고 시도할 수 있다

일반적으로 지갑에서는 UTXO를 잠그기 때문에 일반적 사용자는 이런 상황을 잘 만들 수 없지만 악의적으로 개발자가 직접 거래를 조작하거나 다른 지갑 프로그램을 사용하게 되면 같은 UTXO 사용 거래를 네트워크에 동시에 뿌릴 수 있다. 그래서 0-confirmation이 위험하다.

예를 들자면 Double Spend Attack을 예로 들 수 있는데 아래와 같다.

1
2
3
4
5
6
7
상점에서
Tx1
5 BTC → 상점

실제로 채굴된 블록에는
Tx2
5 BTC → 공격자 자기 지갑

그런데 6-confirmation도 완벽하지는 않다. 왜냐하면 보통 비트코인 기준으로 평균적으로 10분에 1블록이 생성되는데 6-confirmation이면 1시간이 걸려서 확정이 된다. 이렇게 되면 내가 상품을 결제할때 까지 최소 1시간이 걸린다는 뜻이다.

그래서 현실에서는

  1. 소액 오프라인 결제: 0컨펌 감수, 그냥 카드 결제
  2. 중간 금액 결제: 위험도에 따라 1~2 컨펌
  3. 고액 결제: 6컨펌

그래서 비트코인 결제망은 느리지만 강한 정산망에 가깝다. 그래서 송금 거래가 발생하면 예치금처럼 모아뒀다가 확정되면 정산하는 방식이 유효하다.

3. Full Node / Light Node

비트코인 네트워크에서 노드(Node)는 비트코인 프로토콜을 실행하며 블록과 거래를 검증하거나 전달하는 참여자

노드(Node)는 사람이나 조직이 아니라 “비트코인 소프트웨어가 실행되는 컴퓨터

비트코인 생태계에서 특정 주체가 노드의 역할을 맡는 것은 아니다. 누구나 노드를 운영할수 있다. 하지만 현재 Full Node를 운영하는 주체들을 대략 다은과 같다.

  • 개인 사용자
  • 비트코인 개발자
  • 거래소
  • 수탁업체(Custodian)
  • 채굴풀 운영자
  • 기업
  • 결제 서비스 사업자
  • 지갑 서비스 제공자

예를 들면 Coinbase, Kraken 같은 거래소들은 입출금 검증을 위해 자체 Full Node를 운영합니다.

3.1 Full Node

비트코인의 모든 규칙을 직접 검증하는 노드

즉 다른 사람을 믿지 않고 다음을 스스로 확인한다.

  • 이 거래가 실제로 유효한가?
  • 이미 사용된 코인을 또 쓰는 것은 아닌가?
  • 블록 보상이 규칙보다 많이 발행되지 않았는가?
  • 난이도 조정, 블록 크기, 서명, UTXO 규칙이 맞는가?
  • 체인이 비트코인 합의 규칙을 따르는가?

Full Node는 보통 전체 블록체인 데이터를 다운로드하고 검증한다. 여기서 중요한 점은 Full Node는 채굴기각 아니다 라는 점이다.

채굴자는 블록을 생성하려고 해시 연산을 한다. Full Node는 블록을 “검증”합니다. 물론 채굴자도 보통 Full Node를 운영하지만 Full Node를 돌린다고 채굴 보상을 받는 것은 아니다.

3.2 Light Node

Light Node는 전체 블록체인을 직접 검증하지 않고, 일부 정보만 받아서 동작하는 노드

일반 모바일 지갑이나 간단한 데스크톱 지갑이 여기에 해당하는 경우가 많습니다. 대표적으로 SPV, Simplified Payment Verification 방식이 있습니다.

Light Node는 전체 블록을 다 받지 않고, 보통 다음 정도만 확인합니다.

  • 블록 헤더
  • 특정 거래가 블록에 포함되었다는 증명
  • 서버 또는 Full Node가 제공하는 거래 정보

간단하게 Full Node와 Light Node의 차이는 다음과 같다.

  • Full Node는 은행 장부 전체를 직접 들고 있으면서 모든 거래를 검산하는 사람
  • Light Node는 은행 장부 전체는 없고, 은행이나 검증된 중개자에게 “내 거래가 포함됐는지” 확인받는 사람
This post is licensed under CC BY 4.0 by the author.