프로젝트 소개: 온체인 투표 시스템
입문 과정의 마지막 차시에서는 온체인 투표(on-chain voting) 시스템을 만듭니다. 후보자를 등록하고, 사용자가 투표하고, 중복 투표를 막고, 결과를 조회하고, 이벤트로 기록하는 컨트랙트를 14개 수업에 걸쳐 한 조각씩 쌓아 올립니다.
왜 투표를 온체인으로 만드는가
전통적인 전자 투표는 중앙 서버가 표를 보관합니다. 서버 운영자는 마음만 먹으면 결과를 조작하거나 표를 삭제할 수 있고, 외부에서는 검증할 방법이 없습니다. 반면 블록체인 위의 투표는 모든 표가 누구나 읽을 수 있는 공개 원장 에 기록되고, 한 번 기록된 데이터는 사실상 변경할 수 없습니다. 이 투명성(transparency)과 변조 불가능성(immutability)이 온체인 투표의 핵심 가치입니다.
관리자라도 결과를 몰래 바꿀 수 없습니다. 코드(스마트 컨트랙트)가 곧 규칙이고, 그 규칙은 배포된 순간부터 모든 참여자에게 똑같이 적용됩니다.
단계별로 만들 기능
- 후보자 등록: 이름을 받아 후보자를 추가합니다. (
struct,array) - 투표: 후보자 번호로 표를 던집니다. (상태 변경 함수)
- 중복 투표 방지: 한 주소는 한 번만 투표하도록
modifier와mapping으로 막습니다. - 결과 조회:
view함수로 각 후보자의 득표 수를 읽습니다. - 이벤트 기록:
event로 투표가 일어날 때마다 로그를 남깁니다. - 접근 제어 + 리팩터링: 소유자만 후보자를 등록하도록 정리합니다.
출발점이 될 뼈대 코드
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Voting {
struct Candidate {
string name;
uint256 voteCount;
}
Candidate[] public candidates;
mapping(address => bool) public hasVoted;
function addCandidate(string memory name) public {
candidates.push(Candidate(name, 0));
}
function vote(uint256 index) public {
candidates[index].voteCount += 1;
}
}위 코드는 아직 중복 투표 방지나 이벤트가 빠진 뼈대 입니다. 여기에 한 강의마다 개념을 하나씩 더해 완전한 컨트랙트로 키워 갑니다. 막히면 이전 강의의 결과물을 그대로 가져와 위에 한 줄씩 더한다고 생각하면 됩니다.