EIP-7886 지연 실행 (Delayed execution)
콜 결정 없음 · 확장성·데이터 · 원문 상태 Stagnant · 2025-02-18 작성
블록 검증과 실행을 분리해, 검증자가 거래를 실행하지 않고도 블록의 유효성을 확인하고 증명할 수 있게 합니다. 실행 결과는 다음 블록에서 검증합니다.
왜 필요한가
지금 이더리움에서 검증자는 블록 안의 거래를 전부 실행한 뒤에야 그 블록이 유효하다고 투표(증명, attestation)할 수 있습니다. 실행이 끝나기를 기다려야 하므로 합의 과정에 병목이 생기고 이것이 네트워크가 처리할 수 있는 거래량의 한계로 이어집니다. 이 제안은 발상을 바꿉니다. 블록의 구조가 올바른지, 거래를 보낸 사람이 수수료를 낼 돈을 미리 충분히 갖고 있는지 같은 검사만으로 블록을 유효하다고 인정하고 실제 실행은 나중에 확인합니다. 만약 실행 결과가 블록에 신고된 값과 다르면 블록 전체를 무효로 만드는 대신 실행 결과만 되돌립니다. 이렇게 하면 증명을 슬롯의 더 이른 시점에 할 수 있어, 블록 가스 한도를 높이고 처리량을 크게 늘릴 여지가 생깁니다.
무엇이 바뀌나
지금
- 검증자는 블록의 거래를 모두 실행한 뒤에야 증명 투표를 할 수 있습니다
- 실행 결과가 신고된 값과 다르면 블록 자체가 무효가 됩니다
- 실행 대기가 합의의 병목이 되어 가스 한도를 올리기 어렵습니다
EIP-7886 이후
- 서명, 잔액, 논스 같은 실행 없이 가능한 검사만으로 블록을 증명합니다
- 가스 신고가 틀리면 블록은 유효한 채로 남고 실행 결과만 되돌립니다
- 증명이 실행과 독립적으로 일찍 이뤄져 가스 한도 상향과 처리량 개선 여지가 생깁니다
누구에게 영향이 있나
- 검증자: 블록 실행이 끝나기 전에 정적 검사만으로 증명 투표를 할 수 있습니다.
- 클라이언트 팀: 블록 헤더 구조와 검증·실행 파이프라인을 모두 바꿔야 하는 하드포크급 변경입니다.
- 블록 제안자: gas_used를 잘못 신고하면 블록 실행이 통째로 되돌려지고 해당 블록의 실행 계층 보상을 잃습니다.
- 사용자와 앱 개발자: 드물게 블록 실행이 되돌려지면 그 블록에 담긴 거래의 상태 변경이 적용되지 않으므로, 영수증과 로그가 한 블록 늦게 확정되는 구조를 고려해야 합니다.
심층 설명
헤더 변경: 실행 결과를 한 블록 뒤로 미룸
블록 헤더에 pre_state_root(거래 실행 전 상태 루트)와 부모 블록의 실행 결과 네 가지, 즉 parent_transactions_root, parent_receipt_root, parent_bloom, parent_requests_hash, 그리고 부모 실행이 되돌려졌는지 나타내는 parent_execution_reverted가 추가됩니다. pre_state_root는 부모 블록 실행 후 상태 루트와 일치해야 하고 부모 실행 결과 필드들은 체인이 추적하는 last_transactions_root, last_receipt_root, last_block_logs_bloom, last_requests_hash, last_execution_reverted와 각각 일치해야 합니다. 블록 N의 실행 결과는 블록 N이 아니라 블록 N+1의 헤더에서 검증됩니다.
정적 검증: 실행 없이 확인하는 것들
validate_block은 거래를 실행하지 않고 각 거래의 서명과 타입별 요건(EIP-1559, EIP-4844 등), 발신자가 EOA이거나 유효한 위임 코드를 가진 계정인지(EIP-7702), 발신자 잔액이 최대 가스 수수료와 전송 금액의 합 이상인지, 논스가 발신자별로 순서대로 맞는지를 검사합니다. 포함 가스는 거래마다 max(intrinsic_gas, calldata_floor_gas_cost), 즉 고유 가스 비용과 EIP-7623 콜데이터 바닥 비용 중 큰 값으로 집계하며 그 합계 total_inclusion_gas가 헤더의 gas_used를 넘으면 블록이 무효입니다. 블롭 가스 합계는 blob_gas_used와 정확히 일치해야 하고 출금 트라이 루트도 헤더 값과 맞아야 합니다.
선납 메커니즘: 최대 수수료를 먼저 차감
실행 단계에서는 거래를 처리하기 전에 deduct_max_tx_fee_from_sender_balance로 모든 발신자에게서 최대 수수료를 먼저 차감합니다. 최대 수수료는 tx.gas에 유효 가스 가격(effective gas price)을 곱한 값에, 블롭 가스 사용량과 블롭 가스 가격을 곱한 값을 더해 계산합니다. 이 선납이 있기 때문에 실행을 하지 않아도 블록에 담긴 거래들이 수수료를 감당할 수 있다는 보장이 성립하고 검증자가 실행 전에 증명할 수 있는 근거가 됩니다. EIP-1559 동적 수수료 거래와 EIP-4844 블롭 거래 모두와 호환됩니다.
스냅샷과 실행 되돌림
클라이언트는 EIP-4788(비콘 루트)과 EIP-2935(히스토리 저장) 시스템 트랜잭션을 처리한 뒤, 사용자 거래 실행 전에 블록 단위 상태 스냅샷을 만듭니다. 거래는 순서대로 실행하되, 다음 거래의 tx.gas를 더하면 블록 가스 한도를 넘는 시점에서 execution_reverted를 True로 놓고 중단합니다. 실행이 끝난 뒤 실제 가스 사용량이 헤더의 gas_used와 다르면 역시 되돌림이 일어납니다. 되돌림 시 상태를 스냅샷으로 롤백하고 영수증, 로그, 요청 등 모든 실행 출력을 비우며 가스 사용량은 0으로 처리합니다. EIP-7685 범용 요청도 생성하지 않습니다. 이때도 블록 자체는 유효한 채로 체인에 남습니다.
되돌림 이후의 기본 수수료 계산
블록 실행이 되돌려지면 체인 상태의 last_execution_reverted가 True가 되고 다음 블록은 이를 parent_execution_reverted로 헤더에 반영해야 합니다. 이때 다음 블록의 기본 수수료(base fee) 계산은 헤더에 신고된 값과 무관하게 부모 블록의 가스 사용량을 0으로 간주합니다. 실제로 적용되지 않은 실행이 수수료 시장에 반영되는 것을 막고 잘못된 가스 신고로 수수료를 조작하는 것을 방지하기 위한 설계입니다.
데이터 저장 부담과 공격 유인 분석
실행이 되돌려진 블록이라도 콜데이터, EIP-2930 접근 목록, 블롭 데이터는 동기화와 블록 검증을 위해 모든 노드가 저장해야 합니다. 그래서 일부러 가스를 잘못 신고해 블록을 되돌리면서 큰 데이터를 싸게 체인에 올리는 공격이 이론상 가능합니다. 원문은 이 공격이 경제적으로 지속 불가능하다고 분석합니다. 가스를 잘못 신고한 제안자는 그 블록의 실행 계층 보상을 전부 잃고 공격에는 합의 계층에서 희소한 자원인 블록 생산권이 필요하기 때문입니다. 보상을 포기하는 비용이 얻을 수 있는 이익보다 크다는 것이 원문의 결론입니다.
현재 상태와 논의 경과
이 EIP는 하드포크가 필요한 코어 변경이며 원문 상태는 Stagnant입니다. 활발한 진행이 멈춘 상태라는 뜻으로, 내용이 그대로 재추진될지 바뀔지는 정해지지 않았습니다. 콜 기록으로는 08.29 AMA #14에서 논의되었고 결정은 없었습니다.