Blockchain

[Solidity] 9. 이벤트(Event)와 로깅

clolee 2025. 4. 18. 19:31

✅ 9. 이벤트(Event)와 로깅

외부 DApp, 프론트엔드, 로그 기록과의 연결을 가능하게 해줌.
사용자 행동 추적, UI 실시간 반영, off-chain 자동화 트리거 등에 핵심 역할을 수행.


📌 1. 이벤트(Event)란?

스마트컨트랙트 내부에서 특정 상태 변화가 발생했을 때 로그를 기록하는 메커니즘
외부 애플리케이션(DApp, 프론트엔드)이 이 로그를 구독하고 반응할 수 있도록 함


✅ 기본 구조

event EventName(type indexed param1, type param2);

emit EventName(value1, value2);

📌 2. 이벤트 선언 및 발생

✅ 예시: 예치금 이벤트

event Deposited(address indexed from, uint amount);

function deposit() public payable {
    emit Deposited(msg.sender, msg.value);
}
  • emit 키워드를 통해 이벤트를 발생시킴
  • EVM에서 로그(Receipt log)로 저장됨 → 블록체인 상태에는 저장되지 않음 (→ 가스 절약)

📌 3. indexed 키워드

✅ 용도

indexed를 붙인 파라미터는 이벤트 필터링이 가능해짐

  • 최대 3개까지 indexed 지정 가능
  • Web3, Ethers.js, The Graph에서 빠르게 특정 값으로 필터링

✅ 예시

event Transfer(address indexed from, address indexed to, uint amount);

→ Ethers.js:

contract.on("Transfer", (from, to, amount) => { ... });

→ 필터:

contract.filters.Transfer(userAddress, null);

📌 4. 이벤트 vs 상태 변수 차이

항목 상태 변수 이벤트
블록체인 저장 ✅ 영구 저장 ❌ 로그(Receipt)로만 저장
가스 비용 높음 (SSTORE) 저렴 (LOGx)
조회 방식 view 함수 로그 필터, 구독
DApp 연동 보조 용도 🔥 핵심 통신 수단

📌 5. 실무에서 많이 쓰이는 이벤트 예시

이벤트 이름 설명
Transfer 토큰 이동 발생 시
Approval 토큰 위임 허용 시
OwnershipTransferred 소유권 변경
Paused, Unpaused 컨트랙트 상태 제어

📌 6. 실전 예제

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Voting {
    event Voted(address indexed voter, uint indexed proposalId);
    event AdminChanged(address oldAdmin, address newAdmin);

    address public admin;

    constructor() {
        admin = msg.sender;
    }

    function vote(uint proposalId) public {
        emit Voted(msg.sender, proposalId);
    }

    function changeAdmin(address newAdmin) public {
        require(msg.sender == admin);
        emit AdminChanged(admin, newAdmin);
        admin = newAdmin;
    }
}

📌 7. DApp 프론트엔드에서 이벤트 처리

Ethers.js 예시

contract.on("Voted", (voter, proposalId) => {
  console.log("New vote:", voter, proposalId);
});

Web3.js 예시

contract.events.Voted({ filter: { proposalId: 1 } })
  .on("data", console.log);

🧠 실무 팁 정리

항목
indexed는 검색 속도 향상 address indexed는 거의 기본
이벤트는 로그일 뿐 상태는 아님 view 함수처럼 상태를 추적하진 않음
가스 효율 매우 좋음 저장 대신 LOG로 처리됨
최대한 이벤트 기록 남기기 디버깅 + 프론트 연동에 도움
TheGraph와 연계하면 강력한 분석 가능 이벤트 기반 인덱싱 서브그래프 활용 가능

✅ [9단계 요약]

키워드 설명
event 상태 변화 로그 기록 구조
emit 이벤트 발생
indexed 필터링 가능한 파라미터
이벤트 vs 상태변수 로그 vs 영구 상태
Web3/Ethers 연동 DApp에서 실시간 반응 구현 가능

댓글수0