개념과 배경

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의 챌린지 윈도우와 브리지 지연을 고려해 타임라인을 설계함

간단 시나리오

한국과 미국에서 같은 높이 블록이 동시에 생성됨 각 지역 노드가 자신이 먼저 본 블록 위로 다음 블록을 쌓음 한쪽 체인이 한 블록 더 빨리 쌓이며 우세해지면 다른 쪽은 스테일 처리됨 스테일 체인에 있던 거래는 메모풀로 돌아가 메인 체인에 재포함을 기다림

참고자료