ERC-7744 코드 인덱스 (Code Index)

Last Call · 기타 · 2024-07-16 작성

배포된 스마트 컨트랙트를 주소가 아니라 코드의 지문인 바이트코드 해시로 등록하고 찾을 수 있게 하는 전역 색인 표준입니다. 누구의 허락도 없이 코드를 찾고 검증하고 재사용할 수 있습니다.

왜 필요한가

지금은 컨트랙트를 주소로 찾습니다. 그런데 주소는 배포 시점과 방법에 따라 달라지는 비결정적인 값이고 프록시(호출을 다른 컨트랙트로 넘기는 중계 컨트랙트)를 끼우면 주소는 그대로인데 실제 실행되는 코드가 바뀔 수 있습니다. 그래서 감사자가 어떤 코드가 안전하다고 보증해도 주소 기준으로는 그 보증이 계속 유효하다고 말하기 어렵고, 남의 코드를 주소로 참조해 쓰는 개발자는 프록시 뒤에서 코드가 악의적으로 바뀌는 위험을 떠안습니다. 같은 코드를 쓰려는 앱마다 매번 다시 배포하면 가스비도 낭비됩니다. 이 표준은 코드 자체의 지문인 바이트코드 해시로 컨트랙트를 등록하고 조회하는 전역 색인을 두어 주소가 아닌 코드 단위의 신뢰와 재사용을 가능하게 합니다.

구현해야 하는 것

심층 설명

mapping(bytes32 => address) 단일 저장소

구현은 바이트코드 해시에서 주소로 가는 매핑 하나(mapping(bytes32 => address) private index)가 전부입니다. register(address container)는 container.codehash를 키로 주소를 저장하고 Indexed(container, container.codehash) 이벤트를 냅니다. get(bytes32 id)는 해당 해시에 등록된 주소를 돌려주며 등록된 것이 없으면 0을 돌려줍니다. 인터페이스를 최소로 유지한 것은 조합 가능성과 구현 용이성을 높이려는 의도라고 Rationale에 적혀 있습니다.

register의 유효성 검사와 재등록 규칙

register는 먼저 isValidContainer로 대상이 유효한지 확인합니다. 조건은 세 가지로, code.length가 0보다 크고, codehash가 bytes32(0)이 아니며, EIP-7702 위임 계정이 아니어야 합니다. 이미 같은 해시로 등록된 주소(etalon)가 있으면 그 주소에 다시 isValidContainer를 돌려서 여전히 유효하면 alreadyExists(container.codehash, container)로 되돌리고, 유효하지 않으면(예: 코드가 사라진 경우) 새 주소로 덮어쓰기를 허용합니다.

EIP-7702 위임 계정 배제

isEIP7702 함수는 어셈블리의 extcodecopy로 계정 코드의 첫 3바이트를 읽어 EIP-7702의 예약된 위임 지정자 0xef0100과 비교합니다. 일치하면 위임된 EOA로 보고 register가 되돌립니다. 위임 계정은 가리키는 대상이 바뀔 수 있어 바이트코드 해시 기반 색인의 불변성 전제와 맞지 않기 때문에 등록 대상에서 제외됩니다.

재등록 금지의 이유와 셀프디스트럭트 예외

Rationale은 해시 충돌 공격 확률이 작지만 0이 아니므로, 이미 색인된 위치를 갱신하지 못하게 해 이에 대응한다고 설명합니다. 다만 등록된 컨트랙트가 셀프디스트럭트 등으로 코드가 비면 사정이 달라집니다. register 호출 시 기존 등록 주소에 isValidContainer 검사를 다시 실행하고 실패하면 새 주소로 재색인을 허용합니다.

CREATE2 결정적 배포

CodeIndex 컨트랙트는 0xC0De1D1126b6D698a0073A4e66520111cEe22F62 주소에 배포됩니다. 결정적 배포자(deterministic deployer) 0x4e59b44847b379578588920ca78fbf26c0b4956c를 통해 CREATE2로 배포하며 솔트는 0x9425035d50edcd7504fe5eeb5df841cc74fe6cccd82dca6ee75bcdf774bd88d9입니다. 이 솔트는 Code ID를 뜻하는 c0de1d로 시작하는 배니티 주소를 찾아 얻은 값이고 바이트코드는 solc 0.8.28에서 --optimize --optimize-runs 2000 --metadata-hash none --via-ir --optimize-yul 옵션으로 컴파일합니다. 어느 체인에서든 같은 주소를 기대할 수 있게 하는 방식입니다.

Motivation이 드는 활용처

원문이 드는 쓰임새는 네 가지입니다. 첫째, 감사자가 배포 파라미터나 저장소 내용과 무관하게 바이트코드 자체에 무결성 보증을 남길 수 있습니다. 둘째, 코드를 공개하지 않고도 해시로 배포 전에 화이트리스트 등록이나 사전 승인을 받을 수 있습니다. 셋째, 주소 기반 참조에서 프록시를 통해 생길 수 있는 악의적 변경을 막아 최종 사용자까지 이어지는 신뢰 체인을 만듭니다. 넷째, 이미 있는 코드를 참조해 재배포 가스를 아낄 수 있습니다. 바이트코드 서명, 화이트리스팅, 탈중앙 배포 메커니즘이 대표 사례로 언급됩니다.

표준 상태: Last Call

이 제안은 Standards Track ERC로, 현재 상태는 마지막 의견 수렴 단계인 Last Call이며 마감일은 2025-07-29로 적혀 있습니다. 최종 확정(Final) 전 단계이므로 세부 내용이 바뀔 수 있습니다. Rationale은 라이브러리가 아닌 ERC로 표준화한 이유로, 단일한 공식 기준점을 만들어 코드 재사용과 폭넓은 채택을 이끌기 위해서라고 설명합니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs