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에서 실시간 반응 구현 가능 |