🔑챕터 2

2장 · 노드, 신원증명과 키

분산 장부라는 아이디어는 훌륭했다. 그런데 막상 구현하려고 하니 곧바로 벽에 부딪혔다. 누구나 이 네트워크에 메시지를 보낼 수 있다면, 누군가 "철수가 영희에게 100만원 보냄"이라는 가짜 메시지를 만들어 뿌리면?

이 챕터의 질문

신원을 확인해주는 중앙 기관이 없는 네트워크에서, 이 메시지가 진짜 본인이 보낸 것임을 어떻게 증명할까?

기존 방식의 문제

은행 시스템에서는 신원 증명이 단순했어요. 비밀번호를 서버에 보내면, 서버가 "맞다/틀리다"를 판단해줬어요. 그런데 블록체인에는 이 비밀번호를 받아줄 중앙 서버가 없어요. 비밀번호를 네트워크에 뿌리는 순간 누구나 볼 수 있고, 탈취될 수 있어요.

완전히 다른 접근이 필요했어요.

기존: 비밀번호블록체인: 디지털 서명사용자비밀번호전송중앙 서버맞다 / 틀리다비밀번호가 네트워크를 떠난다→ 탈취 위험판단을 서버 한 곳이 독점→ 블록체인엔 그 서버가 없다사용자개인키 🔑 보관개인키는 절대 밖으로 안 나감노드 1공개키 검증 ✓노드 2공개키 검증 ✓노드 3공개키 검증 ✓메시지 + 서명값중앙 서버 없이 누구나 진위를 검증
비밀번호는 서버로 보내야 하지만, 서명은 개인키를 내 기기 밖으로 내보내지 않는다

공개키 암호화: 자물쇠와 열쇠를 분리한다

해결책은 이미 암호학에 있었어요. 공개키 암호화(비대칭 암호화)예요. 핵심 아이디어는 자물쇠와 열쇠를 분리하는 거예요.

  • 개인키(Private Key): 나만 갖고 있는 비밀 열쇠. 서명을 만드는 데 쓴다.
  • 공개키(Public Key): 세상에 공개해도 되는 자물쇠. 서명이 진짜인지 검증하는 데 쓴다.

작동 방식은 이래요. 철수가 "영희에게 1 ETH 보냄"이라는 메시지를 자신의 개인키로 서명하면 서명값(v, r, s)이 나와요. 이 서명값을 메시지와 함께 네트워크에 뿌리면, 누구나 철수의 공개키로 "맞다, 철수가 서명한 게 맞다"고 검증할 수 있어요. 개인키는 절대 네트워크 밖으로 나가지 않아요. 서명된 결과물만 나가요.

서명: 철수만 가능검증: 누구나 가능메시지"영희에게 1 ETH"개인키 🔑나만 보관서명 생성ECDSA네트워크 전파메시지 + 서명값(v, r, s)공개키로 검증세상에 공개된 자물쇠철수가 맞다
서명 생성은 개인키를 가진 철수만, 검증은 공개키로 누구나 할 수 있다

그런데 개인키를 어떻게 보관하나

여기서 새로운 문제가 생겼어요. 개인키는 256비트 난수예요.

a3f1c2d4e5b6...8b9e0f1a

이걸 사람이 외우거나 종이에 적는 건 사실상 불가능해요. 그리고 잃어버리면 자산이 영구 소멸해요. 복구할 방법이 없어요. 은행은 비밀번호를 잊어버리면 신분증으로 재발급해줬지만, 블록체인에는 그런 창구가 없어요.

니모닉 코드: 12개 영단어로 키를 백업한다

해결책은 개인키를 사람이 읽을 수 있는 형태로 변환하는 거예요. BIP-39 표준은 랜덤 숫자를 12개(또는 24개)의 영단어로 변환해요.

army van defense carry jealous true
garbage claim echo media make crunch

이 12단어만 안전하게 보관하면 언제든 개인키를 복원할 수 있어요. 그리고 하나의 니모닉에서 수천 개의 개인키와 주소를 계층적으로 파생할 수 있어요. 이게 HD 지갑(Hierarchical Deterministic Wallet) 이에요.

니모닉 12단어army van defense …BIP-39 · 이것만 백업Seed512비트Master KeyBIP-32Account #00x742d…Account #10x9f3a…Account #Nm/44'/60'/0'/0/N
HD 지갑: 니모닉 12단어 하나에서 수천 개의 키와 주소가 계층적으로 파생된다

공개키에서 지갑 주소로

개인키가 생겼으니 공개키도 나와요. 그런데 공개키는 512비트로 너무 길어요. 이걸 주소로 쓰면 오타 하나로 돈이 사라질 수 있어요. 그래서 공개키를 Keccak-256 해시 함수에 넣고 마지막 20바이트를 꺼내면 40자 지갑 주소가 나와요.

0x742d35Cc6634C0532925a3b844Bc454e4438f44e

해시는 단방향이라 주소만 보고 공개키를 역산하는 건 불가능해요. 주소를 공개해도 개인키가 노출되지 않아요.

개인키256비트 난수ECDSA공개키512비트Keccak-256해시값32바이트마지막20바이트지갑 주소 (40자)0x742d35Cc…✗ 역산 불가: 해시·서명 모두 단방향, 주소를 공개해도 개인키는 안전
개인키에서 주소까지, 모든 단계가 단방향이라 주소에서 개인키를 역산할 수 없다

기관은 어떻게 키를 관리하나

개인이 니모닉 12단어로 키를 관리한다면, 수백억 원의 자산을 다루는 기관은 어떻게 할까요?

방식키 관리보안복구용도
Single Key단일 개인키★☆☆☆☆복구 불가개인 소액
HD Wallet니모닉 기반 계층 파생★★☆☆☆니모닉 복구개인/소규모
HSM하드웨어 보안 모듈★★★★☆백업 HSM금융기관/거래소
멀티시그N개 키 중 M개 서명 필요★★★★☆임계값 복구기관/기업
MPC키를 조각으로 분산★★★★★임계값 복구기관/기업

HSM은 키가 하드웨어 칩 안에서만 존재해요. 물리적으로 탈취해도 키를 꺼낼 수 없어요.

멀티시그는 "3개 중 2개(2-of-3)" 방식으로, A·B·C 세 명 중 두 명이 서명해야 트랜잭션이 실행돼요. 스마트 컨트랙트 레벨에서 온체인으로 검증해요.

MPC는 겉으로 보기엔 멀티시그와 비슷하지만 작동 방식이 근본적으로 달라요. 키를 여러 조각(샤드)으로 나눠서 분산 보관하는데, 완전한 키는 어디에도 존재하지 않아요. 서명할 때 샤드들이 오프체인에서 수학적 연산에 참여하고, 온체인에는 최종 서명값만 올라가요.

멀티시그 (2-of-3)MPC키 A 🔑서명 ✓키 B 🔑서명 ✓키 C 🔑미참여서명 2개각각 온전한 서명온체인: 컨트랙트가 2-of-3 검증서명 구조가 체인에 드러남완전한 키가 3개 존재조각 1샤드조각 2샤드조각 3샤드오프체인 MPC 연산조각들이 함께 계산온체인: 최종 서명값 1개만 올라감일반 서명과 구분되지 않음완전한 키는 어디에도 없음
멀티시그는 완전한 키 N개의 서명을 온체인에서 검증하고, MPC는 키 조각으로 오프체인에서 서명 하나를 만든다

실습: MetaMask 지갑 만들기

개념을 직접 확인해볼 수 있어요. MetaMask는 가장 널리 쓰이는 HD 지갑이에요. 설치하면 니모닉 12단어가 생성되고, 그로부터 지갑 주소가 파생되는 전 과정을 직접 경험할 수 있어요.

그런데 새로운 문제가 생겼어요

신원 증명과 키 체계가 완성됐어요. 이제 "철수가 영희에게 보낸다"는 걸 증명할 수 있어요. 그런데 이 요청을 네트워크에 보낼 때 세 가지 문제가 동시에 생겼어요.

  • 같은 메시지를 복사해서 100번 뿌리면 100번 출금될 수 있어요.
  • 중간에 누군가 금액만 바꿔치기할 수 있어요.
  • 노드마다 메시지를 다르게 파싱하면 합의가 깨져요.

다음 챕터의 질문

서명된 요청을 복사되지도, 변조되지도, 다르게 해석되지도 않게 네트워크에 전달하려면 어떻게 해야 할까?

3장에서 트랜잭션이 이 세 가지 문제를 한 번에 어떻게 해결하는지 알아볼게요.

핵심 요약

개념역할비유
개인키서명 생성. 절대 공개 불가도장
공개키서명 검증. 공개해도 안전도장 이미지
니모닉개인키 백업·복원용 12단어마스터 열쇠 복사본
지갑 주소공개키를 해시한 40자 식별자계좌번호
ENS주소에 붙이는 이름도메인
HSM키가 칩 밖으로 나가지 않는 하드웨어금고
멀티시그N개 키 중 M개 서명 필요, 온체인 검증공동 인감
MPC키를 조각으로 분산, 완전한 키는 없음분산 금고
📚 참고자료 보기