소프트포크와 하드포크 (Soft Fork & Hard Fork) - 규칙을 바꾸는 두 가지 방법
비트코인에는 업데이트 버튼이 없습니다. 규칙을 좁히는 소프트포크와 규칙을 넓히는 하드포크가 어떻게 다르고, 왜 비트코인이 소프트포크를 고집하는가.
비트코인에는 업데이트 버튼을 누를 회사가 없습니다. 그런데도 세그윗과 탭루트는 실제로 도입되었습니다. 주인 없는 시스템이 어떻게 규칙을 바꾸는가, 그 답이 소프트포크와 하드포크입니다.
둘의 차이는 한 문장으로 정리됩니다. 소프트포크는 규칙을 좁히고, 하드포크는 규칙을 넓힙니다. 이 방향의 차이 하나가 체인이 하나로 남는지 둘로 쪼개지는지를 결정합니다.
합의 규칙이란 무엇인가
모든 노드는 블록을 받으면 규칙 목록에 하나씩 대조해서 유효한지 판정합니다. 블록 가중치가 한도를 넘지 않았는가, 서명이 맞는가, 발행량이 정해진 만큼인가, 이미 쓴 출력을 또 쓰지 않았는가. 이 목록이 합의 규칙(consensus rules)입니다.
여기서 중요한 것은 규칙 자체가 아니라 규칙이 모두에게 같아야 한다는 점입니다. 내 노드가 유효하다고 본 블록을 당신의 노드가 무효라고 본다면, 두 사람은 이미 다른 화폐를 쓰고 있는 것입니다. 프로토콜 변경이 까다로운 이유가 여기 있습니다. 코드를 고치는 일이 어려운 게 아니라, 전 세계 수만 대의 노드가 같은 판정을 계속 내리게 만드는 일이 어렵습니다.
그래서 규칙 변경은 "무엇을 바꾸는가"보다 "바꾼 뒤에도 옛 노드가 새 블록을 받아들이는가"로 분류됩니다.
graph TB
A["새 규칙으로 만든 블록"] --> B{"업그레이드하지 않은<br/>옛 노드의 판정"}
B -->|"소프트포크<br/>옛 규칙도 통과"| C["수용<br/>체인은 하나로 유지"]
B -->|"하드포크<br/>옛 규칙을 위반"| D["거부<br/>체인이 둘로 분열"]
style C fill:#3fb950,stroke:#3fb950,color:#000
style D fill:#f85149,stroke:#f85149,color:#000소프트포크: 규칙을 좁힌다
소프트포크는 전에는 유효했던 것 중 일부를 무효로 만드는 변경입니다. 새 규칙에서 유효한 블록의 집합이 옛 규칙에서 유효한 블록의 부분집합이 됩니다.
이 방향이면 업그레이드하지 않은 노드도 새 블록을 문제없이 받아들입니다. 새 규칙을 지킨 블록은 옛 규칙도 자동으로 지키고 있기 때문입니다. 그래서 소프트포크는 하위 호환(backward compatible)이라고 불리고, 모두가 동시에 업그레이드하지 않아도 네트워크가 갈라지지 않습니다.
여기서 자연스러운 의문이 생깁니다. 규칙을 좁히기만 하는데 어떻게 새 기능이 추가되는가. 비트코인은 이 문제를 영리하게 우회합니다. 옛 노드에게 "누구나 쓸 수 있음(anyone-can-spend)"으로 보이는 여유 공간을 잡아, 새 노드에게만 엄격한 의미를 부여하는 방식입니다.
세그윗과 탭루트가 정확히 이 방식으로 도입되었습니다. 옛 노드는 세그윗 출력을 보고 "조건 없이 쓸 수 있는 출력이군"이라고 판단해 통과시키고, 업그레이드한 노드는 같은 출력에 대해 "서명이 맞아야만 쓸 수 있다"는 더 엄격한 조건을 강제합니다. 옛 노드 입장에서는 아무것도 어긴 게 없으므로 거부할 이유가 없습니다.
다만 공짜는 아닙니다. 옛 노드는 새 규칙을 검증하지 못하므로, 그 부분에 관해서는 채굴자를 믿는 상태가 됩니다. 소프트포크는 검증 주권을 조금 유예하는 대가로 무중단 업그레이드를 얻는 거래입니다. 그래서 소프트포크라도 결국은 각자 노드를 올리는 것이 맞습니다.
한 가지 더. 소프트포크가 안전하려면 해시레이트의 과반이 새 규칙을 강제해야 합니다. 소수만 강제하면 그들이 만든 블록이 더 긴 체인에 밀려 고아가 됩니다. 이것이 활성화 과정에서 채굴자 시그널링을 기다리는 이유입니다.
하드포크: 규칙을 넓힌다
하드포크는 전에는 무효였던 것을 유효로 만드는 변경입니다. 블록 크기 한도를 1MB에서 8MB로 올리거나, 2,100만 개 발행 상한을 바꾸거나, 새 연산자를 스크립트에 추가하는 일이 여기 해당합니다.
이 방향에서는 옛 노드가 새 블록을 반드시 거부합니다. 4MB짜리 블록은 1MB 한도를 아는 노드에게 그냥 규칙 위반입니다. 설득이나 협상의 여지가 없습니다. 소프트웨어가 그렇게 판정하도록 짜여 있을 뿐입니다.
graph TB B0["블록 N-1"] --> B1["블록 N<br/>(마지막 공통 블록)"] B1 --> C1["블록 N+1<br/>새 규칙 체인"] B1 --> D1["블록 N+1<br/>옛 규칙 체인"] C1 --> C2["새 규칙 체인 계속"] D1 --> D2["옛 규칙 체인 계속"] style B1 fill:#f7931a,stroke:#f7931a,color:#000 style C2 fill:#58a6ff,stroke:#58a6ff,color:#000 style D2 fill:#8b949e,stroke:#8b949e,color:#000
결과는 체인 분열입니다. 어느 한쪽이 조용히 사라지지 않는 한 두 개의 장부가 각자 자라고, 분기 시점까지의 거래 이력을 공유하는 두 개의 코인이 생깁니다. 2017년 비트코인 캐시가 갈라져 나갈 때 기존 보유자에게 같은 수량의 새 코인이 생긴 것도 마술이 아니라 이 때문입니다. 분기 이전의 출력은 양쪽 장부에 똑같이 적혀 있습니다.
그래서 하드포크는 모두가 사실상 동시에 업그레이드해야 성립합니다. 조율 비용이 압도적으로 크고, 조율에 실패하면 화폐가 쪼개집니다.
왜 비트코인은 소프트포크를 고집하는가
기술적으로는 하드포크가 더 깔끔한 경우가 많습니다. 세그윗의 증인 할인 같은 복잡한 우회 설계 없이, 원하는 규칙을 그냥 쓰면 되기 때문입니다. 그런데도 비트코인은 2017년 이후 모든 프로토콜 변경을 소프트포크로 처리했습니다. 이유는 기술이 아니라 권력의 문제입니다.
하드포크는 사용자에게 선택지를 주지 않습니다. 업그레이드하지 않으면 네트워크에서 이탈되므로, 실질적으로 따르거나 떠나거나입니다. 이 성질이 반복되면 규칙을 제안하는 쪽이 나머지를 끌고 갈 수 있게 됩니다. 강제 업그레이드가 관행이 된 시스템에서 발행량 상한 같은 약속은 "바뀌지 않는 것"이 아니라 "아직 바꾸지 않은 것"이 됩니다.
반면 소프트포크에서는 동의하지 않는 사람도 옛 소프트웨어로 계속 남아 있을 수 있습니다. 거부권이 각자의 손에 남아 있고, 변경을 밀어붙이는 쪽이 반대를 설득해야 합니다. 비트코인이 느리게 변하는 것은 결함이 아니라 이 구조가 의도한 결과입니다.
활성화는 어떻게 이루어지는가
규칙을 정했다고 바로 켜지지 않습니다. 언제부터 강제할지도 정해야 합니다.
BIP9 버전비트는 채굴자가 블록 헤더의 버전 필드로 찬성 신호를 보내고, 2016블록 구간에서 95%를 넘으면 잠기는 방식입니다. 세그윗이 이 방식을 시도했습니다.
UASF(사용자 활성화 소프트포크)는 채굴자 신호를 기다리지 않고, 특정 날짜부터 새 규칙을 지키지 않는 블록을 거부하겠다고 노드가 먼저 선언하는 방식입니다. 2017년 BIP148이 그 사례이며, 최종 권한이 채굴자가 아니라 경제적 노드에 있음을 보여준 사건으로 기록됩니다.
Speedy Trial은 탭루트에 쓰인 절충안입니다. 약 3개월의 짧은 창을 두고 난이도 구간에서 90% 시그널링을 요구하되, 실패해도 조용히 만료되게 했습니다. 활성화 논쟁이 다시 전쟁이 되는 것을 피하려는 설계였고, 실제로 탭루트는 2021년 6월에 잠겨 11월 블록 709,632에서 활성화되었습니다.
실제 사례
P2SH(2012년, BIP16)는 초기의 대표적 소프트포크로, 옛 노드에게는 조건 없는 출력으로 보이는 자리를 이용해 스크립트 해시 방식을 도입했습니다. CLTV(2015년, BIP65)와 CSV(2016년, BIP112)는 시간 잠금 연산자를 추가해 라이트닝 네트워크의 토대를 놓았습니다. 세그윗(2017년, BIP141)과 탭루트(2021년, BIP341)도 모두 소프트포크입니다.
의도된 하드포크의 사례는 2017년 8월 1일의 비트코인 캐시입니다. 블록 크기를 8MB로 올리며 체인이 영구히 분리되었습니다.
의도하지 않은 하드포크도 한 번 있었습니다. 2013년 3월, 버전 0.8이 데이터베이스 계층을 바꾸면서 옛 버전에만 존재하던 잠금 한도를 넘는 블록을 만들었고, 블록 225,430 부근에서 체인이 갈라졌습니다. 이 사건은 합의 규칙이 명세서에 적힌 문장이 아니라 실제로 돌아가는 구현의 동작이라는 점을 드러냈습니다. 문서에 없던 데이터베이스 설정값조차 합의 규칙의 일부였던 것입니다.
흔히 오해하는 것들
포크가 곧 새 코인 발행이라는 오해가 있습니다. 소프트포크는 코인을 만들지 않습니다. 새 코인이 생기는 것은 체인이 실제로 갈라져 살아남았을 때뿐이고, 그것도 발행이 아니라 기존 장부의 복제입니다.
채굴자가 규칙을 정한다는 오해도 흔합니다. 채굴자는 어떤 블록을 만들지 선택할 뿐이고, 그 블록이 유효한지 판정하는 것은 노드입니다. 규칙을 어긴 블록은 아무리 많은 작업증명이 들어가 있어도 거부됩니다. 2017년 UASF가 증명한 것이 정확히 이 점입니다.
마지막으로, 체인 분열과 재구성(reorg)은 다른 현상입니다. 재구성은 같은 규칙 아래서 더 긴 체인이 나타나 짧은 쪽이 버려지는 일시적 사건이고, 하드포크에 의한 분열은 규칙 자체가 달라져 두 체인이 서로를 영원히 무효로 보는 상태입니다.
연결되는 개념
- 세그윗 - anyone-can-spend 자리를 활용한 소프트포크의 대표 사례
- 탭루트 - Speedy Trial로 활성화된 가장 최근의 소프트포크
- 노드 - 규칙을 실제로 강제하고 포크의 승패를 결정하는 주체
- 마이닝 풀 - 활성화 시그널링에서 채굴자가 맡는 역할
- 2,100만 개가 끝, 사토시도 더는 못 만든다 - 하드포크 없이는 바꿀 수 없는 발행 상한