본문으로 건너뛰기
mip.watch
⌘K

MIP-2

Increase Contract Code Size Limit

확정 표준 트랙 코어 GitHub ↗
아이디어 초안 검토 중 최종 검토 확정 유지 중

Increase the maximum contract code size limit to 128 KB and initcode size limit to 256 KB

작성자
QEDK (@qedk), et al.
생성일
2026-02-26
수정일
2026. 6. 15.
포럼
포럼 스레드 없음

이해관계자 영향

이 MIP이 각 대상에게 무엇을 바꾸는지 보여줍니다. 심각도와 조치 플래그는 모델이 도출하며, MIP 유형/카테고리별로 결정론적 최소값이 적용됩니다.

핵심 요약

계약 코드 크기 제한을 24KB에서 128KB로, 초기 코드 크기 제한을 48KB에서 256KB로 증가시킵니다. 이는 복잡한 애플리케이션 개발을 지원하기 위함입니다.

무엇이 바뀌나

  • 최대 계약 코드 크기: 24,576 바이트에서 131,072 바이트로 증가합니다.
  • 최대 초기 코드 크기: 49,152 바이트에서 262,144 바이트로 증가합니다.
  • 복잡한 스마트 계약을 지원하기 위해 새로운 크기 제한이 설정됩니다.
  • 기존 계약은 새로운 크기 제한에서도 유효합니다.
  • 가스 비용은 여전히 바이트당 200 가스로 유지됩니다.

개발자

스마트 컨트랙트 및 dapp 개발자, RPC 사용자, 도구 제작자

계약 코드 크기 제한이 증가함에 따라, 기존 계약의 크기가 24,576 바이트를 초과하는 경우에도 유효성을 유지합니다. 그러나 새로운 계약을 배포할 때는 코드 크기 제한을 고려해야 하며, 기존의 배포된 계약은 재배포할 필요가 없습니다.

중간

사용자

지갑 사용자, EOA 보유자, dapp 방문자

계약 코드 크기 제한이 증가하여 더 복잡한 스마트 계약을 배포할 수 있게 되었습니다. 그러나 일반 사용자에게는 직접적인 비용이나 안전성 변화는 없습니다.

낮음

검증자

노드 운영자, RPC 운영자, 위임자

계약 코드 크기 제한이 증가하면 더 복잡한 스마트 계약을 배포할 수 있어, 개발자들이 더 많은 수익을 창출할 수 있는 기회를 제공합니다. 그러나 이 변경은 검증자 수익에 직접적인 영향을 미치지 않습니다.

중간

재단

Monad 재단 및 Category Labs 코어 개발자

계약 코드 크기 제한을 늘리는 것은 여러 이해관계자와의 조정이 필요하며, 문서화 및 커뮤니케이션 부담이 증가할 수 있습니다.

중간 조치 필요

2026. 8. 12. 오전 5:32 생성됨 · 모델: gpt-4o-mini

명세

기계 번역
인용

읽기 편의를 위한 AI 번역이며 부정확하거나 오래되었을 수 있습니다. 거버넌스·투표·분쟁 시에는 영어 원문만이 유일한 정식 본문입니다. 정확한 표현은 GitHub 원본을 참고하세요.

GitHub 영어 원문 ↗
## 초록

최대 계약 코드 크기(`MAX_CODE_SIZE`)를 24,576 바이트(24 KB)에서 131,072 바이트(128 KB)로 증가시키고, 이에 따라 최대 초기 코드 크기(`MAX_INITCODE_SIZE`)를 49,152 바이트(48 KB)에서 262,144 바이트(256 KB)로 증가시킵니다.

## 동기

[EIP-170](https://eips.ethereum.org/EIPS/eip-170)은 잠재적인 서비스 거부 벡터를 완화하기 위해 24,576 바이트의 계약 코드 크기 제한을 도입했습니다: 계약 호출은 계약의 코드 크기에 비례하여 O(n) 비용이 발생하며, 이는 가스로 직접 보상되지 않습니다. 이 제한은 Spurious Dragon 하드 포크 당시 이더리움의 제약을 고려할 때 합리적이었지만, 복잡한 애플리케이션을 구축하는 개발자들에게는 상당한 장애물이 되었습니다.

현대 스마트 계약 개발은 24 KB의 한계에 자주 부딪힙니다. 복잡한 DeFi 프로토콜, 온체인 주문서, 정교한 거버넌스 시스템 및 풍부한 오류 보고 기능을 가진 계약은 이 한계를 초과하는 경우가 많아, 개발자들은 프록시 패턴(예: [EIP-2535](https://eips.ethereum.org/EIPS/eip-2535)), `DELEGATECALL`을 사용하는 라이브러리 기반 아키텍처 또는 여러 계약에 걸쳐 애플리케이션 논리를 분할하는 등의 우회 방법을 채택해야 했습니다. 이러한 우회 방법은 배포 복잡성을 증가시키고, 계약 간 호출에 대한 추가 가스 오버헤드를 도입하며, 프록시 사용을 통해 공격 표면을 확장합니다.

모나드의 아키텍처는 원래 제한을 유도했던 자원 비용 계산을 근본적으로 변경합니다. 모나드의 맞춤형 데이터베이스(모나드DB)는 SSD에서 빠른 상태 접근을 위해 최적화되어 있으며, 모나드의 네이티브 코드 JIT 컴파일러는 반복적인 계약 호출에 걸쳐 바이트코드 전처리 비용을 분산시킵니다. 이러한 최적화는 더 큰 계약을 로드하고 실행하는 것이 지불된 가스 수수료에 비례하여 검증자에게 불균형한 부담을 주지 않도록 보장합니다. 또한, 모나드는 거래당 30M 가스의 가스 한도를 적용하여 단일 계약 상호작용의 자원 영향을 본질적으로 제한합니다.

## 명세

이 문서의 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"과 같은 주요 단어는 [RFC 2119](https://www.ietf.org/rfc/rfc2119.html) 및 [RFC 8174](https://www.ietf.org/rfc/rfc8174.html)에서 설명된 대로 해석되어야 합니다.

### 매개변수

| 상수 | 이전 값 | 새 값 |
|---|---|---|
| `MAX_CODE_SIZE` | 24,576 (0x6000) | 131,072 (0x20000) |
| `MAX_INITCODE_SIZE` | 49,152 (0xC000) | 262,144 (0x40000) |

### 계약 생성

[EIP-170](https://eips.ethereum.org/EIPS/eip-170)에서 정의된 바와 같이, 계약 생성 초기화가 `MAX_CODE_SIZE` 바이트를 초과하는 길이의 데이터를 반환하는 경우, 계약 생성은 가스 부족 오류로 실패해야 합니다. 이는 모든 계약 생성 컨텍스트에 적용됩니다: 최상위 생성 거래, `CREATE` (0xf0), 및 `CREATE2` (0xf5).

### 초기 코드 크기

초기 코드의 길이가 `MAX_INITCODE_SIZE`를 초과하는 경우, 거래 또는 명령은 [EIP-3860](https://eips.ethereum.org/EIPS/eip-3860)와 일관되게 유효하지 않은 것으로 처리해야 합니다. 생성 거래의 경우, 이는 거래가 유효하지 않음을 의미합니다. `CREATE` 및 `CREATE2` 명령의 경우, 실행은 가스 부족 오류로 실패해야 합니다.

EIP-3860에서 정의된 초기 코드 비용은 변경되지 않습니다:

```python
INITCODE_WORD_COST = 2
initcode_cost = INITCODE_WORD_COST * ceil(len(initcode) / 32)
```

### 코드 배포 비용

바이트당 200 가스의 코드 예치 비용은 이더리움 옐로우 페이퍼에서 처음 정의된 대로 변경되지 않습니다.

## 근거

### 128 KB 선택

새로운 한도인 128 KB (131,072 바이트)는 이더리움 기본값에 비해 약 5.3배 증가한 수치입니다. 이 값은 복잡한 계약을 위한 충분한 여유를 제공하면서 무제한 자원 소비를 초래하지 않도록 선택되었습니다. 바이트당 200 가스의 배포 비용으로 최대 크기 계약을 배포하려면 코드 예치금만으로 약 26.2M 가스가 필요하며, 이는 Monad의 거래당 30M 가스 한도 내에 적합하며 초기화 로직을 위한 여유를 남깁니다.

몇 가지 대안이 고려되었습니다:

- **64 KB**: [EIP-7830](https://github.com/ethereum/EIPs/blob/d434180a40093c8ece93db9d98c7963a3cfdddf9/EIPS/eip-7830.md)에서 이더리움을 위해 제안됨 (EOF 계약용)
- **64 KB 및 가스 계량**: [EIP-7907](https://github.com/ethereum/EIPs/blob/d434180a40093c8ece93db9d98c7963a3cfdddf9/EIPS/eip-7907.md)에서 이더리움을 위해 제안됨 (과도한 코드 로딩에 대한 계량 포함)

Monad의 최적화된 저장소 및 실행 계층은 보다 공격적인 한도를 허용합니다. 128 KB는 가장 복잡한 단일 계약 배포를 수용할 수 있을 만큼 충분히 크고, 가스 예산 내에 잘 유지되며 저장소나 네트워킹 가정의 변경을 요구하지 않도록 충분히 작게 설정되었습니다.

### Initcode 한도

`MAX_INITCODE_SIZE`는 `2 * MAX_CODE_SIZE` (262,144 바이트)로 설정되어 [EIP-3860](https://eips.ethereum.org/EIPS/eip-3860)에서 설정된 관계를 유지합니다. Initcode는 생성자 로직과 최종 바이트코드에 유지되지 않는 불변 변수 인코딩을 포함하기 때문에 배포된 코드보다 클 수 있습니다.

### 추가 가스 계량 없음

EIP-7907와 달리, 이 MIP는 대형 계약 코드를 로딩하기 위한 추가 가스 계량을 도입하지 않습니다 (예: 콜드 코드 접근 추가 요금). Monad의 저장소 아키텍처와 JIT 컴파일은 더 큰 코드를 로딩하는 한계 비용을 기존 가스 비용에 비해 무시할 수 있을 정도로 만듭니다. 향후 분석에서 다르게 나타날 경우, 추가 계량은 후속 MIP에서 도입될 수 있습니다.

## 이전 호환성

이 변경 사항은 이전 호환성이 있습니다. 이전 24,576 바이트 한도에서 유효한 모든 계약은 여전히 유효합니다. Monad에서 이전에 배포할 수 없었던 24,576 바이트와 131,072 바이트 사이의 계약은 이제 성공적으로 배포될 수 있습니다.

24,576 바이트를 초과하는 코드 크기로 이더리움 또는 다른 EVM 체인에 배포된 계약(비표준 수단을 통해 존재하는 경우)은 Monad에서 문제 없이 재배포될 수 있습니다.

## 보안 고려사항

계약 코드 크기 한도를 늘리면 `EXTCODECOPY`, 디스크 읽기 및 VM 전처리와 같이 코드 크기에 따라 확장되는 작업의 최대 자원 비용이 증가합니다. 그러나 Monad는 다음을 통해 이러한 비용을 완화합니다:

- **MonadDB**: 최적화된 SSD 기반 상태 저장소는 더 큰 계약을 읽는 한계 비용을 줄입니다.
- **JIT 컴파일**: 자주 사용되는 계약은 네이티브 코드로 컴파일되어 전처리 비용을 분산시킵니다.
- **거래당 가스 한도**: 30M 거래당 가스 한도는 단일 거래의 총 자원 지출을 제한합니다.

RPC 노드 운영자는 대형 계약을 포함하는 동시 `eth_call` 호출이 추가 메모리를 소모할 수 있음을 인지해야 합니다. 운영자는 메모리 부족 상태를 피하기 위해 동시성 한도를 조정할 수 있습니다.

## 참고 문헌

- [EIP-170: 계약 코드 크기 한도](https://eips.ethereum.org/EIPS/eip-170)
- [EIP-3860: Initcode 한도 및 계량](https://eips.ethereum.org/EIPS/eip-3860)
- [EIP-7830: EOF를 위한 계약 크기 한도 증가](https://github.com/ethereum/EIPs/blob/d434180a40093c8ece93db9d98c7963a3cfdddf9/EIPS/eip-7830.md)
- [EIP-7907: 계약 코드 크기 계량 및 한도 증가](https://github.com/ethereum/EIPs/blob/d434180a40093c8ece93db9d98c7963a3cfdddf9/EIPS/eip-7907.md)

## 저작권

저작권 및 관련 권리는 [CC0](../LICENSE.md)를 통해 포기되었습니다.