스마트 컨트랙트
안녕하세요 Skkrypto Skkvote 팀의 정선웅입니다. 지난 편까지는 블록체인 전자투표에 대한 간략한 설명과 시나리오 기획을 통해 간단한 프런트 페이지를 만들어보았습니다. 저는 현명님이 만든 유저 플로우를 기반으로 Smart Contract와 각종 API, Token transaction 등에 관해 연재할 예정입니다
이번 주 개발 목표는 Smart contract 작성입니다.
우선 Luniverse에서는 Solidity 언어를 사용하고 있습니다. 그래서 개발을 하실 때 익숙한 Remix 환경이나 Atom에서 작업을 하실 수 있습니다.
이 코드는 Remix에서 기본 교육용으로 제공되는 투표 컨트랙트입니다. 밑에 내려가 보면 생각보다 긴 내용에 지레 겁먹을 수 있습니다. 하지만 Remix에서 제공하는 투표 컨트랙트에는 Skkvote에 필요하지 않은 기능들이 많이 있습니다. 투표권 부여라던가 투표를 할 수 없는 상황에서 투표권을 위임하는 등의 코드들이 부가적으로 있습니다.
그래서 이 코드는 참고용으로만 보고 처음 기획 의도에 맞춰 Skkvote에 어떤 함수와 변수가 필요한지 알아보겠습니다
1. 투표가 지갑 주소당 한 번만 이루어졌는지 확인하는 함수 (중복투표 여부)
2. 투표 결과를 보여주는 함수
사실 2번의 경우도 프런트 페이지에는 표시가 되지 않지만 후에 투표 기록을 확인하기 위한 용도로 만들었습니다
Skkvote의 간단한 컨트랙트입니다.
맨 윗줄은 Compiler version을 의미합니다.
Mapping이 두 개가 있는데요 첫 번째 mapping은 ‘votesReceived’로 득표수를 확인하기 위해서입니다. Uint8 형식으로 프런트 페이지에서 받아올 예정입니다. 솔리디티로 스마트 컨트랙을 작성할 때는 코드가 길어지면 길어질수록 gas가 더 많이 소모되기 때문에 변수 형식도 중요합니다.
프런트 페이지에서 받아오는 숫자는 후보자 숫자이기 때문에 많아도 10명을 넘지 않습니다. 그러기에 가장 작은 uint8을 부여하였습니다. 하지만 return 되는 값은 전교생을 기준으로 했을 때 255명을 넘어가기 때문에 uint8이 아닌 uint16으로 return 하도록 하였습니다.
두 번째 mapping값은 중복투표를 막기 위해서입니다. Msg.sender를 호출하면 접속한 사람의 지갑 주소를 읽어오는데 한 번이라도 ‘voteForCandidate’를 통해 투표를 한 지갑 주소는 값을 변경하여 중복 투표를 막을 수 있습니다.
이 mapping들은 밑에 있는 함수에서 쓰이게 되는데요
첫 번째 ‘voteForCandidate’ 함수는 if문을 통해 투표를 했는지 안 했는지 확인을 하며 프런트 페이지로부터 candidate 인수를 받아와 투표수를 기록합니다.
두 번째 함수 ‘totalVotesFor’는 기록된 투표수를 보여줍니다.
이번 주는 간단한 투표 컨트랙트를 작성해 보았고 다음 주부터는 지갑을 생성하고 본격적으로 살을 붙여나가는 작업을 해보겠습니다.
"위 글은 람다 256 루니버스의 Dev Plan을 무료로 제공받아 작성하였습니다"
작성자:정선웅(wpdlsksh94@gmail.com)