EIP-8237 합의·실행 계층 독립 동기화 (Independent CL/EL Sync)

Hegota 포함 제외 (DFI) · 네트워크·노드 · 원문 상태 Draft · 2026-04-22 작성

입찰에 들어 있던 execution_requests_root를 SHA256 누적기 해시인 partial_header_hash로 바꿔 합의 계층이 실행 페이로드를 내려받지 않고도 범위 동기화를 할 수 있게 합니다.

왜 필요한가

지금은 새 노드가 체인을 따라잡는 범위 동기화(range sync)를 할 때 합의 계층(CL)이 블록을 대량으로 받아 합의 상태 전이를 실행하고 블록마다 실행 페이로드를 실행 엔진에 보내 검증을 받아야 합니다. EIP-7732가 페이로드를 비컨 블록에서 분리했기 때문에 원리상 CL은 비컨 블록만 받아도 됩니다. 그러면 대역폭과 CPU 지연을 크게 줄일 수 있습니다. 그런데 페이로드 봉투(ExecutionPayloadEnvelope)를 받지 않으면 페이로드의 블록 해시가 입찰(bid)에 적힌 block_hash와 맞는지, 실행 요청(execution requests) 같은 필드가 입찰의 execution_requests_root와 맞는지 확인할 길이 없습니다. 이 EIP는 검증이 필요한 필드들을 하나로 묶어 블록 간에 이어지는 SHA256 누적기 해시를 두는 방식으로 이 문제를 풉니다. 실행 계층(EL)이 나중에 따라잡으면 CL은 개별 페이로드 없이도 커밋 체인 전체가 일관됐는지 한 번에 확인할 수 있습니다.

무엇이 바뀌나

지금

EIP-8237 이후

누구에게 영향이 있나

심층 설명

ExecutionPayloadBid에서 execution_requests_root 제거

EIP-7732가 도입한 ExecutionPayloadBid 컨테이너에서 execution_requests_root 필드를 없앱니다. 남는 필드는 parent_block_hash, parent_block_root, block_hash, prev_randao, fee_recipient, gas_limit, builder_index, slot, value, execution_payment, blob_kzg_commitments입니다. 실행 요청에 대한 커밋은 루트 해시 대신 누적기 방식으로 옮겨 갑니다.

partial_header_hash 누적기 정의

BeaconBlockBody에 Hash32 타입의 partial_header_hash가 추가됩니다. compute_partial_header_hash는 parent_hash, prev_randao, gas_limit, timestamp, withdrawals, slot_number, execution_requests를 바이트로 이어 붙여 SHA256을 한 번 돌린 값입니다. uint64는 리틀 엔디언 8바이트, 리스트는 각 원소의 바이트를 그대로 이어 붙입니다. SSZ hash_tree_root 대신 평범한 SHA256을 쓰는 이유는 EL이 SSZ 해싱 인프라를 구현하고 있지 않기 때문입니다. 이 값은 머클 증명이 필요 없고 값 체인에 대한 구속력 있는 커밋이기만 하면 됩니다.

합의 계층 검증 변경

verify_execution_payload_envelope에서 hash_tree_root(envelope.execution_requests) == bid.execution_requests_root 검사가 사라집니다. 대신 state.latest_execution_payload_bid의 parent_block_hash, prev_randao, gas_limit, compute_timestamp_at_slot(state, bid.slot), state.payload_expected_withdrawals, bid.slot, requests로 계산한 compute_partial_header_hash가 envelope.payload.partial_header_hash와 같은지 확인합니다. process_parent_execution_payload의 hash_tree_root(requests) == parent_bid.execution_requests_root 검사도 같은 방식으로 block.body.partial_header_hash와 대조하는 검사로 바뀝니다. 후자는 full로 빌드된 블록에 적용됩니다.

실행 계층의 독립 검증

ExecutionPayload 컨테이너에 partial_header_hash: Hash32 필드가 추가되고 EL 블록 헤더(Header)에도 같은 필드가 들어가 block_hash가 이 값을 커버합니다. EL은 block.parent_hash, block.prev_randao, block.gas_limit, block.timestamp, block.withdrawals, block.slot_number, execution_requests로 같은 누적기 함수를 독립적으로 계산해 페이로드의 값과 일치하는지 반드시 검증해야 합니다. 두 계층이 같은 커밋 체인을 각자 유지하고 검증하므로, 동기화 중 계층 간 통신 없이도 각 계층이 불일치를 스스로 감지할 수 있습니다.

분기점 탐색용 엔진 API 메서드

긴 범위 동기화가 끝난 뒤 CL이 첫 가십 페이로드를 보냈을 때 두 계층의 누적기가 어긋나 있으면 체인이 잘못됐다는 것은 알 수 있지만 어디서 어긋났는지는 알 수 없습니다. 이를 위해 주어진 block_hash에 해당하는 블록의 누적기 값을 돌려주는 새 엔진 API 메서드가 필요하며 CL은 블록 해시별로 값을 조회해 분기 지점을 찾습니다.

보안 가정과 호환성

새 신뢰 가정은 없습니다. CL은 결국 모든 실행 페이로드를 검증하며 범위 동기화 동안 그 검증을 미룰 뿐입니다. 누적기는 미뤄진 검증이 어떤 불일치든 잡아낸다는 것을 암호학적으로 보장합니다. 다만 ExecutionPayloadBid, BeaconBlockBody, ExecutionPayload 컨테이너를 바꾸는 합의 파괴적 변경이므로 하드포크로 활성화해야 합니다.

상태와 포크 결정

이 EIP는 Draft 상태라 명세가 아직 바뀔 수 있습니다. 2026년 9월 17일 ACDC #187 콜에서 EIP-8237은 EIP-8341, 8367, 8321, 8243, 8146, 8375와 함께 헤고타(Hegota) 후보에서 제외(DFI)됐습니다.

EIP 원문 · ← EIPs