한양과학기술고등학교

에듀테크 프로젝트 대시보드

작업 증명 (Proof of Work)

작업 증명 (Proof of Work)

블록체인에서 새 블록을 추가하려면 정답을 맞히는 게 아니라 컴퓨터를 오래 돌려야 한다. 블록 내용에 숫자 하나(nonce)를 바꿔 붙여 가며 SHA-256 해시를 계산하고, 그 결과가 맨 앞에 0이 여러 개 나올 때까지 반복한다. 이 "노가다"의 증거가 바로 작업 증명이다. 해시는 한 글자만 바뀌어도 완전히 달라지므로, 예전 블록을 조작하면 그 뒤 모든 블록을 다시 채굴해야 한다.

1. SHA-256 해시 — 눈사태 효과

…

입력을 한 글자만 바꿔 보자. 출력 해시가 앞뒤 상관없이 전부 뒤집힌다(눈사태 효과 / avalanche). 그래서 해시값만 보고 원래 입력을 되돌리거나, 원하는 해시가 나오는 입력을 "계산"할 방법이 없다 — 오직 무작위로 시도해 볼 수 있을 뿐이다.

2. 블록 채굴 — nonce 찾기

0 × 3
아직 채굴 안 함
시도한 nonce
0
걸린 시간
0.00 s
해시레이트
0 H/s

난이도를 1 올릴 때마다 평균 시도 횟수가 약 16배(16진수라 자리당 16배)로 늘어난다. 실제 비트코인은 0이 19개 넘게 필요해서, 전 세계 채굴기가 10분에 겨우 하나를 찾는다.

3. 블록체인 — 하나 고치면 뒤가 전부 깨진다

어느 블록이든 데이터를 수정해 보자. 그 블록의 해시가 난이도 조건을 잃으면서 빨강이 되고, 다음 블록의 이전 해시와도 어긋나 연쇄적으로 무너진다. 공격자가 과거를 조작하려면 그 뒤 모든 블록을 혼자서 다시 채굴해 정직한 네트워크보다 빨라야 한다 — 사실상 불가능하다.

4. 채굴 루프 (의사코드)

# 난이도 = 앞에 와야 하는 0의 개수
def mine(block_data, prev_hash, difficulty):
    target = "0" * difficulty
    nonce = 0
    while True:
        text = block_data + prev_hash + str(nonce)
        h = sha256(text)
        if h.startswith(target):
            return nonce, h      # 작업 증명 완성
        nonce += 1              # 계속 다른 숫자로 재시도

# 검증은 딱 1번의 해시로 끝난다 — 만들기는 어렵고 확인은 쉽다
def verify(block, difficulty):
    h = sha256(block.data + block.prev_hash + str(block.nonce))
    return h == block.hash and h.startswith("0" * difficulty)

5. 핵심 정리

비대칭 난이도

답을 찾기는 어렵고 맞는지 확인은 순식간. 이 비대칭이 신뢰의 근거다.

nonce

블록에 붙이는 의미 없는 카운터. 조건을 만족하는 해시가 나올 때까지 1씩 늘린다.

난이도 조정

0의 개수(target)를 바꿔 블록 생성 속도를 일정하게 유지. +1이면 약 16배 더 오래.

체인 연결

각 블록이 이전 블록 해시를 품는다. 과거 변조 → 이후 전부 무효 → 재채굴 필요.

51% 공격

정직한 네트워크보다 빠르게 재채굴할 연산력(과반)이 있어야만 역사를 바꿀 수 있다.

PoW의 대가

보안을 전기·연산으로 사는 구조. 그래서 PoS 등 대안이 등장했다.