EIP-6780 같은 트랜잭션에서만 작동하는 SELFDESTRUCT (SELFDESTRUCT only in same transaction)

최종 확정 · EVM·실행 · 원문 상태 Final · 2023-03-25 작성

계약을 없애는 SELFDESTRUCT 명령어의 기능을 줄입니다. 계약이 만들어진 바로 그 트랜잭션 안에서 호출될 때만 기존처럼 코드와 저장소를 지우고 그 외에는 잔액만 수신자에게 보냅니다.

왜 필요한가

SELFDESTRUCT는 계약의 코드와 저장소를 전부 지우는 명령어여서 계정 상태를 크게 바꿔야 합니다. 그런데 이더리움이 앞으로 도입하려는 버클 트리(Verkle tree) 구조에서는 한 계정의 데이터가 서로 연결이 분명하지 않은 여러 키에 나뉘어 저장되기 때문에, 이런 대규모 삭제가 불가능해집니다. 그래서 이 EIP는 SELFDESTRUCT의 기능을 줄이되 흔히 쓰이는 용도는 살리는 방향을 택했습니다. 잔액을 회수하는 용도로만 쓰는 앱과, 계약을 만든 바로 그 트랜잭션 안에서 SELFDESTRUCT를 호출하는 앱은 수정 없이 계속 작동합니다. 반면 계약 버전 관리에서 생길 EVM 구현의 복잡성은 피했습니다.

무엇이 바뀌나

지금

EIP-6780 이후

누구에게 영향이 있나

심층 설명

생성과 다른 트랜잭션에서의 동작

계약이 만들어진 트랜잭션과 다른 트랜잭션에서 SELFDESTRUCT가 실행되면, 현재 실행 프레임이 멈추고 계정 잔액 전액이 타깃으로 이동합니다. 저장소 키, 코드, 계정 자체를 포함해 어떤 데이터도 삭제하지 않습니다. 타깃이 SELFDESTRUCT를 호출한 계약 자신이면 잔액의 순변화가 없고 이전 명세와 달리 이더가 소각되지 않습니다. EIP-3529 이후 가스 환급은 없으며 SELFDESTRUCT에 대한 EIP-2929의 접근 비용 규칙은 그대로 유지됩니다.

같은 트랜잭션에서 생성된 경우의 동작

계약이 만들어진 것과 같은 트랜잭션에서 SELFDESTRUCT가 실행되면 이 EIP 이전과 똑같이 동작합니다. 현재 실행 프레임이 멈추고 이전에 명세된 대로 데이터를 삭제하며 계정 잔액 전액을 타깃에 보내고 호출한 계약의 잔액은 0으로 설정됩니다. 이 경우 타깃이 호출 계약 자신이면 이더가 예전처럼 소각됩니다. 가스 환급이 없는 점과 EIP-2929 규칙이 유지되는 점은 첫 번째 경우와 같습니다.

'생성'의 기준

계약은 생성 트랜잭션이 시작될 때, 또는 CREATE 계열 연산(CREATE, CREATE2, 그리고 앞으로 계약을 배포하는 다른 연산)이 실행을 시작할 때 생성된 것으로 봅니다. 계약의 새 주소에 이미 잔액이 있어도 여전히 계약 생성으로 간주합니다. 이 구분은 반사실적 계정(counterfactual account) 같은 용례 때문에 필요합니다. 계약 생성 시점의 삭제를 허용하면, 체인에 잔액 외의 상태를 가진 적이 없는 계정의 찌꺼기가 남지 않습니다. 이런 계정은 저장소가 전혀 없으므로 삭제 시 트라이 갱신이 계정 노드 하나에 그치고 이는 일반 이더 전송과 같은 수준의 부담입니다.

버클 트리와의 관계

SELFDESTRUCT는 모든 코드와 저장소를 제거하는 등 계정 상태에 큰 변경을 요구합니다. 버클 트리에서는 각 계정이 루트 계정과 명확히 연결되지 않는 여러 계정 키에 나뉘어 저장되기 때문에, 앞으로 이런 삭제가 불가능해집니다. 과거에도 SELFDESTRUCT 제거가 검토됐고 현재 이 명령어를 쓸 강한 이유가 없습니다. 이 EIP는 흔한 용례는 살리면서 계약 버전 관리(contract versioning)에서 생길 EVM 구현 변경의 복잡성을 줄이는 동작을 구현합니다.

깨지는 사용 패턴

두 가지 패턴이 이제 안전하지 않습니다. 첫째, SELFDESTRUCT 뒤 CREATE2로 같은 자리에 계약을 다시 배포해 업그레이드 가능하게 만드는 방식입니다. 생성된 계약이 같은 트랜잭션 안에서 SELFDESTRUCT를 호출하지 않으면 더 이상 작동하지 않으며 대신 ERC-2535나 다른 종류의 프록시 계약을 써야 합니다. 둘째, 같은 트랜잭션에서 생성되지 않은 계약이 자신을 수신자로 SELFDESTRUCT를 호출해 이더를 소각하는 방식입니다. 트랜잭션 이전부터 존재한 계약이면 이더가 소각되지 않고 트랜잭션 안에서 새로 생성된 계약이면 예전처럼 소각됩니다.

상태와 적용 방식

이 EIP는 합의 규칙을 수정하므로 하드포크가 필요합니다. 원문 상태는 Final입니다. SELFDESTRUCT 명령어는 EIP-6049에 명시된 대로 계속 사용 중단(deprecated) 상태이며 새 동작을 감안하더라도 새로 배포하는 계약에서는 사용이 강하게 권장되지 않습니다. 앞으로의 EVM 변경이 이 명령어의 기능을 더 줄일 수 있습니다. 테스트 케이스는 Execution Spec Tests 저장소의 cancun/eip6780_selfdestruct 경로에 있습니다.

EIP 원문 · ← EIPs