EIP-7823 MODEXP 입력 상한 설정 (Set upper bounds for MODEXP)
최종 확정 · EVM·실행 · 원문 상태 Final · 2024-11-11 작성
MODEXP 프리컴파일의 밑, 지수, 모듈러스 입력 길이를 각각 최대 8192비트(1024바이트)로 제한합니다. 한도를 넘는 호출은 오류로 처리되고 가스를 모두 소모합니다.
왜 필요한가
MODEXP(모듈러 거듭제곱) 프리컴파일은 지금까지 입력 길이에 제한이 없었습니다. 그래서 현실에서는 쓰이지 않을 만큼 긴 입력을 일부러 만들어 넣는 사례가 가능했고 실제로 이런 입력이 여러 차례 합의 버그(클라이언트마다 계산 결과가 달라지는 버그)의 원인이 됐습니다. 입력이 무한하면 테스트해야 할 경우의 수도 무한해서 버그를 전부 걸러내기 어렵습니다. 가스 가격 계산식도 무제한 입력을 전제로 하다 보니 복잡합니다. 입력에 상한을 두면 테스트 범위가 유한해져 버그 가능성이 줄고 나중에 EVMMAX 같은 기능을 써서 이 프리컴파일을 일반 EVM 코드로 대체하기도 쉬워집니다. 실제 사용 기록을 분석한 결과 과거의 어떤 성공한 호출도 새 한도를 넘지 않아, 기존 사용 사례는 그대로 보호됩니다.
무엇이 바뀌나
지금
- MODEXP 입력 길이에 제한이 없어 어떤 크기의 값이든 넣을 수 있습니다
- 테스트해야 할 입력 공간이 사실상 무한해 합의 버그가 반복됐습니다
- 무제한 입력을 전제로 한 복잡한 가스 계산식을 유지해야 합니다
EIP-7823 이후
- 밑, 지수, 모듈러스의 길이가 각각 8192비트(1024바이트) 이하로 제한됩니다
- 한도를 넘는 호출은 오류를 반환하고 가스를 모두 소모합니다
- 테스트 범위가 유한해지고 EVMMAX 등으로 프리컴파일을 대체할 길이 열립니다
누구에게 영향이 있나
- 사용자·기존 컨트랙트: 과거의 모든 성공한 호출이 새 한도 안에 들어가므로(최대 513바이트) 기존 사용에는 영향이 없습니다.
- 컨트랙트 개발자: RSA 8192비트 키 검증까지는 그대로 가능하지만 그보다 큰 입력을 쓰는 새 설계는 불가능해집니다.
- 클라이언트 팀: 검증해야 할 입력 범위가 유한해져 구현과 테스트 부담이 줄어듭니다.
심층 설명
명세: 각 길이 입력에 8192비트 상한
EIP-198이 정의한 MODEXP 입력 형식 <length_of_BASE> <length_of_EXPONENT> <length_of_MODULUS> <BASE> <EXPONENT> <MODULUS>에서, 세 길이 입력(length_of_BASE, length_of_EXPONENT, length_of_MODULUS)은 각각 8192비트(1024바이트) 이하여야 합니다(MUST). 어느 하나라도 한도를 넘으면 프리컴파일 실행이 중단되고 오류를 반환하며 가스를 전부 소모합니다.
왜 8192비트인가
이 상한은 기존 사용 사례를 모두 수용합니다. 첫째, 최대 8192비트 키까지의 RSA 검증이 가능합니다. 흔히 쓰이는 키는 1024/2048/4096비트입니다. 둘째, 타원곡선 관련 사용 사례는 보통 384비트 미만이라 여유가 큽니다.
EVMMAX로의 대체 가능성
입력이 유한해지면 EVMMAX 같은 명령어 집합으로 프리컴파일을 EVM 코드로 다시 구현하기 쉬워집니다. 자주 쓰이는 경우(256, 381, 1024, 2048)는 전용 고속 경로로 구현하고 나머지는 느린 범용 경로로 처리하는 구성이 가능합니다. 자주 쓰이는 특정 모듈러스에 전용 경로를 두거나, 길이를 특정 입력들로만 더 제한하는 방안도 원문에서 언급합니다.
온체인 사용 분석
MODEXP가 도입된 비잔티움 하드포크 이후, 블록 5472266(2018년 4월 20일)부터 블록 21550926(2025년 1월 4일)까지의 호출을 분석했습니다. 밑과 모듈러스는 32바이트가 각각 약 244만 건으로 압도적이고 128, 256, 160바이트가 뒤를 잇습니다. 지수는 32바이트가 약 244만 건, 3바이트가 4771건입니다. 성공한 호출 중 입력 길이가 513바이트를 넘은 사례는 없습니다. 그 밖에 빈 입력, 0x9e5faafc 또는 0x85474728만으로 된 입력, 길지만 유효하지 않은 입력 등 잘못된 호출이 소수 있었습니다.
하위 호환성과 보안
형식적으로는 하위 호환성이 깨지는 변경입니다. 다만 블록 21550926까지의 분석 기준으로 과거의 어떤 트랜잭션도 이 변경 후 다르게 동작하지 않습니다. 허용되는 입력 범위를 줄이기만 하므로 새로운 보안 공격면은 생기지 않을 것으로 봅니다. 이 EIP의 상태는 Final로 확정됐습니다.