커스텀 프리컴파일에서 이벤트 구현하기
utils 패키지를 사용하여 EVM 표준 이벤트를 발행함으로써 마루(Maroo) 프리컴파일을 관측 가능하게 만드는 방법을 배웁니다.
학습 목표
- ✓프리컴파일을 위한 Solidity 인터페이스에서 이벤트를 정의하는 방법
- ✓Go에서 ABI 정의를 로드하는 방법
- ✓`EmitEvent`를 사용하여 로그를 생성하는 방법
사전 요구사항
- Go와 EVM에 대한 기본 이해
- 기존 프리컴파일 스켈레톤
필요 도구
Go 1.20+Maroo Source Code
이벤트는 온체인 로직과 오프체인 인덱싱 사이의 가교 역할을 합니다. 이 튜토리얼에서는 가상의 설정 프리컴파일에
ConfigChanged 이벤트를 추가해 보겠습니다. 1
1. Solidity 인터페이스 정의
먼저 Solidity 인터페이스에 이벤트를 정의합니다. 이것이 ABI의 기준(source of truth)이 됩니다.
IConfig.sol solidity
interface IConfig {
event ConfigChanged(address indexed admin, string key, uint256 value);
function setConfig(string memory key, uint256 value) external;
} 2
2. Go에서 ABI 로드
프리컴파일 패키지에서 이 ABI를 파싱해야 합니다. 보통
init() 함수나 전역 변수에서 수행됩니다. precompile.go go
var ConfigABI abi.ABI
func init() {
var err error
ConfigABI, err = abi.JSON(strings.NewReader(IConfigABIJSON))
if err != nil {
panic(err)
}
} 3
3. 이벤트 발행
Run 메서드 내부에서 상태 변경을 성공적으로 마친 후 EmitEvent를 호출합니다. precompile.go go
// ... Run 함수 내부 ...
// 1. 로직 수행
// 2. 이벤트 발행
err := utils.EmitEvent(
contract.Address(),
evm.StateDB,
ConfigABI,
"ConfigChanged",
callerAddress, // 인덱싱된 인자 1
key, // 인덱싱되지 않은 인자 2
value, // 인덱싱되지 않은 인자 3
)
if err != nil {
return nil, err
} 팁: `EmitEvent`의 인자 순서가 Solidity 정의와 정확히 일치하는지 확인하세요.
마무리
이제 프리컴파일이 블록 탐색기와 인덱서가 수집할 수 있는 표준 EVM 로그를 발행합니다.