Tech/EIPs/#6780
EIP 6780카테고리 · 코어유형 · 표준 트랙상태 · 최종

SELFDESTRUCT only in same transaction

쉬운 설명

기존에는 SELFDESTRUCT 명령으로 컨트랙트를 영구 삭제할 수 있었지만, 이 EIP 이후로는 같은 트랜잭션에서 배포된 경우에만 삭제가 허용돼요. 상태 트리를 안정적으로 유지하기 위한 조치예요.

EIP-6780은 2024년 Dencun 업그레이드에서 적용된 Core EIP로, SELFDESTRUCT 옵코드의 동작을 제한합니다. 이전에는 어느 시점이든 컨트랙트를 완전히 삭제할 수 있었지만, 이제는 배포된 동일 트랜잭션 내에서만 삭제가 허용됩니다. Verkle 트리 및 상태리스 클라이언트를 위한 상태 안정화 조치입니다.

기존 SELFDESTRUCT의 위험성

기존 SELFDESTRUCT는 컨트랙트의 코드, 스토리지, 잔액을 모두 삭제하고 잔액을 지정 주소로 전송했습니다. 문제는 스토리지 슬롯 변경이 예측 불가능해 Merkle Patricia Trie의 일부 노드가 갑자기 사라지는 것이었습니다. 이는 이더리움 상태를 "목격(witness)"하고 검증하는 상태리스 클라이언트 설계를 심각하게 복잡하게 만들었습니다.

Verkle 트리와 상태리스 클라이언트

Ethereum의 장기 로드맵에는 Merkle Patricia Trie를 Verkle 트리로 교체하는 계획이 포함됩니다. Verkle 트리는 짧은 "witness"(상태 증명)를 가능하게 해 상태리스 클라이언트가 전체 상태 없이도 블록을 검증할 수 있게 합니다. SELFDESTRUCT가 임의 시점에 스토리지를 삭제하면 witness 크기가 예측 불가능하게 커지므로, 이를 제한하는 것이 필수적이었습니다.

새로운 동작: 같은 트랜잭션에서만 삭제

EIP-6780 이후 SELFDESTRUCT의 동작이 변경됩니다. 컨트랙트가 배포된 동일 트랜잭션 내에서 SELFDESTRUCT를 호출하면 기존처럼 코드, 스토리지, 잔액 모두 삭제됩니다. 그러나 다른 트랜잭션에서 호출하면 잔액만 지정 주소로 전송되고 코드와 스토리지는 유지됩니다. 즉, 기존 컨트랙트는 사실상 삭제 불가능해졌습니다.

Dencun 업그레이드에서의 적용

EIP-6780은 EIP-4844(블롭 트랜잭션), EIP-4788(비컨 블록 루트 접근), EIP-5656(MCOPY 옵코드), EIP-7516(BLOBBASEFEE 옵코드) 등과 함께 2024년 3월 Dencun 업그레이드에서 활성화됐습니다. 이 변경은 기존에 SELFDESTRUCT를 활용하던 일부 패턴(예: 트랜잭션당 1회 재배포 가스 최적화)에 영향을 미칩니다.

영향을 받는 패턴과 마이그레이션

SELFDESTRUCT를 활용한 주요 패턴으로는 (1) 컨트랙트 업그레이드(이제는 프록시 패턴 사용 권장), (2) 가스 환급 최적화(EIP-3529 이후 이미 환급 제한됨), (3) 임시 컨트랙트 배포-사용-삭제 패턴이 있습니다. (3)은 배포와 삭제가 같은 트랜잭션이라면 여전히 동작합니다. 개발자는 영구적 상태 삭제 의존 로직을 재설계해야 합니다.

공식 EIP 문서open_in_new