개념과 배경
Reorg는 동시에 생성된 블록로 체인이 잠시 분기된 뒤 합의 규칙에 따라 더 우세한 분기로 갈아타는 상황을 뜻함 짧아진 분기에 있던 블록은 활성 체인에서 제외되어 존재하지 않았던 것으로 취급됨 노드는 자신의 로컬 관점에서 더 우세한 체인을 발견하면 그 체인으로 교체하는데 이 현상은 네트워크 전체가 동시에 일어나는 게 아니라 각 노드에서 국소적으로 발생함
핵심 용어 정리
스테일 블록 best chain에 편입되지 못한 정상 블록을 말함
오펀 블록 전통적으로 부모를 모르는 블록을 의미하지만 커뮤니티에선 스테일 블록과 혼용되는 경우가 많음
리오그 깊이 교체되는 블록의 개수로 측정함
메인 체인 선택 규칙
- PoW에선 누적 작업량이 큰 체인이 우선됨
- 이더리움 PoS에선 LMD-GHOST 포크초이스를 따르되 마지막 최종화 지점 하위만 후보가 됨
왜 리오그가 생김
- 네트워크 지연이나 전파 경합으로 같은 높이의 블록이 동시에 생성됨
- 일부 노드는 A를, 다른 노드는 B를 바탕으로 다음 블록을 쌓음
- 시간이 지나 우세한 체인이 결정되면 노드가 그 체인으로 교체함
- 버려진 체인의 트랜잭션은 소실되는 게 아니라 다시 메모풀로 돌아가 재포함을 기다림
합의별 리오그의 차이
PoW 계열 직관
- 우세 체인 기준은 블록 수가 아니라 누적 작업량임
- 자연 발생 리오그는 보통 깊이 1에서 끝남
- 보안 관례로 비트코인은 6컨펌 정도를 사람·서비스가 안전 구간으로 삼는 경우가 많음
- 다수 해시 파워를 가진 상대는 더 깊은 리오그를 인위적으로 만들 수 있으므로 고가치 결제일수록 더 많은 컨펌을 기다리는 전략이 쓰임
이더리움 PoS 직관
- 슬롯은 12초, 32슬롯이 1에폭이며 포크초이스는 LMD-GHOST와 FFG 최종화 규칙을 함께 사용함
- 헤드는 가장 최근 가중치가 높은 체인 머리, 세이프 헤드는 보수적 추정, 파이널라이즈드는 FFG로 최종화된 체크포인트 아래 체인 상태를 뜻함
- 정상 조건에선 리오그 깊이가 작고 파이널라이즈드 이후로의 리오그는 대규모 비정상 행동 없이는 사실상 불가에 가까움
- 대략 두 개의 에폭이 지나면 보통 최종화되어 실사용에선 약 12분 남짓을 강한 확정 구간으로 본다는 관례가 있음 환경과 네트워크 상황에 따라 달라질 수 있음
L2에서의 리오그 관점
- L2→L1 메시지는 L1에 기록되고 관련 규칙을 충족하면 재전송하지 않음
- 옵티미스틱 롤업은 챌린지 윈도우가 지나야 강한 확정으로 취급하며 그 전에는 지연을 감안해야 함
- L1이 뒤집히는 아주 이례적인 상황을 제외하면 L1에 최종적으로 기록된 상태는 다시 뒤집히지 않는다는 점을 전제로 시스템을 설계함
리오그와 헷갈리기 쉬운 것들
- RBF나 수수료 경쟁으로 인해 메모풀에서 트랜잭션이 교체되는 현상은 리오그와 별개임
- 프로토콜 업그레이드를 위한 하드포크는 합의 규칙 자체를 바꾸는 이벤트이며 자연 발생 리오그와는 범주가 다름
- 과거 이더리움 PoW 시절의 옴머 포함은 스테일 블록 보상 메커니즘일 뿐 리오그 자체가 아님
서비스 설계에 미치는 영향
결제와 출금
- 자산·위험도·체인별로 컨펌 수 정책을 문서화해 운영함
- 고가치 결제는 더 많은 컨펌을 요구하고 저가치·소액은 사용자 경험을 위해 낮출 수 있음
데이터 처리
- 인덱싱은 높이만 저장하지 말고 블록 해시와 부모 해시를 함께 저장
- 리오그 감지 시 롤백 가능한 저널을 두고 되감기 후 재처리
트랜잭션 처리
- 멱등성 확보를 위해 논스·컨트랙트 상태·이벤트 ID를 함께 검증
- 재방송은 동일 논스로 수행해 중복 실행을 피함
UX
- 잠정 상태 표시와 컨펌 카운터 제공
- 세이프 헤드와 파이널라이즈드의 차이를 사용자에게 명확히 안내
리오그 감지와 대응 패턴
헤드 해시 변화 모니터링과 특정 깊이 이상 변화시 경보
최신 N개 블록의 체인ID·높이·해시·부모 해시·도착 시각을 원장과 별도 테이블에 윈도우로 관리
확정 레벨별로 파이프라인을 분기
- 헤드 기준 실시간 기능
- 세이프 기준 중요 알림
- 파이널 기준 영구 저장
간단 의사코드
onNewBlock(b):
save(b.height, b.hash, b.parent)
if parentNotHead():
// reorg 발생
rollbackUntilCommonAncestor()
replayFromAncestor()
routePipelinesByCommitment(head, safe, finalized)
운영 체크리스트
- 컨펌 정책과 리오그 최대 허용 깊도가 문서화되어 있음
- 인덱서가 롤백과 재처리를 지원함
- 알림 시스템이 헤드 전환과 리오그 이벤트를 기록함
- 파이널라이즈드 구간만 영구 저장하거나 백그라운드 확정화 작업을 운영함
- L2의 챌린지 윈도우와 브리지 지연을 고려해 타임라인을 설계함
간단 시나리오
한국과 미국에서 같은 높이 블록이 동시에 생성됨 각 지역 노드가 자신이 먼저 본 블록 위로 다음 블록을 쌓음 한쪽 체인이 한 블록 더 빨리 쌓이며 우세해지면 다른 쪽은 스테일 처리됨 스테일 체인에 있던 거래는 메모풀로 돌아가 메인 체인에 재포함을 기다림
참고자료
- https://en.bitcoin.it/wiki/Chain_Reorganization?utm_source=chatgpt.com
- https://learnmeabitcoin.com/technical/blockchain/chain-reorganization/?utm_source=chatgpt.com
- https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/?utm_source=chatgpt.com
- https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/?utm_source=chatgpt.com
- https://www.alchemy.com/overviews/ethereum-commitment-levels?utm_source=chatgpt.com