실습: 컨트랙트 리팩터링
기능이 모두 모였으니 이제 다듬을 차례입니다. 지금은 누구나 후보자를 등록할 수 있는데, 이는 곧 아무나 가짜 후보를 무한히 추가해 선거를 망칠 수 있다는 뜻입니다. 보통 선거에서는 소유자(owner), 즉 선거 관리자만 후보를 등록하도록 제한합니다.
소유자 패턴 (Ownable)
해법은 블록체인에서 가장 널리 쓰이는 소유자 패턴 입니다. 컨트랙트를 배포한 주소를 owner 로
기록해 두고, 중요한 함수는 그 주소만 호출할 수 있게 막습니다. 배포자를 기록하는 자리는 생성자입니다.
constructor 는 배포 시 단 한 번 실행되며, 그때의 msg.sender 가 곧 배포자입니다.
address public owner;
constructor() {
owner = msg.sender;
}접근 제어를 modifier 로 재사용
"호출자가 소유자인가?" 검사는 onlyOwner modifier 로 분리합니다. 이렇게 하면 같은 규칙을
여러 함수에 한 줄로 붙일 수 있어 코드가 깔끔해지고 중복이 사라집니다.
실제 OpenZeppelin 의 Ownable 컨트랙트도 이 패턴을 표준화한 것입니다.
modifier onlyOwner() {
require(msg.sender == owner, "only owner"); // 소유자만
_;
}해야 할 일:
address public owner상태 변수를 선언하세요.- 생성자(
constructor)에서owner = msg.sender;로 배포자를 소유자로 설정하세요. onlyOwnermodifier 를 만들어require(msg.sender == owner, "only owner")로 검사하세요.addCandidate에onlyOwnermodifier 를 적용하세요.- 기존의
vote,hasVoted,notVotedYetmodifier,Voted이벤트, 결과 조회 함수(getVoteCount,getCandidateCount)는 그대로 유지하세요.
addCandidate 만 소유자로 제한하고, vote 는 누구나 호출할 수 있어야 합니다. 투표는 모든
참여자의 권리이므로 여기에 onlyOwner 를 붙이면 안 됩니다.
완성 후 Run 으로 조건을 확인하세요.