간단한 투표 시스템 만들기

taeheeyoon·2022년 8월 22일
2

Blockchain 실습

목록 보기
6/8
post-thumbnail

시작하며

안녕하세요. 이번 글에서는 solidity를 이용한 간단한 투표 시스템을 구현해 보겠습니다.
3가지 변수와 3가지 함수로 이루어진 간단한 스마트 컨트랙트 입니다.

투표 시스템

  • 변수
    1. numCandidates // 후보들의 총 인원 수
    2. candidateNames // 후보자들의 이름
    3. votesReceived // 후보자별 득표 수
  • 함수
    1. constructor // 컨트랙트가 최초 배포될 때 한 번 실행됨 : 후보자 등록
    2. getCandidateName //후보자들의 이름을 열람하는 함수
    3. vote //특정 후보자에게 표를 주는 함수
pragma solidity ^0.6.4;

contract ElectronicVote {
	uint public numCandidates;	                    
	string[] candidateNames; 		                
	mapping (string => uint) public votesReceived;  

	constructor() public {
		candidateNames.push("Alice");
		candidateNames.push("Bob");
		candidateNames.push("Chloe");
		numCandidates = candidateNames.length;
	}

	function getCandidateName(uint index) public view returns(string memory) {
		if (index < candidateNames.length) 
		    return candidateNames[index];
		return "Invalid candidate";
		
	}

	function vote(string memory candidateName) public {		
		votesReceived[candidateName] += 1;
	}
}

컴파일 및 배포

그럼 상단 코드를 Remix에서 컴파일과 배포를 해보겠습니다.

컴파일 메뉴에서 컴파일 버전을 스마트컨트랙트 버전과 동일하게 변경해줍니다.
그리고나서 컴파일할 컨트랙트를 선택하고 Compile 버튼을 눌러 컴파일을 해줍니다.
컴파일이 완료 되었다면 배포 탭으로 이동합니다.

여기에서는 간단하게 코드를 실행할 예정이므로 배포 환경을 Remix VM으로 설정하겠습니다.
계정, 가스 제한, 배포 할 컨트랙트를 확인했으면 Deploy버튼을 눌러 배포를 해줍니다.

배포가 완료 되었으면 배포된 컨트랙트 목록에서 배포한 스마트컨트랙트가 보이게됩니다.
여기에서는 현재 vote, getCandidateName, numCandidates, votesReceived가 보이게 됩니다.

참고로 변수이더라도 public으로 생성하였으면 이 탭에서 보이게 됩니다.

numCandidates을 클릭 해보면 현재 후보자들의 총 인원 수가 보이게 됩니다.



getCandidateName에서는 후보자의 index값을 넣어 해당 index의 후보자의 이름을 확인 할 수 있습니다.
index 값은 candidateNames배열의 순서입니다.


votesReceived 는 후보자의 이름을 입력하면 해당 후보자가 받은 투표 수를 반환합니다. 현재는 아무에게도 투표를 하지 않았기 때문에 0입니다.

vote 함수는 후보자의 입력을 입력 후 실행하면 해당 후보자에게 1표를 줄 수 있습니다.

스마트 컨트랙트 실행

그럼 vote 함수로 Alice에게 투표를 해보겠습니다.

투표를 하게되면 트랜잭션이 발생하게되며 트랙잭션이 성공할 시 Alice의 득표 수가 1 증가하게 됩니다.
아래와 같이 트랙잭션이 발생한 내역을 확인 할 수 있습니다.

Alice에게 투표를 한 뒤 votesReceived를 확인해보면 Alice의 득표 수가 1 증가한 것을 확인 할 수 있습니다.

다른 후보자들도 마찬가지로 동작하며, 배포한 계정이 아닌 다른 계정으로 해당 함수를 실행 시켜도 같은 결과를 얻을 수 있습니다.

후보자 등록 기능 추가

그럼 기존 후보들 외에 추가로 후보자를 등록하려면 어떻게 해야될까요?
위 스마트컨트랙트 코드에 후보자를 추가로 등록시킬 수 있는 함수를 추가해보겠습니다.

	function addCandidate(string memory candidateName) public {
		candidateNames.push(candidateName);
		numCandidates = candidateNames.length;
	}

후보자의 이름을 입력받아서 배열에 추가해주고 후보들의 총 인원 수를 배열의 길이만큼 재할당해주면 됩니다.

마치며

스마트 컨트랙트를 작성하고 컴파일, 배포를 해보고 이를 통해 간단한 투표 시스템을 구현해봤습니다.
감사합니다.

참조

스마트 컨트랙트와 Dapp 개발

profile
생각하는 대로 살지 않으면, 사는 대로 생각하게 된다.

0개의 댓글