실습: 최종 컨트랙트 완성
이번 차시의 마지막 실습입니다. 강의마다 하나씩 추가해 온 조각을 모아 완성된 온체인 투표 컨트랙트 를 한 번에 작성합니다. 새로운 문법은 없고, 각 조각이 어떻게 하나로 맞물리는지 직접 조립해 보는 실습입니다.
완성된 컨트랙트의 구성
완성된 컨트랙트는 크게 네 층으로 이루어집니다.
- 데이터 :
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)로 돌아가 해당 조각만 다시 보면 됩니다.
해야 할 일:
Voting컨트랙트에Candidate구조체(name,voteCount)와candidatespublic 배열을 두세요.hasVoted매핑과ownerpublic 상태 변수를 선언하고, 생성자에서owner를 설정하세요.onlyOwner,notVotedYet두 modifier 를 선언하세요.addCandidate(onlyOwner),vote(notVotedYet, 투표 후 기록 +Voted이벤트 발행) 를 구현하세요.getVoteCount(uint256)와getCandidateCount()view 함수를 구현하세요.Voted(address indexed voter, uint256 index)이벤트를 선언하세요.
실무에서는 이런 컨트랙트를 쓸 때 OpenZeppelin 의 검증된 Ownable 등을 상속해 재사용합니다.
여기서는 학습을 위해 직접 작성하지만 원리는 같습니다.
완성 후 Run 으로 모든 조건을 통과하는지 확인하세요.