명세
읽기 편의를 위한 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)를 통해 포기되었습니다.