블록체인 학습
0 XP

프로젝트 소개: 온체인 투표 시스템

입문 과정의 마지막 차시에서는 온체인 투표(on-chain voting) 시스템을 만듭니다. 후보자를 등록하고, 사용자가 투표하고, 중복 투표를 막고, 결과를 조회하고, 이벤트로 기록하는 컨트랙트를 14개 수업에 걸쳐 한 조각씩 쌓아 올립니다.

왜 투표를 온체인으로 만드는가

전통적인 전자 투표는 중앙 서버가 표를 보관합니다. 서버 운영자는 마음만 먹으면 결과를 조작하거나 표를 삭제할 수 있고, 외부에서는 검증할 방법이 없습니다. 반면 블록체인 위의 투표는 모든 표가 누구나 읽을 수 있는 공개 원장 에 기록되고, 한 번 기록된 데이터는 사실상 변경할 수 없습니다. 이 투명성(transparency)과 변조 불가능성(immutability)이 온체인 투표의 핵심 가치입니다.

관리자라도 결과를 몰래 바꿀 수 없습니다. 코드(스마트 컨트랙트)가 곧 규칙이고, 그 규칙은 배포된 순간부터 모든 참여자에게 똑같이 적용됩니다.

단계별로 만들 기능

  1. 후보자 등록: 이름을 받아 후보자를 추가합니다. (struct, array)
  2. 투표: 후보자 번호로 표를 던집니다. (상태 변경 함수)
  3. 중복 투표 방지: 한 주소는 한 번만 투표하도록 modifier 와 mapping 으로 막습니다.
  4. 결과 조회: view 함수로 각 후보자의 득표 수를 읽습니다.
  5. 이벤트 기록: event 로 투표가 일어날 때마다 로그를 남깁니다.
  6. 접근 제어 + 리팩터링: 소유자만 후보자를 등록하도록 정리합니다.

출발점이 될 뼈대 코드

// 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;
    }
}

위 코드는 아직 중복 투표 방지나 이벤트가 빠진 뼈대 입니다. 여기에 한 강의마다 개념을 하나씩 더해 완전한 컨트랙트로 키워 갑니다. 막히면 이전 강의의 결과물을 그대로 가져와 위에 한 줄씩 더한다고 생각하면 됩니다.

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

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