안녕하세요. 이번 글에서는 solidity를 이용한 간단한 투표 시스템을 구현해 보겠습니다.
3가지 변수와 3가지 함수로 이루어진 간단한 스마트 컨트랙트 입니다.
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;
}
후보자의 이름을 입력받아서 배열에 추가해주고 후보들의 총 인원 수를 배열의 길이만큼 재할당해주면 됩니다.
스마트 컨트랙트를 작성하고 컴파일, 배포를 해보고 이를 통해 간단한 투표 시스템을 구현해봤습니다.
감사합니다.