testnet
GitHub EN

커스텀 프리컴파일에서 이벤트 구현하기

intermediate advanced 45 min

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 로그를 발행합니다.
소스: maroo
ESC
검색어를 입력하세요