EIP-8374 리버트 후에도 웜 액세스 유지 (Persist Warm Access Sets Across Reverts)

Hegota 포함 제외 (DFI) · 수수료·가스 · 원문 상태 Draft · 2026-08-06 작성

호출이 실패해 되돌려져도(리버트) 그 안에서 한 번 읽은 주소와 저장소 키의 웜 상태를 지우지 않습니다. 같은 거래 안에서 다시 읽으면 비싼 콜드 비용 대신 싼 웜 비용만 냅니다.

왜 필요한가

이더리움은 거래 안에서 어떤 주소나 저장소 칸을 처음 읽을 때 비싼 값(콜드, cold)을 받고 두 번째부터는 싼 값(웜, warm)을 받습니다. 노드가 데이터베이스에서 데이터를 처음 꺼내 올 때 실제 비용이 들기 때문입니다. 지금 규칙(EIP-2929)은 어떤 호출이 실패해 되돌려지면 그 호출 안에서 읽었던 기록도 함께 지웁니다. 그런데 되돌리기는 상태 변경을 취소할 뿐, 이미 읽어 온 데이터를 노드의 캐시에서 내보내지는 않습니다. 같은 거래에서 그 데이터를 다시 읽으면 실제로는 싸게 끝나는데, 요금은 처음 읽는 것처럼 비싸게 매겨집니다. 이 EIP는 실제 비용과 요금의 어긋남을 없애고 클라이언트 구현에서 액세스 기록을 되돌리기 장치에서 떼어 내 단순하게 만들려고 합니다.

무엇이 바뀌나

지금

EIP-8374 이후

누구에게 영향이 있나

심층 설명

액세스 세트 롤백 제거

EIP-2929는 거래 범위의 두 집합 accessed_addresses와 accessed_storage_keys로 접근한 주소와 저장소 키를 추적하고 호출 프레임이 리버트하거나 예외로 멈추면 두 집합을 호출 전 상태로 되돌립니다. 이 EIP는 포크 블록부터 그 롤백을 없앱니다. 호출 프레임이 정상 완료 이외의 어떤 결과로 끝나더라도 두 집합을 되돌리면 안 됩니다(MUST NOT). 프레임 실행 중에 추가된 항목은 하위 호출이 추가한 항목까지 포함해 모두 집합에 남아야 합니다(MUST). 한 번 집합에 들어간 주소나 키는 거래가 끝날 때까지 웜으로 유지됩니다.

콜드 비용 지불과 집합 추가의 순서

콜드 계정 접근이나 콜드 저장소 접근에서는 콜드 접근 비용을 먼저 지불한 뒤에 해당 주소나 저장소 키를 집합에 추가해야 합니다(MUST). 그 비용을 낼 가스가 부족하면 항목을 추가하면 안 됩니다(MUST NOT). 비용을 한 번 지불했다면, 같은 명령 안에서 뒤이은 다른 비용 청구나 검사가 실패하더라도 항목은 집합에 남아야 합니다(MUST). 거래 시작 시점에 초기화되는 항목과 CREATE, CREATE2가 추가하는 주소에 대한 규칙은 EIP-2929에 정해진 그대로 유지됩니다.

왜 되돌리지 않아도 되는가

원문은 액세스 세트가 비용을 재는 계량 장치이지 관측 가능한 상태가 아니라고 설명합니다. 프레임을 되돌린다고 해서 클라이언트가 이미 읽은 바이트를 잊게 할 수는 없으므로, 집합을 되돌려도 보호되는 것이 없습니다. 집합을 추가 전용으로 만들면 두 번째 접근에 실제 비용만큼의 요금을 매기게 되고 저널에서 상태가 아니라 캐시를 흉내 내던 유일한 부분이 사라집니다. 대안으로 롤백을 유지하면서 반복되는 콜드 접근을 할인하는 방식도 있지만 원문은 이것이 세 번째 가격 구간을 더할 뿐 항목을 웜으로 두는 것보다 나을 게 없다고 봅니다.

하위 호환성과 가스 비용 변화

이 EIP는 하드포크가 필요합니다. 포크 뒤에는 이전에 콜드로 청구되던 일부 접근이 웜으로 청구되므로 거래는 싸지거나 같은 값이 되고 더 비싸지는 거래는 없습니다. 이 경우는 실패한 내부 호출이 읽었던 주소나 키를 바깥 프레임이 다시 읽을 때 생깁니다. 다만 리버트 뒤 접근의 정확한 가스 비용에 의존하는 컨트랙트는 가스 소모량이 달라질 수 있습니다.

테스트 케이스

원문은 EIP-2929의 접근 비용을 기준으로 네 가지 경우를 듭니다. 첫째, 프레임 A가 프레임 B를 DELEGATECALL하고 B가 A의 저장소 슬롯 s를 콜드 SLOAD한 뒤 리버트하면, A가 이어서 s를 읽을 때 웜 저장소 접근 비용을 냅니다. 둘째, A가 B를 호출하고 B가 주소 a의 콜드 BALANCE 비용을 낸 뒤 가스 부족으로 멈추면, A가 a에 접근할 때 웜 계정 접근 비용을 냅니다. 셋째, B가 주소 a의 콜드 접근 비용을 내기 전에 가스가 떨어지면 A의 접근은 콜드 계정 접근 비용을 냅니다. 넷째, 리버트된 프레임의 상태 변경은 되돌려진 채로 남고 액세스 세트 항목만 남습니다. EIP-8038이 활성화되어 있으면 WARM_STORAGE_READ_COST, COLD_SLOAD_COST, COLD_ACCOUNT_ACCESS_COST는 각각 WARM_ACCESS, COLD_STORAGE_ACCESS, COLD_ACCOUNT_ACCESS로 이름이 바뀝니다.

보안 고려 사항

웜 상태가 리버트를 넘어 유지되면, 거래가 나중에 되돌릴 프레임 안에서 주소와 저장소 키를 미리 웜으로 만들어 두고 그 뒤에 싸게 접근할 수 있습니다. 원문은 이것이 새로운 능력이 아니라고 설명합니다. EIP-2930 거래의 액세스 리스트가 이미 실행이 시작되기도 전에 임의의 주소와 저장소 키의 웜·콜드 상태를 똑같은 방식으로 바꾸기 때문입니다. 두 경우 모두 웜이 된 각 항목의 콜드 비용은 거래 안에서 한 번 지불되므로, 청구된 총 작업량은 여전히 클라이언트의 실제 로딩 비용을 덮습니다.

상태와 포크 논의

이 EIP는 Draft 상태이며 Dragan Rakita(@rakita)가 2026-08-06에 작성했습니다. 원문 상태가 Draft이므로 명세의 세부 규칙은 아직 바뀔 수 있습니다. 코어 개발자 콜에서는 08.13 ACDE #243에서 Hegota 후보(PFI)로 접수됐습니다. 호출이 실패해도 액세스 리스트의 웜 상태를 지우지 말자는 제안으로 소개됐습니다. 이후 10.08 ACDE #247에서 Hegota 후보에서 제외(DFI)됐습니다. 지지가 미지근했고 포크 경계의 깊은 변경이 복잡도만큼의 가치가 없다고 봤기 때문입니다.

EIP 원문 · ← EIPs