4. 오류 처리, 이벤트 및 보안 기초
스마트 계약은 일단 배포되면 수정할 수 없으므로, 강력한 오류 처리와 초기부터 고려된 보안이 필수적입니다.
4.1. 오류 처리 (require, revert, assert)
- require(condition, "message"): 사용자 입력이나 상태 변수의 유효성을 검사합니다. 가장 흔하게 사용됩니다. 조건이 충족되지 않으면 트랜잭션을 되돌리고 남은 가스를 사용자에게 환불합니다.
- revert("message"):
require와 유사하게 트랜잭션을 되돌릴 수 있지만, 더 복잡한 조건에서 명시적으로 사용됩니다. - assert(condition): 내부 오류나 버그를 확인하는 데 사용됩니다. (일반적으로는
require를 사용하여 사용자나 외부 조건 오류를 처리하는 것이 권장됨)
4.2. 이벤트 (Events)
이벤트는 블록체인에 로그 형태로 데이터를 기록하며, DApp의 프론트엔드가 계약 상태 변경을 수신할 수 있도록 합니다. 이는 가스 효율적인 방법입니다.
event ValueChanged(address indexed user, uint256 newValue);
function updateValue(uint256 x) public {
// ... 로직 ...
emit ValueChanged(msg.sender, x);
}
4.3. 기초 보안 패턴: Reentrancy 방지
외부 호출과 관련된 가장 위험한 취약점 중 하나는 재진입 공격(Reentrancy Attack)입니다. 이를 방지하기 위해 'Checks-Effects-Interactions' 패턴을 사용해야 합니다.
- Checks: 모든
require문 실행. - Effects: 상태 변수 업데이트 (가장 중요).
- Interactions: 외부 호출 (가장 마지막에).