Visual Bitcoin Engine

Rust로 만든 비트코인 엔진을 WebAssembly로 컴파일해 브라우저에서 직접 돌려보는 학습 도구

엔진 로딩 중…

비트코인은 결국 "해시로 연결된 거래 장부"예요

아래 6개 부품이 어떻게 맞물리는지 차례대로 직접 만져보면, "비트코인이 왜 위조가 안 되는가, 주인 없이도 왜 돌아가는가"가 손에 잡혀요.

부품 1
SHA-256 해시
어떤 데이터든 64자리 지문으로. 되돌릴 수 없음(단방향).
부품 2
블록 · 체인
거래 묶음 + 이전 블록의 해시 + nonce. 해시로 줄줄이 연결.
부품 3
채굴 (PoW)
해시가 0으로 시작하게 만드는 nonce 찾기 = 일(work).
부품 4
UTXO · 디지털 서명
동전은 주소에 잠기고, 개인키 서명(ECDSA)으로만 풀림.
부품 5
P2P 합의
수천 개 노드가 "가장 긴 체인" 규칙 하나로 장부를 맞춤.
부품 6
공격과 방어
이중지불 · 51% · 양자컴 — 왜 뚫기 어려운지까지 직접 실험.

여기서 진짜로 돌아가는 것

  • 화면의 모든 계산(SHA-256, 채굴, ECDSA 서명·검증, P2P 합의, 공격 시뮬레이션)은 src/Rust 엔진이 합니다.
  • 그 Rust 코드를 WebAssembly(.wasm) 로 컴파일해서 브라우저 안에서 실행해요. JavaScript는 그림만 그립니다.
  • 즉, CLI에서 cargo run 으로 돌던 그 엔진이 그대로 웹에서 돕니다.
왜 WASM인가? 브라우저는 Rust를 바로 못 돌리고 JS/WASM만 실행해요. Rust→WASM으로 컴파일하면 "진짜 엔진"을 웹에서 그대로 쓸 수 있습니다.
소스 구조: block.rs(해시·채굴) · transaction.rs(거래) · blockchain.rs(체인·잔액·검증) · utxo.rs(UTXO·입력별 서명) · wallet.rs(키·ECDSA) · merkle.rs(머클트리) · header.rs(80B 헤더) · network.rs(P2P 합의) · attack.rs(이중지불) · wasm_api.rs(브라우저 다리)

추천 학습 순서

  • 1 · SHA-256 — 글자 하나만 바꿔도 지문이 완전히 달라지는 걸 눈으로 보기 (눈사태 효과).
  • 2 · 채굴 실험실 — 난이도를 올리면 왜 채굴이 기하급수적으로 어려워지는지 체감.
  • 3 · 블록체인 시뮬레이터 — 거래 → 채굴 → 몰래 조작 → 검증으로 잡아내기까지 한 사이클.
  • 4 · UTXO 모델 — 동전(UTXO) · 주소 · 개인키 서명으로 "내 돈"이 증명되는 원리.
  • 5 · 블록 해부 — 80바이트 헤더 · 머클루트를 실제 hex 단위까지 뜯어보기.
  • 6 · 노드 합의 (P2P) — 여러 노드 · 포크 · 재구성(reorg)으로 장부가 하나로 수렴하는 과정.
  • 7 · 이중지불 공격 — 51% 공격을 직접 실행해 보고, 성공 확률까지 계산.
  • 8 · 양자컴퓨터 위협 — 쇼어 vs 그로버, 뭐가 진짜 위험하고 뭐가 과장인지 총정리.

SHA-256 — 모든 것의 출발점

아무 글자나 입력해 보세요. 입력이 1바이트든 1메가든, 결과는 항상 64자리 16진수(256비트)입니다.

SHA-256 해시 결과

길이: 자 (16진수) = 256 비트
단방향(one-way): 해시에서 원본을 역으로 계산하는 공식은 존재하지 않아요. 스크램블한 계란을 다시 못 되돌리는 것과 같습니다. 비트코인 보안의 토대죠.

눈사태 효과 (Avalanche Effect)

한 글자만 바꿔도 결과의 절반 가까운 비트가 뒤집힙니다. 두 입력을 비교해 보세요.

해시 A

해시 B (A와 다른 자리는 빨간색)

다른 16진수 자릿수
0 / 64
입력은 한 글자밖에 안 다른데 해시는 거의 무작위로 달라지죠. 그래서 블록 안의 거래를 살짝만 고쳐도 해시가 완전히 어긋나 즉시 들통납니다.

그래서 이걸로 뭘 하냐면 — 블록과 블록을 "해시로" 잇습니다

비트코인의 핵심 아이디어예요. 각 블록은 자기 데이터뿐 아니라 바로 앞 블록의 해시까지 함께 SHA-256에 넣습니다. 그래서 블록들이 사슬(chain)처럼 이어져요 — 이게 블록체인이라는 이름의 유래죠.

계산식: 이 블록 해시 = SHA-256( 이전 블록 해시 + 데이터 + nonce )
맨 앞(제네시스) 블록은 앞이 없으니 이전 해시를 0000… 으로 둡니다.
nonce는 채굴자가 바꾸는 숫자예요. ⛏ 채굴 버튼을 누르면 해시 앞이 0으로 시작할 때까지 nonce를 자동으로 찾습니다(= 탭 2에서 본 그 작업증명).
이렇게 찾은 nonce는 앞서 말한 대로 그 블록 해시를 확정하는 데 쓰여요. 그래서 데이터를 하나라도 조작하면 → 블록 해시가 바뀌고 → 그 블록을 기점으로 뒤의 모든 블록을 다시 채굴(nonce 다시 찾기)해야 합니다. 이게 조작이 어려운 이유예요. 아래에서 직접 확인해 보세요. 👇

👉 아래 블록의 데이터를 고치거나 ⛏ 채굴을 눌러보세요. 그 블록 해시가 바뀌면, 그걸 품고 있던 뒤 블록들의 해시가 줄줄이 다시 계산돼요(주황색 반짝임). 채굴해둔 뒤 블록이 있었다면 0으로 시작하던 게 깨지는 것도 보입니다.

그래서 위조가 안 됩니다: 지난 블록의 데이터를 하나만 몰래 바꿔도, 그 뒤 모든 블록의 해시가 어긋나 사슬이 끊긴 게 즉시 보여요. 공격자는 바꾼 블록부터 끝까지 전부 다시 채굴해야 하는데(탭 2에서 그게 얼마나 힘든지 체감했죠), 정직한 네트워크를 따라잡는 건 사실상 불가능합니다.
→ 실제로 거래를 넣고 채굴해 사슬을 키운 뒤, 블록을 몰래 조작해 검증으로 잡아내는 체험은 탭 3 · 블록체인 시뮬레이터에서.
🧪 곁다리 — "그럼 양자 컴퓨터가 나오면 비트코인 깨지는 거 아냐?"

자주 나오는 얘기예요. 근데 두 가지 위협을 나눠서 봐야 정확합니다.

  • ① 해시 · 채굴 (SHA-256) — 양자의 그로버(Grover) 알고리즘은 이 "0으로 시작하는 nonce 찾기" 같은 무차별 대입을 제곱근(√)만큼만 빨라지게 해요. 256비트가 체감 128비트로 줄 뿐 여전히 천문학적이고, 난이도가 자동 조정돼 흡수됩니다. → 위에서 말한 재채굴을 "가능"하게 만들진 못해요.
  • ② 디지털 서명 (secp256k1 · 탭 4) — 여기가 진짜 급소예요. 양자의 쇼어(Shor) 알고리즘공개키에서 개인키를 역산할 수 있어서, 충분히 큰 양자컴이 나오면 남의 서명을 위조해 코인을 훔칠 수 있게 됩니다.

그러니까 양자 컴퓨터가 노리는 건 "해시 연결"보다 "서명" 쪽이에요. 대비책으로 양자내성 서명(post-quantum)으로 갈아타자는 논의가 이미 진행 중이고, 무엇보다 그만한 규모의 양자 컴퓨터는 아직 존재하지 않습니다.

채굴 = "조건을 만족하는 nonce 찾기" 노가다

블록 데이터는 그대로 두고 nonce(숫자)만 0,1,2,… 바꿔가며 해시를 다시 계산해요. 해시가 0이 N개로 시작하면 성공. 정답을 찾는 빠른 방법은 없고 오직 무차별 대입뿐입니다.

난이도
3
목표: 해시가 000… 으로 시작해야 합니다.

채굴기

현재 해시 입력:
시도한 nonce
0
해시 계산 횟수
0
속도 (해시/초)
0
경과
0.0s

노가다 로그 nonce를 1씩 올리며 해시를 다시 계산

한 줄 = 한 번의 시도예요. 데이터 + nonce 를 SHA-256에 넣어 본 결과죠. 앞에 0이 모자라면 ❌, 목표만큼 0으로 시작하면 ✅. 정답을 미리 알 방법이 없어서 0번부터 하나씩 무작정 대입하는 게 전부입니다.

⛏ 채굴을 시작하면 시도 과정이 여기 한 줄씩 찍힙니다.
왜 이게 보안이 되나요? 난이도를 1 올리면 평균 시도 횟수가 약 16배로 늘어요(16진수라서). 블록을 위조하려면 그 블록부터 끝까지 전부 다시 채굴해야 하는데, 정직한 네트워크의 계산력을 따라잡지 못하면 불가능합니다. 반면 검증은 해시 한 번이면 끝 — 찾기는 어렵고 확인은 쉽다.
🔎 이 실험실은 쉽게 보여주려고 3가지를 단순화했어요 (실제 비트코인은?)

여긴 브라우저에서 즉시 체감하려고 난이도를 확 낮췄어요(1~6). 실제 비트코인은 이렇게 다릅니다:

  • ① "0 개수"가 진짜 기준이 아니에요 — 여기선 "해시 앞 0이 N개"로 판정하지만, 실제론 해시(를 숫자로 본 값)가 target이라는 256비트 숫자보다 작거나 같은가로 판정해요. 0이 많을수록 작은 수라 결과는 비슷하지만, 이 방식이라 난이도를 0 개수처럼 뚝뚝 끊지 않고 연속적으로 미세 조정할 수 있습니다.
  • ② SHA-256을 두 번 — 여기선 한 번만 하지만, 실제 헤더 채굴은 SHA-256( SHA-256(헤더) )double SHA-256이에요.
  • ③ 난이도는 기하급수적으로 폭증 — 요구하는 선행 0이 1비트 늘 때마다 평균 시도 횟수가 2배(16진수 0 한 자리 기준 약 16배)로 뛰어요. 실제 비트코인은 16진수로 약 19자리 이상의 0(약 2⁷⁶ 이상)이 필요해서, 평균 10²²~10²³번 해시해야 블록 하나가 나옵니다.

그래서 이 실험실 속도(초당 수만~수십만)로는 우주 나이로도 못 찾아요. 전 세계 채굴기를 합치면 특수 장비(ASIC)로 초당 약 10²⁰번(= 1억 × 1조) 규모의 해시를 돌려서, 그걸로 평균 10분마다 블록 하나를 캡니다.

→ target · double SHA-256 · 80바이트 헤더의 정밀한 버전은 탭 5 · 블록 해부에서 실제 hex까지 직접 볼 수 있어요.

⚡ 그럼 이 계산력의 절반 이상을 가지면? = 51% 공격
방금 본 그 어마어마한 계산력(전 세계 합산)을 혼자 절반 넘게 감당할 수 있다면, 정직한 네트워크보다 빠르게 블록을 쌓아 더 긴 체인을 만들어 과거 거래를 뒤집을 수 있어요. 이게 51% 공격입니다.
하지만 ⑴ 그 정도 장비면 정직하게 채굴하는 게 더 이득이고, ⑵ 블록이 깊이 묻힐수록(=컨펌↑) 성공 확률이 기하급수적으로 0에 수렴해서 사실상 불가능해요.
→ "가장 긴 체인이 이긴다" 규칙과 51% 공격을 그림으로 보는 설명은 탭 3 · 블록체인 시뮬레이터 맨 아래 ⑤에서.

① 엔진 설정

프리셋을 고르거나 값을 직접 바꾼 뒤 엔진을 시작하세요. (제네시스 블록이 채굴되며 시작됩니다)

블록 높이 ?
0
현재 난이도 ?
0
현재 블록 보상 ?
0 BTC
멤풀 대기 거래 ?
0
총 발행량 ?
0 BTC

② 거래 만들기

보내는 사람의 잔액이 부족하면 엔진이 거부해요(이중지불 방지).

멤풀 (다음 블록에 담길 거래)

아직 대기 중인 거래가 없습니다.

지갑 잔액

채굴 보상(코인베이스)과 거래로 잔액이 바뀝니다.

아직 잔액이 없습니다. 블록을 채굴해 보세요.

③ 블록 채굴

멤풀의 거래들을 모아 새 블록을 채굴합니다. 맨 앞에는 채굴 보상(코인베이스) 거래가 자동으로 들어가요.

④ 블록체인 & 검증

🔍 체인 검증은 뭘 하나요? 제네시스(#0)는 기준점이라 건너뛰고, #1부터 모든 블록에 대해 딱 두 가지를 확인해요:
  • ① 해시 재계산 일치? — 그 블록의 현재 내용(거래·nonce·이전해시 등)으로 해시를 다시 계산해 저장된 해시와 비교. 다르면 → 데이터 조작.
  • ② 연결 일치? — 그 블록의 이전 해시 가 진짜 앞 블록의 해시와 같은지 확인. 다르면 → 사슬 끊김.
하나라도 어긋나면 어느 블록이 왜 깨졌는지 딱 짚어줘요. 검증은 해시 계산 몇 번이면 끝 — 찾기는 어려워도 확인은 순식간.
위변조 실험: 아래 채굴된 블록의 거래 옆에 버튼이 두 개 있어요. 둘 다 체인 검증을 누르면 잡히지만, 걸리는 지점이 달라요:
  • 조작 — 데이터만 바꾸고 해시는 그대로. → 검증 ①(해시 불일치)에서 걸림.
  • 조작+재해시 — 바꾼 뒤 해시도 다시 계산(채굴은 생략). 해시는 내용과 맞지만 0으로 시작 안 함. → 검증 ③(작업증명)에서 걸림. "재해시만으론 부족, 진짜 채굴이 필요"를 보여줘요.
(복구하려면 엔진을 새로 시작)

⑤ 왜 못 되돌리나 — "가장 긴 체인이 이긴다" & 51% 공격

위에서 블록을 조작하면 검증에 걸리죠. 그럼 공격자가 조작한 블록부터 다시 채굴하면 되지 않을까요? 문제는 그러는 동안에도 정직한 네트워크는 계속 블록을 쌓는다는 거예요. 그래서 공격자는 따라잡는 게 아니라 추월해야 합니다.

#5 공격자가 여기(#5)를
조작 → 여기서 갈라짐
├─ 6789 ✅ 정직한 체인 — 더 길다 → 노드들이 자동으로 이걸 채택
└─ 6′7′ ❌ 공격자 체인 — 짧다 → 버려짐(고아 블록)
노드의 규칙은 딱 하나: 유효한 체인 중 "가장 긴(누적 작업량이 가장 큰)" 것을 따른다.
누구에게 허락·투표를 받는 게 아니라, 더 긴 체인이 나타나면 노드들이 알아서 그걸로 갈아탑니다.
  • 추월하려면 = 해시파워 51%+ — 정직한 네트워크 전체보다 빠르게 블록을 쌓아야 더 긴 체인을 만들 수 있어요. 그건 전 세계 채굴 계산력의 절반 이상을 혼자 가져야 한다는 뜻(수십조 원어치 장비·전기).
  • 그럴 능력이면 정직하게 채굴이 이득 — 공격에 성공해도 신뢰가 무너져 코인 가치가 폭락하니, 차라리 정직하게 보상 받는 게 이득이라 공격 유인 자체가 없어요.
  • 깊이 묻힐수록 안전(컨펌) — 목표 블록 위에 블록이 쌓일수록(=컨펌 수↑) 추월 확률이 기하급수적으로 0에 수렴. 그래서 거래소는 보통 6 컨펌(블록 6개)을 기다립니다.
한 줄 요약: 위조 = 바꾼 블록부터 끝까지 재채굴 + 정직한 네트워크를 추월할 만큼 더 길게 만들기. 노드는 "가장 긴 체인" 규칙으로 판단하므로, 추월하려면 계산력 51% 이상이 필요 → 사실상 불가능합니다.

엔진 로그 Rust가 출력하는 메시지

CLI에서 println! 으로 찍히던 그 메시지를 브라우저로 그대로 가져온 거예요.

비트코인엔 "잔액"이 없어요 — 동전(UTXO)만 있습니다

3번 탭은 계좌식(Alice=20, Bob=10처럼 잔액을 기억)이었어요. 하지만 진짜 비트코인은 잔액을 저장하지 않고, "아직 안 쓴 거래 출력(UTXO)" 조각들만 둡니다. 지갑이 그걸 다 더해 잔액을 계산할 뿐이죠.

지폐 비유: 지갑에 5만원권 한 장이 있을 때 1.2만원을 내려면? 5만원을 통째로 내고 → 상대는 1.2만원, 나는 거스름돈 3.8만원을 새로 받죠. "잔액에서 빼기"가 아니라 헌 동전 소비 + 새 동전 발행입니다. 이 "새 동전"이 바로 UTXO예요.
  • 입력(input) = 소비할 기존 UTXO들 (반드시 통째로)
  • 출력(output) = 새로 생기는 UTXO (받는 사람 몫 + 거스름돈)
  • 수수료(fee) = 입력 합계 − 출력 합계 → 채굴자 몫
🔑 그런데 — 그 동전이 "내 것"인 건 어떻게 증명하죠? 각 UTXO는 받는 사람의 주소(= 공개키를 해시한 값)에 잠겨 있어요. 그 동전을 쓰려면 짝이 되는 개인키로 거래에 서명해서 "내가 주인이다"를 증명해야 합니다. 누구나 공개키로 서명을 검증할 수 있지만, 개인키 없이는 유효한 서명을 만들 수 없어요. 이게 바로 비트코인이 실제로 쓰는 secp256k1 ECDSA 디지털 서명입니다. (이 데모는 진짜 secp256k1로 동작해요.)

지갑 (키쌍) secp256k1

발행/송금에 처음 등장하는 이름마다 개인키·공개키 한 쌍이 자동 생성돼요. 주소는 공개키를 해시해 만든 값이고, 동전은 이 주소에 잠깁니다. 개인키는 비밀(엔진 내부에만 존재).

아직 지갑이 없습니다. 아래 ①에서 코인을 발행하면 키쌍이 생겨요.

🎨 그림으로 이해하기 — 개인키·공개키가 대체 뭔데? (수식 없이)

공개키·개인키는 타원곡선 위에서 하는 "점 점프 놀이"예요. 시작점 G에서 정해진 규칙(선 긋고 → 만나는 점 → 위아래 뒤집기)으로 점프하는데 — 몇 번 점프했는지 = 개인키(비밀), 최종 착지점 = 공개키(공개). 버튼을 눌러 한 번씩 더해보세요.

G (시작점) 중간 착지점 지금 착지점 = 공개키 Q 선 긋기(덧셈) 위아래 뒤집기
🔑 여기가 핵심: G에서 d번 점프해 Q에 도착하는 건 쉬워요(그냥 버튼 d번). 하지만 착지점 Q만 보고 "몇 번 점프했게?"(= d)를 알아내는 건 불가능합니다 — 점프가 곡선 위를 마구 튀어다녀서 거꾸로 되짚을 방법이 없거든요.
  • 개인키 d = 점프 횟수 (비밀)
  • 공개키 Q = 착지점 (공개 · = d개의 G를 더한 점)
  • 주소 = 공개키 Q를 해시한 값
실제 비트코인 개인키는 이 점프를 2256(우주의 원자 수보다 많음) 근처 횟수만큼 한 착지점이라, 슈퍼컴을 다 끌어와도 못 되짚어요. 그래서 공개키는 맘껏 공개해도 안전해요.
그럼 "서명"은? "나는 이 착지점 Q를 만든 점프 횟수 d를 안다"를, d를 한 번도 말하지 않고 증명하는 수학 트릭이 바로 서명이에요. 남들은 공개키 Q로 그 증명이 맞는지 확인(검증)만 하죠. → 개인키 없인 서명을 못 만들고, 만들어진 서명은 공개키로 누구나 검증돼요. (송금할 때 아래 서명 블록에서 이게 실제로 돌아가요.)

① 코인 발행 (코인베이스)

UTXO가 있어야 보낼 수 있어요. 먼저 누군가에게 새 코인을 만들어 줍니다.

예시로 한 주소에 여러 번 발행하면, 그 사람 지갑에 동전이 여러 개 쌓입니다(각각이 UTXO).

② 송금

큰 동전부터 골라 목표+수수료 이상이 될 때까지 소비하고, 거스름돈을 돌려받아요.

③ 위조 시도 — 남의 동전 훔치기 🦹

공격자가 피해자의 UTXO를 자기 앞으로 보내는 거래를 만들어 봅니다. 하지만 공격자는 피해자의 개인키가 없어요. 자기 키로 서명할 수밖에 없고, 그 키의 주소는 피해자 주소와 다르므로 검증에서 거부됩니다.

UTXO 풀 (현재 안 쓴 모든 동전)

주소별로 묶었어요. 각 칩 = UTXO 한 개. 파란 테두리는 거스름돈으로 생긴 UTXO예요. 잔액은 칩들의 합으로 계산됩니다(저장 아님).

아직 UTXO가 없습니다. ①에서 코인을 발행해 보세요.

엔진 로그 UTXO 엔진(Rust)

채굴할 때 실제로 해시하는 건 거래가 아니라 "80바이트 헤더"예요

2·3번 탭에선 설명을 위해 블록 전체를 문자열로 이어붙여 해시했어요. 하지만 진짜 비트코인은 다릅니다. 거래 수천 건은 머클트리로 32바이트 머클루트 하나로 요약하고, 채굴자는 딱 80바이트 헤더double SHA-256으로 반복 해시하죠. 그리고 난이도는 "0의 개수"가 아니라 target이라는 256비트 숫자보다 작은가로 판정해요.

이 탭은 이 4가지(머클트리 · 헤더 · double SHA-256 · target)를 한 흐름으로 직접 만들어 봅니다. 모든 계산은 동일한 Rust 엔진이 합니다.

① 거래들 → 머클트리 → 머클루트

거래를 한 줄에 하나씩 적어요(내용은 자유). 각 거래를 double SHA-256해 잎(leaf)을 만들고, 둘씩 이어붙여 해시하길 반복해 꼭대기의 루트 하나로 압축합니다. 노드 수가 홀수면 마지막 노드를 복제해 짝을 맞춰요.

② 블록 헤더(80바이트) 조립 + 목표(target)

머클루트와 직전 블록 해시, 난이도를 넣어 헤더를 만듭니다. 헤더는 정확히 6필드 · 80바이트예요.

노드는 여러 대예요. "누구 체인이 진짜냐"는 규칙으로 정해집니다

지금까지의 탭은 전부 노드 1대의 내부 동작이었어요. 하지만 진짜 비트코인은 수만 대의 노드가 각자 자기 체인을 들고, 서로 블록을 주고받으며 합의합니다. 중앙 서버도, 심판도 없어요. 대신 딱 하나의 규칙으로 정리되죠 — 가장 길고 유효한 체인이 이긴다.

노드끼리의 규칙 (합의 프로토콜)
  1. 같은 뿌리 — 모든 노드는 동일한 제네시스 블록에서 출발해요. 그래야 서로의 체인을 비교할 수 있어요.
  2. 채굴 = 자기만의 블록 — 노드가 블록을 캐면 일단 자기만 알아요. 방송하기 전엔 남들은 몰라요.
  3. 방송(P2P gossip) — 캔 블록/체인을 이웃에게 퍼뜨려요. 이웃은 또 자기 이웃에게 전달하며 네트워크 전체로 번져요.
  4. 가장 긴 체인 채택 — 더 길고 유효한(해시·연결·PoW가 맞는) 체인을 받으면 자기 걸 버리고 갈아탑니다(재구성 / reorg).
  5. 포크 & orphan — 두 노드가 동시에 같은 높이 블록을 캐면 포크가 생겨 잠깐 공존해요. 다음 블록이 한쪽에 붙는 순간 그쪽이 이기고, 진 블록은 버려집니다(orphan/stale).

각 노드에서 채굴해 블록을 붙이고, 방송으로 이웃에게 퍼뜨려 보세요. 두 노드에서 각각 캐면 포크가 생기고, 한쪽을 더 길게 만든 뒤 방송하면 재구성(reorg)이 일어납니다.

네트워크 로그

"가장 긴 체인이 이긴다"를 악용하면 — 이중지불 공격

한마디로 "돈 내고 물건 받은 뒤, 그 결제 기록을 몰래 지워버리는" 사기예요. 같은 코인을 두 번 쓰는 거죠.

🛒 쉽게: 중고로 노트북 사기
  1. 공격자판매자(상점)에게서 노트북을 사며 비트코인 10개를 보냄 → 이 결제가 블록에 담김
  2. 판매자는 "입금 확인!" 하고 노트북을 택배로 발송 📦 (현실에선 되돌릴 수 없음)
  3. 그 사이 공격자는 몰래 다른 버전의 역사를 캐고 있었음 — 그 역사엔 노트북 결제가 아예 없고, 코인을 자기 지갑으로 돌려놓음
  4. 이 비밀 체인이 더 길어지면 공개 → 네트워크가 더 긴 체인으로 갈아탐(재구성/reorg)
  5. 결과: 노트북 결제는 없던 일이 됨. 공격자는 노트북 + 코인 둘 다 챙기고, 판매자는 둘 다 잃음 😱

아래 시뮬레이터에서 공개 체인(모두가 아는 진짜 기록)과 공격자의 비밀 체인을 직접 경쟁시켜, 결제가 어떻게 증발하는지 볼 수 있어요.

공격이 성공하려면 공격자가 정직한 네트워크보다 블록을 더 빨리 캐야 해요(= 51% 해시파워). 그리고 판매자가 입금 확인(컨펌)을 오래 기다릴수록 공격자가 그만큼 더 앞서야 해서 성공이 어려워집니다. "왜 입금 6번 확인하고 물건 주라는가"가 바로 이거예요.

왜 "입금 확인(컨펌)을 기다리면" 안전해질까?

컨펌 = 내 결제가 담긴 블록 위에 쌓인 블록 수. 판매자가 물건을 보내기 전에 이걸 더 기다릴수록, 공격자가 결제를 뒤집으려고 따라잡아야 할 거리가 멀어져요. 공격자의 비밀 체인이 정직한 체인보다 더 길어져야 뒤집을 수 있는데, 기다리는 동안 정직한 체인이 계속 앞서 나가기 때문이죠.

😮 1컨펌에 바로 발송 (성급)
결제
정직한 체인이 1블록만 앞섬 → 공격자는 2블록만 몰래 만들면 추월. 해볼 만함 😈
🛡️ 6컨펌 기다렸다 발송 (신중)
결제
정직한 체인이 6블록이나 앞섬 → 공격자는 이 격차를 다 따라잡고 + 한 발 더 앞서야 함. 훨씬 어려움 🛡️
한마디로: 판매자가 오래 기다릴수록 정직한 체인의 리드가 커지고, 공격자가 뒤집어야 할 격차도 그만큼 벌어져요. 그래서 컨펌이 하나 늘 때마다 성공 확률이 (공격자가 과반 미만이면) 지수적으로 뚝뚝 떨어집니다. → 소액은 1컨펌, 큰 금액(거래소 입금 등)은 6컨펌 이상을 기다리는 이유예요.

그래서 51% 공격, 어디까지 가능할까? — 성공 확률 계산기

51% 공격에도 한계가 있어요. 결론부터: 갓 결제된 최근 몇 블록은 노려볼 수 있어도, 깊은 과거(제네시스 근처)는 사실상 절대 불가능합니다. 아래에서 공격자 해시파워와 컨펌 수를 바꿔보면 왜 그런지 숫자로 보여요. (모든 계산은 Rust 엔진이 합니다.)

공격자 < 50%
컨펌이 쌓일수록 성공 확률이 지수적으로 급락. 6컨펌이면 사실상 0. → 깊은 과거는 불가능.
공격자 ≥ 50%
이론상 언젠가는 성공(확률 100%). 하지만 깊을수록 필요한 시간·전기가 폭발.
제네시스/오래된 블록
누적된 일(PoW)이 방패 + 제네시스는 하드코딩. → 물리적으로 불가능.

컨펌 깊이에 따른 성공 확률 (이 해시파워 기준)

🟢 정직한 공개 체인네트워크가 인정하는 체인
😈 공격자 비밀 체인공개 전까지 아무도 모름

공격 로그

양자컴퓨터가 비트코인을 망하게 한다? — 케이스 총정리

결론부터: "하루아침에 붕괴"는 아니지만, 특정 조건의 코인엔 실질 위협이에요. 핵심은 딱 두 알고리즘이에요 — 쇼어(Shor)는 서명을 깨고(치명적), 그로버(Grover)는 해시를 조금 빠르게 할 뿐(제한적). 이 사이트에서 본 secp256k1 서명(탭 4)이 쇼어의 표적, SHA-256(탭 1·2·5)이 그로버의 표적입니다.

양자컴퓨터의 위협은 "채굴을 빠르게 해서 51%"가 아니라, 대부분 "공개키에서 개인키를 알아내 남의 코인을 훔치는" 쪽이에요. 왜 그런지 아래에서 케이스별로 봅니다.

① 두 개의 무기: 쇼어 vs 그로버

쇼어 (Shor) 치명적
  • 표적: ECDSA / secp256k1 (디지털 서명)
  • 효과: 공개키 Q에서 개인키 d를 직접 역산 (Q = d·G를 되돌림). 사실상 불가능하던 걸 몇 시간 안에.
  • 의미: 공개키가 드러난 코인은 서명을 위조해 훔칠 수 있음.
그로버 (Grover) 제한적
  • 표적: SHA-256 (해시 · 채굴 · 주소)
  • 효과: 무차별 대입을 제곱근만큼 단축 (2²⁵⁶ → 2¹²⁸). "보안 비트 절반" 수준.
  • 의미: 해시는 여전히 안전권. 채굴이 조금 유리해질 뿐, 붕괴 아님.
💡 왜 쇼어가 무섭냐면 — 탭 4의 "시계 비유"처럼 d·G는 정방향(개인키→공개키)은 쉽지만 역방향(공개키→개인키)은 불가능한데, 쇼어는 바로 그 역방향을 가능하게 만들어요. 그로버는 그냥 "빨리 찍기"라 급이 다릅니다.

② 공격 케이스 총정리

1 노출된 공개키 털기 핵심 위협
무엇을 이미 블록체인에 공개키가 드러난 코인의 개인키를 쇼어로 복원 → 몰래 이동
대상 P2PK(초기 채굴 코인·사토시 추정 ~110만 BTC), 재사용 주소, Taproot(P2TR)
현실성 대형 양자컴 필요(아직 없음). 하지만 느긋하게 공격 가능 → 방어 못 하는 분실 코인이 특히 위험
방어 안 쓰던 새 주소로 이동 · 주소 재사용 금지 · 포스트양자 서명 전환
2 전송 중 거래 가로채기 치명적
무엇을 거래를 방송하면 공개키+서명이 드러남 → 확정(컨펌) 전 짧은 틈에 개인키를 복원해, 더 높은 수수료로 가로채는 거래를 끼워넣어 훔침
대상 사용하는 모든 코인 (돈을 쓰는 그 순간)
현실성 수 분 안에 secp256k1을 깨야 함 → 케이스 1보다 훨씬 빠른 양자컴 필요(더 먼 미래)
방어 결국 서명 알고리즘 교체(PQ)가 유일한 근본 해법
3 채굴 지배 (그로버) 낮음
무엇을 그로버로 해시 탐색을 가속해 채굴 우위 확보(→ 51% 시도, 탭 7)
현실성 제곱근 속도라 전용 ASIC 대비 압도적이지 않음. 위협 낮음
방어 난이도 자동조정이 대부분 흡수
4 해시·주소 자체 붕괴 사실상 없음
무엇을 SHA-256을 깨서 안 쓴 주소의 공개키 해시를 역산
현실성 그로버로도 2¹²⁸ → 현실적으로 불가능. 안 쓴 P2PKH/P2WPKH는 안전

③ 어떤 코인이 위험하고, 어떤 게 안전한가

가르는 기준은 딱 하나 — 공개키가 체인에 드러나 있느냐. 일반 주소는 공개키를 해시 뒤에 숨겨 두기 때문에, "한 번도 출금 안 한" 주소는 (현재로선) 안전해요.

🛡️ 안전 (현재로선)
  • 한 번도 출금 안 한 P2PKH / P2WPKH 주소
  • 이유: 공개키가 SHA-256+RIPEMD-160 해시 뒤에 숨음 → 쇼어의 표적(공개키)이 안 보임
  • 뚫으려면 해시를 깨야 하는데 그건 그로버로도 불가
⚠️ 위험
  • P2PK — 초기 채굴 코인·사토시 코인(공개키가 그대로 노출)
  • 재사용 주소 — 한 번 출금하는 순간 공개키 공개
  • Taproot(P2TR) — 구조상 공개키 노출
  • 쓰는 순간의 모든 코인 — mempool에 공개키가 뜨는 그 틈
가장 골치 아픈 건 주인이 방어할 수 없는 코인이에요. 사토시 코인처럼 개인키를 잃어버려 이동이 불가능한 노출 공개키 코인들은, 누군가 양자컴을 갖는 순간 그대로 털릴 수 있어요.

④ 현실적으로 가능한가? — "지금 당장은 아니다"

필요한 규모
오류정정된 논리 큐비트 수천 개
= 노이즈 물리 큐비트 수백만~수천만 개, 수 시간 연속 연산
현재(2026) 수준
물리 큐비트 ~1,000개대, 노이즈 큼
오류정정 논리 큐비트는 이제 막 한 자릿수 → 격차가 큼
예상 시점
대체로 2030년대 중반~2040년대+
암호 위협 수준(CRQC), 불확실성 큼
세상은 이미 대비 중
NIST가 2024년 포스트양자 표준 확정
ML-KEM · ML-DSA · SLH-DSA

⑤ 그래서 비트코인은 끝나나? — 대응책

  • 포스트양자 서명으로 하드포크 — 격자 기반 / 해시 기반(SPHINCS⁺, Lamport 등)으로 서명 알고리즘 교체
  • 취약 코인을 새(양자내성) 주소로 이동 — 노출된 공개키 코인을 미리 옮기기
  • 주소 재사용 금지 — 지금도 유효한 최선의 습관 (공개키를 계속 숨김)
  • 점진적 전환 — 양자 위협은 갑자기 오지 않고 충분히 예고되므로, 커뮤니티가 미리 갈아끼울 시간이 있음
결론: "양자컴 = 비트코인 즉사"는 과장이에요. 대부분은 서명을 갈아끼우면 막을 수 있는 문제입니다. 다만 사토시 코인처럼 이동 불가능한 노출 공개키 코인에는 진짜 위협이고, 그 시점엔 "누가 그 오래된 코인을 먼저 털지" 같은 초유의 사건이 벌어질 수 있어요.