EIP-7732 프로토콜에 내재화된 제안자·빌더 분리 (Enshrined Proposer-Builder Separation)
콜 결정 없음 · 합의·스테이킹 · 원문 상태 Last Call · 2024-06-28 작성
비컨 블록에서 실행 페이로드를 떼어내 블록을 합의 부분과 실행 부분으로 나누고 제안자가 프로토콜 안에서 빌더의 비드를 골라 블록 제작을 맡기게 합니다. 신뢰 중개자 없는 제안자·빌더 분리입니다.
왜 필요한가
지금 대부분의 비컨 블록 제안자는 블록의 실행 부분 제작을 외부 빌더에게 맡깁니다. 이때 빌더가 약속한 페이로드를 실제 블록으로 바꿔 방송해 주는 신뢰 중개자를 거쳐야 해서 제안자와 빌더 모두 상대방과 중개자의 선의에 기대야 합니다. 또 검증자는 블록을 받은 뒤 슬롯의 3분의 1이라는 짧은 시간 안에 합의 검증, 실행 검증, 블롭 데이터 가용성 확인을 모두 끝내고 투표해야 합니다. 실행 페이로드 전체가 비컨 블록에 실려 있어 전파도 느립니다. 이 EIP는 빌더를 프로토콜 안의 예치 주체로 만들어, 중개자 없이도 정직한 제안자는 빌더의 행동과 무관하게 지불을 받고 정직한 빌더의 페이로드는 제안자의 행동과 무관하게 체인의 머리가 되도록 보장합니다. 실행 검증은 슬롯 후반으로 미뤄져 투표 전 핵심 구간의 부담이 줄고 블롭 데이터를 빌더가 일찍 방송할 수 있어 블롭 트랜잭션 포함에 따른 리오그 위험도 줄어듭니다.
무엇이 바뀌나
지금
- 제안자는 신뢰할 수 있는 중개자를 거쳐 빌더에게 블록 제작을 맡깁니다
- 검증자는 슬롯의 3분의 1 안에 합의 검증, 실행 검증, 블롭 데이터 확인을 모두 끝내야 합니다
- 실행 페이로드 전체가 비컨 블록에 실려 전파가 느립니다
- 빌더의 지불과 페이로드 포함이 모두 상대방의 선의에 기댑니다
EIP-7732 이후
- 빌더가 1 ETH부터 예치하는 프로토콜 내 주체가 되고 비컨 블록에는 빌더의 서명된 비드만 담깁니다
- 검증자는 투표 전에 합의 부분만 검증하고 실행과 데이터 검증은 슬롯 후반으로 미룹니다
- 빌더 지불은 비컨 체인 예치금에서 무신뢰로 정산되고 새 위원회(PTC)가 페이로드 공개의 적시성에 투표합니다
- 중개자 없이 제안자와 빌더가 공정하게 교환합니다
누구에게 영향이 있나
- 검증자: 페이로드 적시성 위원회(PTC)라는 새 의무가 생기는 대신 투표 전 검증 부담이 줄고 빌더가 무효 페이로드를 내도 어테스테이션을 놓치지 않게 됩니다.
- 빌더: 비컨 체인에 예치하고 BLS 키로 비드에 서명하는 프로토콜 내 주체가 됩니다. 제안자에게 약속한 지불이 예치금에서 강제로 집행됩니다.
- 클라이언트 팀: 비컨 블록 구조, 상태전이, 포크초이스, P2P가 모두 바뀌는 대규모 하드포크를 구현해야 합니다.
- 사용자: 슬롯 N에 포함된 트랜잭션은 슬롯 N+1의 제안자가 그 위에 블록을 올리고 어테스터가 투표해야 널리 검증됩니다.
심층 설명
빌더 등록과 예치 경로
빌더는 비컨 상태의 별도 레지스트리(builders)에 기록되는 새 예치 주체입니다. 검증자가 아니므로 어테스테이션이나 위원회에 참여하지 않고 검증자용 예치·탈퇴 churn 대기열도 적용받지 않으며 최소 1 ETH부터 예치할 수 있습니다. 등록과 충전, 탈퇴는 실행 계층에 새로 배포되는 빌더 예치 컨트랙트와 빌더 탈퇴 컨트랙트로만 하며 각 요청은 EIP-7685 요청 타입 BUILDER_DEPOSIT_REQUEST_TYPE = 0x03, BUILDER_EXIT_REQUEST_TYPE = 0x04으로 합의 계층에 전달됩니다. 페이로드당 예치 요청은 MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD = 64개, 탈퇴 요청은 MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD = 16개까지입니다. 예치 서명은 전용 도메인 DOMAIN_BUILDER_DEPOSIT을 써서 검증자 예치 서명과 서로 재사용될 수 없게 합니다. 탈퇴는 빌더의 실행 주소에서 보낸 요청만 유효하고 미결 지불·출금이 남아 있으면 불가하며 탈퇴 후 MIN_BUILDER_WITHDRAWABILITY_DELAY(64 에포크)가 지나야 출금할 수 있습니다. 완전히 출금된 빌더의 인덱스는 재사용되므로 공개키·인덱스를 캐시하는 구현은 주의해야 합니다.
비컨 블록과 상태 구조 변경
BeaconBlockBody에서 execution_payload, blob_kzg_commitments, execution_requests가 빠지고 signed_execution_payload_bid, payload_attestations, parent_execution_requests가 들어갑니다. 기존 ExecutionPayloadHeader는 ExecutionPayloadBid로 바뀌어 parent_block_hash, block_hash, prev_randao, fee_recipient, gas_limit, builder_index, slot, value, blob_kzg_commitments, execution_requests_root 등 페이로드를 약속하는 데 필요한 최소 정보만 담습니다. 제안자가 직접 블록을 만들면 builder_index에 BUILDER_INDEX_SELF_BUILD(UINT64_MAX), value 0, 무한원점 서명을 씁니다. 빌더는 이후 페이로드와 실행 요청을 담은 ExecutionPayloadEnvelope에 서명해 공개합니다. BeaconState에는 builders, latest_block_hash, execution_payload_availability, builder_pending_payments, builder_pending_withdrawals, latest_execution_payload_bid, payload_expected_withdrawals, ptc_window 등이 추가됩니다.
페이로드 적시성 위원회(PTC)
각 슬롯 비컨 위원회들을 이어 붙인 집합에서 유효 잔고 가중 샘플링으로 PTC_SIZE(512)명을 뽑아 PTC를 구성하고 할당 결과는 ptc_window에 캐시합니다. PTC 멤버는 슬롯의 PAYLOAD_ATTESTATION_DUE_BPS(7500bp) 전에 PayloadAttestationMessage를 방송해, 빌더가 PAYLOAD_DUE_BPS(5000bp) 전에 약속한 블록해시의 페이로드를 공개했는지(payload_present)와 블롭 데이터가 가용한지(blob_data_available)를 알립니다. 실행 페이로드 자체를 검증할 필요는 없고 서명과 블록해시 같은 기본 확인만 합니다. 비컨 블록에는 이전 슬롯의 PTC 어테스테이션을 MAX_PAYLOAD_ATTESTATIONS(4)개까지 담아 process_payload_attestation으로 처리합니다. 포크초이스에서 직전 슬롯 페이로드의 포함 판정에는 PAYLOAD_TIMELY_THRESHOLD와 DATA_AVAILABILITY_TIMELY_THRESHOLD(둘 다 PTC_SIZE // 2)를 넘는 투표가 쓰입니다. PTC 이중 투표에는 별도 처벌이 없는데, 공격이 빌더에게 비용을 지우는 구조라 구현 단순성을 택했다고 원문은 설명합니다.
2단계 상태전이와 이연 처리
상태전이가 서명된 비컨 블록 처리와 서명된 페이로드 엔벌로프 처리로 나뉩니다. 비컨 상태는 비컨 블록만 바꾸고 엔벌로프는 verify_execution_payload_envelope라는 순수 검증 함수로 확인만 합니다. 페이로드의 합의 계층 효과(빌더 지불 정산, 예치·출금·통합·빌더 예치·빌더 탈퇴 요청 처리, 가용성 비트 기록, latest_block_hash 갱신)는 다음 비컨 블록 처리의 맨 앞에서 process_parent_execution_payload로 적용되며 이때 블록의 parent_execution_requests를 부모 비드의 execution_requests_root와 대조합니다. 블록당 비컨 상태가 하나로 유지되어 클라이언트가 같은 블록의 empty와 full 사후 상태를 따로 보관하거나 재생성할 필요가 없고 빌더도 합의 상태전이를 계산할 필요가 없습니다. 대신 실행 요청이 부모가 아닌 자식 블록의 슬롯에서 처리됩니다. 출금은 예외로 비컨 블록 처리 때 즉시 차감하고 payload_expected_withdrawals에 기록해, 다음 페이로드가 정확히 같은 목록을 포함하지 않으면 무효가 되게 합니다. 차감을 미루면 총공급 불변식이 깨질 수 있기 때문입니다.
빌더 지불과 제안자 보호
비드를 담은 비컨 블록을 처리할 때 process_execution_payload_bid가 빌더가 활성인지, 잔고가 MIN_DEPOSIT_AMOUNT와 모든 미결 지불·출금을 더한 금액보다 비드 value만큼 더 많은지 확인하고 BuilderPendingPayment를 기록합니다. 지불이 출금으로 확정되는 경로는 둘입니다. 해당 페이로드가 온체인에 포함되거나, 포함되지 않았더라도 그 비컨 블록이 슬롯당 활성 잔고의 60%(BUILDER_PAYMENT_THRESHOLD_NUMERATOR/BUILDER_PAYMENT_THRESHOLD_DENOMINATOR = 6/10) 이상을 같은 슬롯 어테스테이션으로 받으면 에포크 전환의 process_builder_pending_payments에서 지불됩니다. 블록이 제때 나왔다면 빌더 행동과 무관하게 제안자가 돈을 받는 무조건 지불 장치입니다. 반대로 비드를 담은 블록이 늦게 공개되면 빌더는 비드 값을 물지 않습니다(빌더 보류 안전). 슬래싱된 제안자의 미결 지불은 slash_validator에서 제거되고 빌더 지불 출금은 builder_pending_withdrawals 큐에서 다른 모든 출금보다 먼저 처리됩니다. 프로토콜 내 지불 외에 다른 곳에서 이행되는 약속 형태의 신뢰 기반 지불도 수용합니다.
포크초이스 변경
포크초이스 노드가 (root, payload_status) 쌍이 되고 상태는 PENDING, EMPTY, FULL 중 하나입니다. 어테스테이션은 Electra 이후 쓰이지 않던 AttestationData의 index 필드로 페이로드 포함 여부를 함께 투표합니다. 0은 현재 블록이나 페이로드 없는 과거 블록, 1은 페이로드 있는 과거 블록이고 이 값이 비컨 상태의 가용성 기록과 맞아야 timely head 플래그를 받습니다. 직전 슬롯 페이로드의 정식 체인 포함 여부는 어테스테이션 가중치가 아니라 타이브레이커로 정합니다. 페이로드가 로컬에서 검증됐고 PTC가 적시성과 데이터 가용성에 기준 이상 투표했거나 프로포저 부스트를 받은 현재 블록이 그 위에 쌓였다면 FULL 쪽을 선호합니다. 블롭 가용성 검사는 on_block에서 빠지고 새 핸들러 on_execution_payload_envelope가 맡으며 on_payload_attestation_message가 PTC 투표를 집계합니다. 이 구조로 제안자 무조건 지불, 빌더 공개 안전(제때 공개한 페이로드는 포함됨), 빌더 보류 안전이 명시된 보안 마진 아래 보장됩니다.
P2P와 역할 변화
새 전역 토픽 네 개가 생깁니다. execution_payload_bid(빌더 비드, 슬롯·부모당 최고가만 전달되고 제안자 선호와 맞아야 하며 execution_payment를 실으면 안 됨), execution_payload(서명된 엔벌로프), payload_attestation_message(PTC 투표), proposer_preferences(제안자가 미리 공지하는 수수료 수령 주소와 목표 가스 한도)입니다. 선호 공지가 없는 슬롯의 비드는 전파되지 않습니다. index가 1보다 큰 어테스테이션은 거부되고 1인 어테스테이션은 해당 페이로드를 보기 전까지 무시됩니다. DataColumnSidecar는 KZG 커밋먼트와 블록 헤더, 포함 증명을 빼고 slot과 beacon_block_root만 담아 비드의 커밋먼트로 검증하며 제작과 방송을 빌더가 맡습니다. 빌더는 비드를 담은 비컨 블록이 늦었고 자기 시점에서 머리가 아니면 페이로드를 보류할 수 있습니다. ExecutionPayloadEnvelopesByRange와 ExecutionPayloadEnvelopesByRoot 요청·응답 메서드도 추가됩니다. 엔진 API는 새 실행 요청 타입 지원 외에 바뀌지 않습니다.
보안 고려와 진행 상황
경제적으로 합리적이지만 악의적인 빌더는 이득이 될 때 페이로드를 보류할 수 있고(프리 옵션 문제), 시뮬레이션 예비 데이터에 따르면 이런 일이 눈에 띌 수 있습니다. 완화책으로 페이로드를 포함시키지 못한 빌더에 대한 가변 페널티가 제안됐습니다. 연속 블록과 전체 지분의 20% 이상을 가진 제안자·어테스터 결탁은 빌더의 페이로드를 리오그하면서 비드 값을 물릴 수 있습니다. 전체 지분의 35%를 가진 공격자가 PTC 과반을 잡는 데 걸리는 기대 시간은 205,000년입니다. 원문 상태는 Last Call이고 마감(last-call-deadline)은 2026-11-01이어서 최종 확정 전 세부가 바뀔 여지가 있습니다. 콜 기록으로는 07.02 ACDE #240에서 예비 빌더 예치 컨트랙트(sys-asm PR #49)에 예치를 끌 수 있는 안전장치를 데브넷7에 넣기로 확정했고 데브넷7의 ePBS 슬롯 마감을 어테스테이션 3초, 페이로드 6초, PTC 9초로 정했으며 최종 확정은 월요일 ACDT에서 하기로 했습니다. 08.29 AMA #14에서도 논의됐지만 결정은 없었습니다.