블록체인 학습
0 XP

실습: 최종 컨트랙트 완성

이번 차시의 마지막 실습입니다. 강의마다 하나씩 추가해 온 조각을 모아 완성된 온체인 투표 컨트랙트 를 한 번에 작성합니다. 새로운 문법은 없고, 각 조각이 어떻게 하나로 맞물리는지 직접 조립해 보는 실습입니다.

완성된 컨트랙트의 구성

완성된 컨트랙트는 크게 네 층으로 이루어집니다.

  • 데이터 : Candidate 구조체, candidates 배열, hasVoted 매핑, owner 상태 변수
  • 초기화 : constructor 에서 owner 설정
  • 규칙(modifier) : onlyOwner(등록 권한), notVotedYet(1인 1표)
  • 동작(함수) : addCandidate(등록), vote(투표 + Voted 이벤트), getVoteCount / getCandidateCount(조회)

작성 순서

상태 변수 → 이벤트 → 생성자 → modifier → 함수 순서로 작성하면 자연스럽게 의존 관계가 맞아떨어집니다. vote 안에서는 득표 수를 늘리고, hasVoted[msg.sender] = true; 로 기록한 뒤 emit Voted(...) 까지 하는 것을 잊지 마세요. addCandidate 에는 onlyOwner, vote 에는 notVotedYet 을 붙입니다. 막히는 부분이 있다면 그 개념을 다룬 앞 강의(04~12)로 돌아가 해당 조각만 다시 보면 됩니다.

해야 할 일:

  1. Voting 컨트랙트에 Candidate 구조체(name, voteCount)와 candidates public 배열을 두세요.
  2. hasVoted 매핑과 owner public 상태 변수를 선언하고, 생성자에서 owner 를 설정하세요.
  3. onlyOwner, notVotedYet 두 modifier 를 선언하세요.
  4. addCandidate(onlyOwner), vote(notVotedYet, 투표 후 기록 + Voted 이벤트 발행) 를 구현하세요.
  5. getVoteCount(uint256) 와 getCandidateCount() view 함수를 구현하세요.
  6. Voted(address indexed voter, uint256 index) 이벤트를 선언하세요.

실무에서는 이런 컨트랙트를 쓸 때 OpenZeppelin 의 검증된 Ownable 등을 상속해 재사용합니다. 여기서는 학습을 위해 직접 작성하지만 원리는 같습니다.

완성 후 Run 으로 모든 조건을 통과하는지 확인하세요.

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

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