emit으로 이벤트 발행
이벤트를 선언 하는 것만으로는 아무 일도 일어나지 않습니다. 실제로 로그 를 남기려면 함수 안에서 emit 키워드로 이벤트를 발행(emit) 해야 합니다. emit 이 실행되는 순간, 그 트랜잭션의 영수증 로그 영역에 한 줄이 추가됩니다.
발행 문법
emit 이벤트이름(인자, 인자, ...); 형태입니다. 발행 인자의 순서와 타입은 이벤트 선언과 정확히 일치 해야 합니다. 하나라도 어긋나면 컴파일 오류가 납니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Bank {
event Deposit(address account, uint256 amount);
function deposit() public payable {
// emit 이벤트이름(인자, 인자, ...);
emit Deposit(msg.sender, msg.value);
}
}위 예제의 payable 은 "이 함수는 Ether 를 받을 수 있다" 는 표시이고, msg.value 는 그렇게 함께
보내진 금액(wei)입니다. 여기서는 emit 에 넘길 값을 만들기 위해 잠깐 쓴 것이니 형태만 보고
넘어가세요. 두 개념은 Chapter 12 에서 본격적으로 다룹니다.
상태를 갱신한 뒤 발행하는 관례
검증 → 상태 변수 갱신 → emit 순서를 지키는 것이 관례입니다. 이렇게 하면 로그 가 남는 시점에 이미 상태가 확정돼 있어, 외부 앱이 로그 만 보고도 정확한 결과를 신뢰할 수 있습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Counter {
uint256 public count;
event Incremented(address indexed by, uint256 newCount);
function increment() public {
count += 1; // 1) 상태 갱신
emit Incremented(msg.sender, count); // 2) 갱신된 값으로 발행
}
}emit 으로 남긴 로그 는 트랜잭션이 성공적으로 완료(commit) 될 때만 영수증에 남습니다. 함수가
revert 되면 그 트랜잭션에서 발행한 모든 이벤트도 함께 취소됩니다.