블록체인 학습
0 XP

실습: 컨트랙트 리팩터링

기능이 모두 모였으니 이제 다듬을 차례입니다. 지금은 누구나 후보자를 등록할 수 있는데, 이는 곧 아무나 가짜 후보를 무한히 추가해 선거를 망칠 수 있다는 뜻입니다. 보통 선거에서는 소유자(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"); // 소유자만
    _;
}

해야 할 일:

  1. address public owner 상태 변수를 선언하세요.
  2. 생성자(constructor)에서 owner = msg.sender; 로 배포자를 소유자로 설정하세요.
  3. onlyOwner modifier 를 만들어 require(msg.sender == owner, "only owner") 로 검사하세요.
  4. addCandidate 에 onlyOwner modifier 를 적용하세요.
  5. 기존의 vote, hasVoted, notVotedYet modifier, Voted 이벤트, 결과 조회 함수(getVoteCount, getCandidateCount)는 그대로 유지하세요.

addCandidate 만 소유자로 제한하고, vote 는 누구나 호출할 수 있어야 합니다. 투표는 모든 참여자의 권리이므로 여기에 onlyOwner 를 붙이면 안 됩니다.

완성 후 Run 으로 조건을 확인하세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.