EIP-7997 결정론적 팩토리 컨트랙트 (Deterministic Factory Contract)

콜 결정 없음 · EVM·실행 · 원문 상태 Last Call · 2025-08-03 작성

널리 쓰이는 CREATE2 팩토리가 주소 0x4e59b44847b379578588920cA78FbF26c0B4956C에 반드시 존재하도록 공식 요구사항으로 만듭니다. 그 결과 어느 EVM 체인에서든 같은 주소로 컨트랙트를 배포할 수 있습니다.

왜 필요한가

지금은 EVM 체인이 아주 많고 개발자 대부분은 모든 체인에서 같은 주소에 컨트랙트를 배포하고 싶어 합니다. 주소가 체인마다 다르면 앱과 지갑이 체인별 주소 목록을 따로 관리해야 하고 스마트 컨트랙트 계정이 체인마다 다른 주소로 배포되는 탓에 실제로 자금 손실 사고도 있었습니다. CREATE2 명령은 주소가 미리 정해지는 배포를 지원하지만 생성 주소가 명령을 실행한 컨트랙트의 주소에서 계산되기 때문에 모든 체인에 같은 주소로 존재하는 팩토리(factory)가 먼저 필요합니다. 지금까지는 누구나 그대로 전송할 수 있는 키리스 트랜잭션(keyless transaction)으로 이 팩토리를 배포해 왔지만 이 트랜잭션은 가스 가격과 한도가 고정되어 있어 가스 규칙이 다른 체인에서는 배포가 불가능한 경우가 많았습니다. 가스 스케줄 변경으로 이더리움 본체와 데브넷에서도 같은 문제가 생기기 시작했기 때문에, 이미 널리 쓰이는 팩토리의 존재 자체를 규칙으로 보장하려는 것입니다.

무엇이 바뀌나

지금

EIP-7997 이후

누구에게 영향이 있나

심층 설명

요구사항: 고정 주소와 런타임 코드

FACTORY_ADDRESS는 0x4e59b44847b379578588920cA78FbF26c0B4956C로 정의됩니다. 체인의 상태는 이 주소에 0이 아닌 nonce와 원문에 명시된 런타임 코드(0x7fff...600cf3)를 가진 계정을 반드시(MUST) 포함해야 합니다. 어떤 방법으로 충족하든 결과 계정의 런타임 코드는 명시된 바이트코드와 정확히 같아야 합니다. 원문에는 이 바이트코드의 디스어셈블 결과도 함께 실려 있습니다.

충족 방법과 비정상 상태 전이 배제

요구사항은 두 가지 방법으로 충족할 수 있습니다. 가스 파라미터가 허용하는 체인에서는 일반 트랜잭션(키리스 생성 트랜잭션 포함)으로 배포하고 그렇지 않으면 제네시스 상태에 nonce 1로 계정을 포함합니다. 이미 가동 중인 체인의 가스 파라미터가 키리스 배포를 더는 허용하지 않는다면, 기대 주소에 컨트랙트를 넣을 유일한 방법은 조율된 비정상 상태 전이(coordinated irregular state transition)인데, 이는 이 EIP의 범위 밖입니다. 또한 클라이언트 소프트웨어는 포크 경계에서 이 컨트랙트의 존재를 확인하면 안 됩니다(MUST NOT).

팩토리 컨트랙트의 동작

이 컨트랙트는 호출 입력의 첫 32바이트를 salt로, 나머지 데이터를 init code로, 호출에 실린 값을 value로 삼아 CREATE2 명령(EIP-1014)을 실행합니다. 입력이 32바이트보다 작으면 2^256바이트에 가까운 calldata를 복사하려 시도하므로 결과적으로 revert됩니다. 컨트랙트 생성이 실패하면(CREATE2가 0을 출력하면) 빈 반환 데이터로 revert하고 성공하면 주소를 패딩 없이 정확히 20바이트로 반환합니다.

왜 이 팩토리인가

이 팩토리는 이더리움 메인넷에서 25000회 가까이 사용됐고 키리스 트랜잭션으로 수백 개 체인에 배포됐으며 여러 L2에 기본 포함되어 있고 개발 도구의 결정적 배포 기본값으로 쓰입니다. 바이트코드는 Constantinople에서 활성화된 EIP-1014만 있으면 동작하고 더 최근의 PUSH0(EIP-3855)에는 의존하지 않습니다. 알려진 단점 두 가지도 검토됐습니다. 첫째, 생성된 주소가 패딩 없이 반환되어 다른 주소 반환 호출과 다르게 디코딩해야 할 수 있습니다. 둘째, revert 시 반환 데이터가 전달되지 않아 진단 메시지를 얻으려면 EVM 트레이스가 필요할 수 있습니다. 두 문제 모두 우회 방법이 있어 결정적 결함은 아니라고 판단됐으며 이 팩토리로 개선된 팩토리를 다시 배포하는 방법도 가능합니다.

호환성과 보안 고려사항

하위 호환성 문제는 없습니다. 이미 FACTORY_ADDRESS에 팩토리가 있는 체인(이더리움 메인넷과 대부분의 체인)에서는 이 요구사항 충족이 아무 변화도 일으키지 않으며 이 주소에 다른 컨트랙트가 있을 것으로 기대되지 않습니다. 보안 측면에서는, 실행 환경(ORIGIN, NUMBER 등)을 읽는 컨트랙트의 배포는 선행매매(frontrunning)로 가로채져 공격자가 고른 파라미터로 생성될 수 있습니다. 그래서 이 팩토리로는 완전히 결정적인 컨트랙트만 배포하는 것이 권장됩니다.

진행 상태와 코어 개발자 콜 결정

이 EIP의 상태는 Last Call이며 마감일(last-call-deadline)은 2026-11-01입니다. 코어 개발자 콜에서는 07.20 ACDT #88에서 EIP-7997의 EELS 비정상 상태 전이 PR을 닫기로 확정했습니다. 팩토리 존재 여부 확인은 불필요하고 원치 않는 위트니스 항목만 늘리기 때문입니다. 이어 07.27 ACDT #89에서는 관련 PR 두 건을 모두 닫기로 확정했습니다. 사양 문구가 이미 맞고 클라이언트는 포크 경계에서 컨트랙트 존재를 확인하면 안 된다는 뜻입니다.

EIP 원문 · ← EIPs