EIP-7823 MODEXP 입력 상한 설정 (Set upper bounds for MODEXP)

최종 확정 · EVM·실행 · 원문 상태 Final · 2024-11-11 작성

MODEXP 프리컴파일의 밑, 지수, 모듈러스 입력 길이를 각각 최대 8192비트(1024바이트)로 제한합니다. 한도를 넘는 호출은 오류로 처리되고 가스를 모두 소모합니다.

왜 필요한가

MODEXP(모듈러 거듭제곱) 프리컴파일은 지금까지 입력 길이에 제한이 없었습니다. 그래서 현실에서는 쓰이지 않을 만큼 긴 입력을 일부러 만들어 넣는 사례가 가능했고 실제로 이런 입력이 여러 차례 합의 버그(클라이언트마다 계산 결과가 달라지는 버그)의 원인이 됐습니다. 입력이 무한하면 테스트해야 할 경우의 수도 무한해서 버그를 전부 걸러내기 어렵습니다. 가스 가격 계산식도 무제한 입력을 전제로 하다 보니 복잡합니다. 입력에 상한을 두면 테스트 범위가 유한해져 버그 가능성이 줄고 나중에 EVMMAX 같은 기능을 써서 이 프리컴파일을 일반 EVM 코드로 대체하기도 쉬워집니다. 실제 사용 기록을 분석한 결과 과거의 어떤 성공한 호출도 새 한도를 넘지 않아, 기존 사용 사례는 그대로 보호됩니다.

무엇이 바뀌나

지금

EIP-7823 이후

누구에게 영향이 있나

심층 설명

명세: 각 길이 입력에 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로 확정됐습니다.

EIP 원문 · ← EIPs