본문 바로가기
EverChain(BlockChain)/BitEver

[BitEver] 비트코인의 에너지 화폐 철학

by EverChain 2026. 7. 4.
⚠️ **블로그 컨셉상 반어체가 들어가니 양해바랍니다

**

 

니킬 카마스와의 인터뷰

비트코인 2100만개의 비밀, 그리고 그것을 박살낼 뻔한 사건

비트코인 온체인 시리즈 두 번째 포스팅이다.

오늘 다룰 내용은 세 가지가 자연스럽게 이어진다.

2100만 개가 왜 딱 그 숫자인가 → 그 유한함을 뚫을 뻔한 사건 → 그래서 왜 에너지 기반 화폐인가


⛏️ 첫 번째 : 비트코인 할빙, 뻔한 얘기는 빠르게 하고 넘어가자

비트코인 반감기

 

할빙 자체는 이제 뉴스에도 나오는 얘기라 다들 한 번쯤은 들어봤을 거다.

4년마다 채굴 보상이 반으로 줄어든다. 이게 할빙이다.

 

근데 이걸 좀 더 파고들어 보자.

 

📐 2016블록마다 난이도를 계산한다

비트코인 네트워크는 2016블록마다 채굴 난이도를 재계산한다.

이 코드는 비트코인 코어의 src/pow.cpp 안의 GetNextWorkRequired() 함수에 있다.

// src/pow.cpp
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, ...)
{
    // 2016블록마다 조정
    if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
        return pindexLast->nBits;
    ...
}

 

그리고 난이도는 한 번에 4배를 넘게 오르거나 내릴 수 없다. 이것도 같은 파일에 하드코딩되어 있다.

조정 원리는 단순하다. 직전 2016블록을 캐는 데 걸린 총 시간을 기준으로 평균 10분에 맞게 난이도를 올리거나 내린다.


📦 21만 블록마다 반감기가 일어난다

정확히는 210,000블록마다 보상이 절반으로 줄어든다.

이게 반감기(Halving)고, 이 코드는 src/validation.cpp 의 GetBlockSubsidy() 함수에 있다.

// src/validation.cpp
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval; // 210,000
    if (halvings >= 64)
        return 0;  // C++ 64비트 정수를 64칸 이상 시프트하면 미정의 동작(UB) 발생 → 안전장치

    CAmount nSubsidy = 50 * COIN; // 최초 보상 50 BTC
    nSubsidy >>= halvings;        // 👈 이게 핵심이다
    return nSubsidy;
}

※ >= 64 가드는 C++ 미정의 동작 방지용 안전장치고, 실제 보상이 0이 되는 건 halving 33에서 정수 시프트 연산이 자연스럽게 0을 만들어버리기 때문이다. 두 가지는 별개다.

그리고 보통 "4년에 한 번"이라고 하는데, 왜 딱 4년이 아니냐면

1블록당 목표가 10분이긴 한데 실제 채굴이 정확히 10분마다 일어나지 않는다.

그저 SHA256이라는 운의 한계에 10분을 기대하는 것뿐이다.


🤔 근데 이상하지 않냐?

어떤 수를 반으로 나누면 절반이 된다. 그걸 또 반으로 나누면 1/4이 된다.

무한히 반으로 나누면 이론상 0에 수렴하지만 절대 0이 되진 않는다.

수학적으로 이건 무한급수 얘기다.

50 + 25 + 12.5 + 6.25 + ··· = 100(수렴)  (블록 1개당 보상의 무한합산, 단위: BTC)

 

이라면 언제까지나 아주 작은 보상이라도 계속 나올 것 같지 않냐?

근데 왜 비트코인은 딱 2100만개로 끝나는 걸까?

Why...?


💡 그 비밀은 시프트 연산(Shift Operation)이다

컴퓨터에서 숫자를 저장할 때는 정해진 비트(bit) 공간이 있다.

>>는 오른쪽으로 비트를 밀어버리는 연산인데, 밀다가 자리가 넘어가버리면 그냥 0이 된다.

예를 들어 이렇게 된다:

reward = 5_000_000_000  # 50 BTC를 사토시 단위로 (1 BTC = 1억 사토시)

for i in range(1, 35):
    reward >>= 1
    print(f"halving {i:2d}: {reward:>12,} satoshi")
halving  1: 2,500,000,000 satoshi   # 25 BTC
halving  2: 1,250,000,000 satoshi   # 12.5 BTC
halving  3:   625,000,000 satoshi   # 6.25 BTC
...
halving 32:           1 satoshi     # 0.00000001 BTC (마지막 1사토시)
halving 33:           0 satoshi     # 💀 완전히 0

 

halving 33에서 시프트를 한 번 더 밀어버리면 정수 연산 특성상 그냥 0이 된다.

33번 반감기 = 33 × 210,000블록 = 약 6,930,000번째 블록

10분 기준으로 계산하면 6,930,000 × 10분 ÷ 60 ÷ 24 ÷ 365 ≈ 약 132년

2009년 기준으로 더하면 → 약 2140년

그리고 총 채굴량은 등비급수로 계산하면

50 × 210,000 × (1 + 1/2 + 1/4 + ···) = 50 × 210,000 × 2 = 21,000,000

 

바로 이것이 비트코인 공급량이 2,100만개로 딱 떨어지는 이유다.

수학적 무한급수가 아니라, 컴퓨터의 정수 시프트 연산이 강제로 0을 만들어버리기 때문이다.


💥 두 번째 : 이 강력한 유한함을 박살낼 뻔한 사건

자, 이제 2,100만개의 유한함이 왜 대단한 건지는 알았다.

그런데...

🚨 이 강력한 유한함을 깨버릴 뻔한 사건이 2018년에 일어났다.

 

🔍 배경 : 당시 비트코인 코어 레포는

Wladimir J. van der Laan(laanwj)

 

당시 비트코인 코어 GitHub 레포에는 리드 메인테이너 Wladimir J. van der Laan(laanwj) 을 필두로, 깐깐하기로 세계에서 손꼽히는 코드 강박자들이 컨트리뷰터로 활동 중이었다.

Pieter Wuille, Greg Maxwell, Matt Corallo, Suhas Daftuar 등 비트코인 역사에 이름을 남긴 개발자들이다.

근데 결국 인간이라는 건 실수를 한다.


🐛 버그의 탄생 : 최적화가 화를 불렀다

2017년, Bitcoin Core 0.14.0 업데이트에서 PR #9049 라는 최적화 패치가 머지됐다.

내용은 이렇다. 블록을 받아서 검증할 때, 원래는 "한 트랜잭션 안에 동일한 UTXO 인풋이 두 번 쓰이진 않았는지" 체크하는 로직이 있었다.

근데 이게 어차피 이중지불은 이미 다른 곳에서도 체크하니까 "중복 체크 아니야? 비효율적이네" 해서 그 검증을 통째로 날려버렸다.

그런데 2017년, Bitcoin Core 0.15.0 업데이트에서 문제가 생겼다.

0.14에서 제거된 검증 로직의 흔적으로 남아있던 assert 구문이 리팩토링 과정에서 일반 에러 핸들링으로 조용히 바뀌어버렸다.

이 두 가지 변경이 합쳐지면서

동일 UTXO를 두 번 쓰는 트랜잭션 포함 블록 → 노드가 에러 없이 처리해버림

 

이라는 치명적인 버그가 탄생했다.

💀 한마디로 : 채굴자가 같은 UTXO를 두 번 쓰는 블록을 만들면, 네트워크가 그냥 받아들인다.

즉, 없는 비트코인을 만들어낼 수 있다는 뜻이다.
2,100만개 공급량 제한이 코드 레벨에서 무력화되는 것이다.

⏱️ 2018년 9월 17일 : 긴박했던 그날

2018년 9월 17일 오후 2시 57분

Awemany라는 익명의 개발자(비트코인 캐시 진영)가 이 버그를 발견하고 Bitcoin Core의 핵심 개발자들에게 조용히 개인 연락을 넣었다.

처음엔 "노드를 크래시시킬 수 있는 DoS 버그"라고만 보고했다.

그런데 내용을 확인한 개발자들은 몇 분 만에 이게 단순 DoS가 아니라는 걸 알아챘다.

같은 날 오후 7시 29분 — Greg Maxwell은 인플레이션 취약점의 테스트 케이스 해시값을 타임스탬프로 찍어뒀다. 나중에 "내가 이걸 알고 있었다"는 증명을 위해서다.

🤫 조용하고 신속한 핫픽스 작전

CVE-2018-17144

 

비트코인 코어 개발팀은 절대 공개 발표를 먼저 하지 않았다.

공개하는 순간, 악용하는 채굴자가 나타날 수 있기 때문이다.

대신 다음 순서로 움직였다.

1단계 — 패치 코드를 비공개로 완성

2단계 — Matt Corallo가 당시 최대 채굴 풀인 Slushpool의 CEO에게 직접 연락해서 패치를 먼저 공유

3단계 — 거래소, 체인 분석 업체, 주요 서비스 등 경제적 노드들에게 조용히 업그레이드를 권고

4단계 — 해시레이트의 절반 이상이 패치 버전으로 올라왔다고 판단되었을 때 공개 배포

2018년 9월 18일 — Bitcoin Core 0.16.3 공개 배포

릴리즈 노트에는 리드 메인테이너 van der Laan이 직접 이렇게 썼다:

"A denial-of-service vulnerability exploitable by miners has been discovered in Bitcoin Core versions 0.14.0 up to 0.16.2. It is recommended to upgrade to 0.16.3 as soon as possible."

공개 발표에서는 "DoS 버그"라고만 했다. 인플레이션 취약점이라는 사실은 업그레이드가 충분히 이루어질 때까지 숨겼다.

9월 20일, 공개 포럼에서 누군가 전체 내용을 올렸다가 빠르게 삭제했지만 이미 퍼진 뒤였고, 그날 CVE-2018-17144로 공식 등록됐다.


😔 그리고 한 가지 더

이 사건이 마무리된 뒤, Bitcoin Core 개발자 John Newbery가 공개적으로 이런 글을 올렸다.

"I am responsible for the CVE-2018-17144 bug."

0.15.0에서 assert를 일반 에러 핸들링으로 바꾼 커밋이 본인 것이었다고 자진 인정한 것이다.

세계에서 가장 깐깐한 코드 리뷰 문화를 가진 레포에서, 세계에서 가장 중요한 소프트웨어에서, 결국 인간이 실수를 했다.

다행히 악용된 사례는 단 한 건도 보고되지 않았다.


⚡ 세 번째 : 그래서 비트코인이 왜 에너지 기반 화폐냐?

2026년 초, 일론 머스크가 한 인터뷰에서 이런 말을 했다.

"미래에는 돈이 사라지고 에너지기반 화폐가 남을 것이다."
(그 중에 하나를 비트코인으로 말했을 뿐, BTC만 얘기한 것은 아님)

 

🔗 해당 인터뷰 영상

 

근데 솔직히 이 말도 대중한테 크게 와닿는 설명은 아니다.

그리고 유튜브 찾아보면 대부분의 설명이 이렇다.

"천문학적인 전기비와 냉각 장비, 연산 에너지를 투입해서 채굴하기 때문에 에너지 기반이다."

 

틀린 말은 아닌데, 왜 그 막대한 에너지를 쏟아부어야 채굴이 되는지는 설명하지 못한다.

"난이도가 높아서요" — 비전공자한테 이 말이 납득이 되겠냐.

오늘 서버맨이 좀 더 쉽게 설명해보겠다.


📊 이 세상 대부분의 것은 표준분포그래프를 따른다

정규분포곡선(표준분포그래프)

 

고등학교 때 다 배운 얘기다. 그래프 모양은 이렇다.

 

인류의 키, 동물들의 수명, 식물들의 잎 크기, 연간 강우량, 시험 성적 분포 같은 것들이 다 이 종 모양 곡선을 따른다.

핵심은 이거다. "평균이 있고, 평균에서 멀어질수록 드물다."

인구의 키가 170cm 근처가 제일 많고, 190cm 넘어가거나 150cm 아래로 가면 갈수록 적어지는 것처럼.


🔢 그런데 SHA256은 이게 아니다

SHA256은 해시 함수다.

해시 함수에는 세 가지 핵심 성질이 있다.

성질 설명
제 1역상 저항성 (Pre-image resistance) 해시값으로 원본 메시지를 역산할 수 없다
제 2역상 저항성 (Second pre-image resistance) 같은 해시값을 만드는 다른 메시지를 찾을 수 없다
충돌 저항성 (Collision resistance) 해시값이 같은 두 메시지를 찾을 수 없다

 

한마디로 일방향이다. 해시값에서 원본을 역산하는 건 불가능하다.

그리고 여기 사이트 들어가서 아무 글자나 넣어봐라.

 

🔗 SHA256 온라인 해시 툴

 

숫자든 글자든, 한 글자든 백 글자든 관계없이 SHA256 해시값은 항상 64자리 16진수 문자열로 나온다.

"a"         → ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
"bitcoin"   → 6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b
"안녕하세요" → 4e3e77b7e53ddc7b33b81e5ec48d3fd65d36fae6cc10ad0fbd3af34e94b0d19a

 

입력이 조금이라도 바뀌면 출력은 완전히 다른 값이 나온다. 패턴도, 규칙도, 예측도 없다.

 

이걸 표준분포그래프와 비교하면?

표준분포 : 평균이 있고, 평균에서 벗어날수록 확률이 낮아진다

SHA256 : 어떤 입력을 넣어도 출력은 완전히 동등하게 무작위다

이걸 그래프로 표현하면 y = 1 이다. 어느 쪽으로 튀어도 확률이 항상 동일하다.

 

y=1 과 표준분포그래프


🎰 y=1 이라는 게 무슨 뜻이냐

니케 SSR은 0.0921%

 

요즘 모바일 게임 가챠 아이템 확률 본 적 있지?

SSR 아이템 : 0.3% SR 아이템 : 5.2% R 아이템 : 94.5%

이건 확률에 가중치가 있다. 뭔가 더 잘 나오는 쪽이 있다.

그런데 SHA256은 이런 가중치가 존재하지 않는다.

어떤 인풋을 넣어도, 출력의 64자리 각각의 값은 0~f 중 어느 것이든 완전히 동등한 확률로 나온다.

 

이게 바로 순수한 랜덤이다.


⛏️ 그러면 채굴이 뭐냐

지금 비트코인에서 1블록을 캐려면

00000000000000000001c93b51c27c184a622d2192212c5f4ef8f07a9f1778d0

 

이처럼 64자리 해시 중 앞에 19자리가 0으로 시작하는 인풋 값을 찾아야 한다.

방금 SHA256 사이트에서 아무 숫자나 넣어봐라. 앞에 00으로만 시작하는걸 찾으려해도 사람 손으론 일주일 내내 두들겨도 찾기 힘들다.

근데 현재 채굴 난이도는 앞에 0이 19개다.

⚙️ 대형 채굴 풀들은 SHA256에만 특화된 ASIC 장비를 수천 대씩 가동시켜서
엄청난 전기비와 엄청난 발열에 대한 냉각 비용, 인프라 비용을 쏟아부으면서
앞에 0이 19개짜리를 찾는 중이다.

그리고 신기하게도 '평균적'으로 그 찾는 행위가 10분마다 이루어지고 있다.

이게 왜 에너지 기반이냐고?

y=1, 즉 순수한 무작위에서 특정 답을 찾는 유일한 방법은 그냥 미친 듯이 때려박는 것뿐이다.

경험이 쌓인다고 유리해지지 않는다. 이전에 어떤 값을 넣었는지도 아무 도움이 안 된다. 그냥 빠르게 많이 때려박는 게 전부다.

그래서 연산력 = 전기 = 에너지 가 그대로 채굴 능력이 되는 거고, 이것이 바로 비트코인을 에너지 기반 화폐라고 부르는 진짜 이유다.


🤝 PoW에 대한 서버맨의 생각

작업증명 vs 지분증명

 

PoW는 사람들 관점에 따라

  • 지구 파괴의 지름길 이라고 하는 사람도 있고
  • 진정한 탈중앙화와 순수한 에너지 라고 보는 사람도 있다

서버맨은 후자를 지지한다.

이유는 간단하다.

PoW는 가능성이 0.0000000000000000001%이지만, 지금 당장 내 데스크톱 CPU로 마이닝에 참여할 수 있다. 이것이 진정한 의미의 네트워크 참여다.

 

요즘은 대부분의 체인이 PoS로 가고 있는데, PoS에는 사실상 지배구조가 강하다고 생각하는 사람이기 때문이다.

합의 알고리즘 철학은 나중에 다른 포스팅에서 제대로 다루도록 하고.


🏁 마치며

오늘 다룬 내용을 정리하면

2100만개가 딱 그 숫자인 이유 — 수학이 아니라 컴퓨터의 시프트 연산

CVE-2018-17144 — 그 유한함을 뚫을 뻔했던 사건, 그리고 조용하고 신속했던 대응

왜 에너지 기반인가 — y=1, 순수한 무작위에서 특정값을 찾는 유일한 방법은 에너지를 쏟아붓는 것뿐

다음 포스팅에서는 비트코인 온체인 장부의 공개성 때문에 발생하는 위험요소 에 대해 알아보겠다.

 

 

질문은 언제나 환영 🙌


 

🛰️ 서버맨의 공간들

 

  🐱 GitHub      🗂️ 포트폴리오   🔗 에버체인 포털

728x90