프리컴파일 유틸리티
Go 로직과 EVM 상태 및 ABI 표준을 연결하는 헬퍼 함수
프리컴파일 유틸리티 패키지는 마루(Maroo)에서 상태 저장 프리컴파일을 구축하는 개발자를 위한 필수 추상화 계층을 제공합니다. 이 패키지는 Solidity로 인코딩된 인자를 Go 구조체로 디코딩하는 복잡한 작업을 단순화하고, Go 코드 내에서 EVM 호환 이벤트를 발행하는 저수준 메커니즘을 처리합니다. 이러한 유틸리티는 커스텀 프리컴파일이 외부 인덱서나 dApp에게 표준 스마트 컨트랙트와 동일하게 작동하도록 보장합니다.
주요 기능
원활한 이벤트 발행
로그를 EVM StateDB에 직접 주입하며, 인덱싱된 토픽과 데이터 패킹을 지원합니다.
ABI-구조체 매핑
JSON 중간 표현을 통해 일반 EVM 입력 인자를 강력한 타입의 Go 구조체로 변환합니다.
아키텍처
graph TD
A[EVM Call] -->|Args| B(Precompile Run)
B -->|Unpack| C{ParseStructFromAbi}
C -->|JSON Marshal/Unmarshal| D[Go Struct]
D --> E[Business Logic]
E -->|Result| F{EmitEvent}
F -->|Pack Topics/Data| G[StateDB Log]
G --> H[Tx Receipt] EVM 실행에서 Go 로직으로, 다시 EVM 로그로 이어지는 데이터 흐름
간극 해소
프리컴파일을 개발할 때 주요 과제 중 하나는 이더리움 가상 머신(EVM)의 엄격한 ABI 인코딩을 사용 가능한 Go 데이터 구조로 변환하는 것입니다.
utils 패키지는 JSON을 범용 교환 포맷으로 활용하여 이 문제를 해결하며, 개발자가 수동으로 바이트 슬라이싱을 하는 대신 표준 Go 구조체 태그를 사용하여 입력 기대치를 정의할 수 있게 합니다. 참고: 중간 매핑에 JSON을 사용하면 약간의 오버헤드가 발생하지만, 코드 가독성과 유지보수성이 크게 향상됩니다.
이벤트를 통한 관측 가능성
프리컴파일이 dApp 생태계에서 유용하게 사용되려면 오프체인 인덱서(The Graph 등)가 읽을 수 있는 이벤트를 발행해야 합니다.
EmitEvent 함수는 topics(인덱싱된 파라미터)와 data(인덱싱되지 않은 파라미터)의 복잡성을 추상화합니다. 제공된 ABI에 대해 인자를 자동으로 검증하여, 발행된 로그가 항상 엄격하게 타입이 지정되고 표준 이더리움 도구로 파싱 가능하도록 보장합니다.