testnet
GitHub EN

프리컴파일 이벤트 처리

mechanism developer

Go 기반 프리컴파일에서 EVM 호환 로그를 발행하는 메커니즘

프리컴파일 이벤트 처리는 Go 실행 컨텍스트 내에서 EVM 트랜잭션 영수증(Receipt)에 구조화된 로그를 주입하는 과정을 의미합니다. emit 키워드를 사용하는 Solidity 컨트랙트와 달리, 프리컴파일은 수동으로 types.Log 객체를 생성하고, ABI 사양에 따라 인자를 패킹하여 StateDB에 삽입해야 합니다.

토픽(Topics) 대 데이터(Data)

EVM 로그에서 인자는 '토픽'(인덱싱됨)과 '데이터'(인덱싱되지 않음)로 나뉩니다. 첫 번째 토픽은 항상 이벤트 서명의 Keccak-256 해시(예: Transfer(address,address,uint256))입니다. 최대 3개의 추가 인자를 토픽으로 인덱싱하여 효율적인 블룸 필터 조회가 가능합니다. 나머지 인자는 데이터 필드에 ABI 인코딩됩니다.

StateDB 통합

EmitEvent 유틸리티는 vm.StateDB 인터페이스와 직접 상호 작용합니다. 이 함수는 AddLog를 호출하여 생성된 로그를 현재 트랜잭션의 임시 상태에 추가합니다. 트랜잭션이 나중에 리버트(revert)되면, EVM의 상태 관리에 의해 이 로그들도 자동으로 폐기되어 일관성을 보장합니다.

ABI 일관성

중요한 점은 이벤트를 발행하는 Go 코드가 개발자에게 노출된 Solidity 인터페이스와 정확히 동일한 ABI 정의를 사용해야 한다는 것입니다. Go 측의 패킹과 Solidity 측의 인터페이스 정의가 불일치하면 dApp에서 로그를 읽을 수 없거나 디코딩 오류가 발생합니다.
소스: maroo
ESC
검색어를 입력하세요