3인 투표 시스템 만들기

mango7loco·2022년 4월 7일
0

블록체인

목록 보기
2/4
post-thumbnail

백신시스템 DID 만들기 : https://velog.io/@mango_loco/%EB%B0%B1%EC%8B%A0%EC%8B%9C%EC%8A%A4%ED%85%9C-DID-%EB%A7%8C%EB%93%A4%EA%B8%B0


한 스마트 컨트랙트의 관리자가 3명이 된 후에, 3명 간의 투표를 통해서 한 명의 관리자가 선출되는 시스템을 구현하였다.

이더스캔 :
https://ropsten.etherscan.io/address/0x88fAD4A9A660Df3Cb6E3b3Ec09B09c979b07523B#code

깃허브 :
https://github.com/mango7loco/vote/blob/main/voting.sol


개요

그런데 처음 스마트 컨트랙트를 만들 때부터 관리자를 지정하는 것이 아닌, 새로운 방법을 도입했다. 스마트 컨트랙트가 만들어진 직후에는 관리자가 아무도 없다. 그래서 스마트 컨트랙트에 관리자 신청을 하면 선착순으로 관리자 3명이 결정된다. 여기서 첫번째로 관리자 신청을 한 사람은 한 가지 혜택을 얻게 된다.

3명의 관리자가 결정된 이후에는 기존의 관리자가 양도하지 않는 한 투표를 할 수 있는 관리자는 변하지 않는다. 각 관리자는 한 표씩 투표를 할 수 있다. 여기서 한 관리자에게 2표 이상이 몰리게 되면 즉각적으로 최종 관리자가 선출되고 해당 관리자가 스마트 컨트랙트를 통제할 수 있게 된다.

그런데 몰표가 발생하지 않고, 모든 관리자가 1표씩 받은 경우에는 문제가 발생한다. 이때는 첫번째로 관리자를 신청한 사람이 자동적으로 최종 관리자로 된다. 이러한 시스템을 통해서 관리자들간의 충분한 대화 없이 모두가 자기자신을 투표하는 상황이 발생하지 않도록 유인한다.

그런데 또, 이러한 시스템만 구축해놓으면, 투표 자체를 하지 않을 유인이 발생하게 된다. 그래서 한 가지 더 마련해놓은 시스템은 블록의 높이를 기준으로, 5000개 이상 쌓일 경우에는 투표를 한 관리자 중에서 가장 먼저 트랜잭션을 보낸 사람이 최종 관리자로 바로 선출될 수 있는 시스템을 마련했다.

이러한 두가지 시스템(1. 모두가 자기자신에게 투표를 하면 자동적으로 첫번째 관리자가 선출되므로 충분한 협의 없이 투표 하는 것을 방지한다. 2. 투표 자체를 안 하는 것을 방지해서, 일정 시간이 지난 뒤에는 투표를 한 관리자들에게는 선착순으로 최종 관리자가 될 수 있게 한다.)을 통해서 3명 중에서 최소한 2명이 의견을 합치할 수 있게 유도한다.


함수 설명

getStatus :
현재의 투표 상황을 한 눈에 알아볼 수 있게, 어떤 관리자가 투표를 했고, 어떤 관리자가 얼마의 투표를 받았는지 확인할 수 있다. 그리고 최종 관리자가 누구인지도 확인할 수 있다.

becomeOwner :
최초에 스마트 컨트랙트 관리자 3명이 되고 싶으면 주소를 적어 신청하면 된다.

showOwner :
1, 2, 3을 입력값으로 넣을 수 있으며, 각각의 관리자가 누구인지 보여준다.

vote :
3명의 관리자는 각각 투표를 할 수 있으며, 3명의 관리자가 모두 한 표씩 받았을 때는, 첫번째 관리자가 자동적으로 최종 관리자로 선출된다.

showRealOwner :
주소를 넣으면 해당 관리자가 최종 관리자인지 확인할 수 있다.

getValue :
최종관리자만이 수정할 수 있는 value 값을 출력한다.

setValue :
최종관리자만 이 함수를 통해서 value 값을 수정할 수 있다.

lastMethod :
스마트 컨트랙트가 생기고 난 뒤에 5000개의 블록이 더 쌓일 때까지 최종관리자가 결정되지 않은 상태이면, 이전에 투표를 한 관리자들 중에서 선착순으로 최종 관리자가 결정될 수 있게 만든 함수이다.


사용 시나리오

A, B, C 세 명의 사람이 해당 스마트 컨트랙트의 관리자가 되기 위해서 신청한다.



처음에는 세 개의 관리자 자리를 아무도 차지하지 않고 있는 것을 확인할 수 있다.


각각은 관리자가 되기 위해서 신청할 수 있다. 이때 관리자로 신청하는 주소는 해당 트랜잭션을 발생시키는 주소가 아니어도 된다. 대리 신청이 가능한 구조이다. 하지만 투표를 할 때는 해당 주소를 소유한 사람만이 참여함을 명심해야 한다. 애초에 자신의 주소로 신청되게끔 할 수도 있지만, 3명이 각각 어떠한 집단의 대표라고 생각하면, 각 집단은 이 선착순 경쟁에 참여할 수 있다는 생각에 이렇게 짜보았다.

관리자가 되면 이렇게 원하는 후보에 투표를 할 수 있다.


현재 2번째 관리자까지 신청된 상황임을 확인할 수 있다.


최종관리자가 아닌 사람은, 최종 관리자만이 사용할 수 있는 함수를 사용할 수 없음을 확인할 수 있다.

투표 과정을 통해서 최종 관리자가 선출되고 나면, 최종 관리자가 맞음을 확인할 수 있다.

또한, 최종 관리자만 변경할 수 있는 value는 초기에 0으로 설정되어있다.


이렇게 최종관리자의 권한으로 value 값을 수정했음을 확인할 수 있다.

이러한 과정을 통해서 관리자 없이 등록된 스마트 컨트랙트에서 최초 3명의 관리자가 탄생하고, 3명 간의 협의를 통한 투표 과정을 거쳐서 최종 관리자가 탄생하고, 최종 관리자만이 가지는 권한도 잘 작동함을 확인할 수 있다.


개발 회고

Keep :
처음부터 주소값을 넣어서 관리자가 결정된 채로 스마트 컨트랙트가 만들어지기 보다, 주인이 없는 상태의 스마트 컨트랙트를 만들어서 누구나 관리자에 신청할 수 있게 하고, 관리자들 간의 협의를 통해서 최종 관리자가 선출될 수 있게 유도하는 시스템을 구축하였다.

Problem :
현재는 3명의 관리자 중에서 투표를 하는 것이기 때문에, 굳이 비밀투표 시스템을 만들 필요가 없다는 생각을 하였다. 하지만 투표를 하는 사람들이 늘어난다면 각자 누구를 투표했는지 비밀로 유지할 수 있는 시스템을 구축해야 한다.

Try :
투표 시스템을 웹사이트에 직접 구현하여서 사용 편의성이 좋게 버튼만 간단히 클릭하면 투표를 할 수 있고, 3명의 관리자들만 참여할 수 있는 채팅방도 있으면 서로 대화를 하는데 좋을 것 같다.

profile
I can do this all day

0개의 댓글