EIP-7666 identity 프리컴파일의 EVM 전환 (EVM-ify the identity precompile)

Hegota 포함 제외 (DFI) · EVM·실행 · 원문 상태 Draft · 2024-03-31 작성

주소 0x04의 identity 프리컴파일(입력을 그대로 돌려주는 내장 기능)을 없애고 같은 일을 하는 7바이트 EVM 코드를 그 자리에 넣습니다. 기능은 그대로 두고 클라이언트가 따로 구현해야 할 프리컴파일을 하나 줄입니다.

왜 필요한가

이더리움에는 프리컴파일(precompile)이 여럿 있습니다. 클라이언트 소프트웨어가 EVM 바깥에서 직접 구현해 둔 특수 기능입니다. 원문에 따르면 이 가운데 거의 절반은 쓰임이 많지 않은데도 계속 유지 보수 비용을 만들고 합의 버그가 생길 위험을 키우고 ZK-EVM이나 형식 검증에 맞는 언어로 새 클라이언트를 만들 때 개발 부담을 늘립니다. identity 프리컴파일은 받은 입력(calldata)을 그대로 돌려주는 가장 단순한 프리컴파일입니다. 처음 도입된 이유는 메모리 복사가 흔한 작업인데 이를 바로 해 주는 명령어가 없었기 때문입니다. 그 뒤 EIP-5656으로 MCOPY 명령어가 들어왔고 어떤 기능을 명령어로 받아들일지에 대한 기준도 달라졌습니다. 이제 이 프리컴파일은 아주 짧은 EVM 코드로 대신할 수 있습니다. 그래서 이 제안은 쓰임이 적은 프리컴파일을 정리하는 절차를 가장 단순한 사례부터 시작합니다.

무엇이 바뀌나

지금

EIP-7666 이후

누구에게 영향이 있나

심층 설명

변경 대상과 상수

이 제안이 바꾸는 것은 두 상수로 정리됩니다. IDENTITY_PRECOMPILE_ADDRESS는 0x0000....0004이고 EVM_CODE는 0x365f5f37365ff3입니다. 포크가 활성화되는 블록의 실행이 시작되는 시점에 IDENTITY_PRECOMPILE_ADDRESS의 코드를 EVM_CODE로 설정합니다. 그 블록부터는(그 블록을 포함해) 이 주소를 더 이상 프리컴파일로 취급하지 않습니다. 즉 클라이언트는 0x04로 들어오는 호출을 자체 구현한 네이티브 함수로 처리하는 대신, 그 주소에 들어 있는 바이트코드를 다른 계약과 똑같이 EVM에서 실행합니다.

EVM_CODE가 하는 일

EVM_CODE 0x365f5f37365ff3은 7바이트이며 다음 명령어 열에 해당합니다. CALLDATASIZE PUSH0 PUSH0 CALLDATACOPY CALLDATASIZE PUSH0 RETURN. 앞의 네 명령은 호출 데이터 전체를 메모리 0번 위치부터 복사합니다. CALLDATASIZE가 길이를, PUSH0 두 번이 복사 원본 위치와 메모리 목적지 위치 0을 스택에 올리고 CALLDATACOPY가 복사를 수행합니다. 뒤의 세 명령은 같은 메모리 구간을 반환합니다. CALLDATASIZE와 PUSH0으로 길이와 시작 위치 0을 올린 뒤 RETURN이 그 구간을 돌려줍니다. 그래서 입력과 똑같은 returndata가 나오고 identity 프리컴파일과 기능이 같습니다. 원문은 이를 기능을 보존하면서 프리컴파일 수를 1 줄이는, 교란이 가장 적은 변경이라고 설명합니다. PUSH0은 EIP-3855에서 도입된 명령어라서 원문은 EIP-3855를 선행 요구 사항(requires)으로 적었습니다.

왜 identity 프리컴파일부터인가

원문은 이더리움에 프리컴파일이 많고 그중 거의 절반은 뚜렷한 쓰임이 없다고 지적합니다. 쓰이지 않는 프리컴파일도 유지 보수 비용을 계속 만들고 합의 버그가 생길 위험을 키우며 ZK-EVM이나 형식 검증에 적합한 언어로 새 클라이언트를 구현할 때 개발 부담을 늘립니다. 그래서 이 제안은 쓰임이 적은 프리컴파일을 단계적으로 내려놓는 절차를 제시하고 첫 적용 대상으로 가장 단순한 identity 프리컴파일을 골랐습니다. identity 프리컴파일은 메모리 복사가 흔한 작업인데 이를 바로 해 주는 명령어가 없던 시절에 도입되었습니다. 그 뒤 어떤 기능을 명령어로 받아들일지에 대한 기준이 바뀌었고 EIP-5656으로 MCOPY 명령어가 들어왔습니다. 원문은 앞으로 같은 기법을 거의 쓰이지 않는 해시 함수나 MODEXP 같은 더 복잡한 프리컴파일에도 적용할 수 있다고 적습니다.

호환성, 가스, 보안

EVM_CODE의 기능은 identity 프리컴파일과 같습니다. 다만 프리컴파일 호출이 아니라 일반 EVM 코드 실행으로 바뀌므로 가스 비용은 조금 달라집니다. 원문은 가스 재조정이 이더리움에서 이미 여러 번 있었고 그 영향이 잘 이해되어 있다고 설명합니다. 구체적인 가스 차이 수치는 원문에 없습니다. 보안 측면에서는 새 기능이 추가되거나 기존 기능이 더 싸지는 것이 없으므로, 원문은 보안 우려가 없다고 밝힙니다.

상태와 포크 논의

이 제안은 Draft 상태이므로 명세가 아직 바뀔 수 있습니다. 코어 개발자 콜에서는 두 번 다뤄졌습니다. 07.30 ACDE #242에서 Hegota 포크의 PFI(포함 후보 제안) 단계로, identity 프리컴파일을 EVM화하는 EIP-7666을 EIP-8200의 동반 제안으로 함께 후보 접수했습니다. 10.08 ACDE #247에서는 EIP-7666을 Hegota 후보에서 제외(DFI)했습니다. 가스 책정에 엣지 케이스가 있고 얻는 가치가 작다는 이유였습니다.

EIP 원문 · ← EIPs