1. 개발 내용
1. 3명의 관리자가 투표를 통해 Owner를 선정한다.
2. 컨트랙트를 배포할 때 관리자주소를 3개 선정할 수 있지만 관리자1명이 배포한 것으로 하여 1명의 관리자가 2명의 관리자를 더 추가하고 총 3명의 관리자가 투표를 통해 1명의 Owner를 선정하는 방식이다.
3. 투표는 1번만 할 수 있으며 만약 투표 결과가 1:1:1로 나온다면 기존에 Owner가 유지된다.
관리자 추가
function addOwner (uint8 _ownerNumber,address _newOwner) onlyOwner public returns(bool) {
require(_ownerNumber>0 &&_ownerNumber<3);
_owners[_ownerNumber] = _newOwner;
voteCount[_newOwner] = 0;
voteResult[_newOwner] = 0;
return true;}
_OwnerNumber를 받으며 0은 기존 Owner의 인덱스, 1과2를 추가로 받아 새로운 관리자주소를 할당한다.
동시에 투표완료수와 자신이 받은 투표값을 0으로 초기화한다.
투표 하기
function voteForOwner(address _voteforAddress) public virtual returns(bool){
_voteforOwner(msg.sender,_voteforAddress);
return true;
}
function _voteforOwner(address sender, address voteforAddress) internal virtual returns (bool){
require(_owners[0]==sender || _owners[1]==sender || _owners[2]==sender);
require(voteCount[sender] == 0);
voteResult[voteforAddress]+=1;
voteCount[sender]+=1;
return true;
}
함수를 실행한사람의 주소와, 투표할 주소를 인자로 받아 _voteforOwner로 보낸다.
_voteforOwner에서는 3명의 관리자가 들어있는 _owerns에서 실행한 주소(msg.sender)가 있는지, 투표한적이 있는지 확인한 뒤 투표결과를 올리며 동시에 voteCount를 올려 투표한 상태로 만들어준다.
투표결과확인
function result() public view returns (uint8){
return voteResult[msg.sender];
}
투표결과로 Owner 변경하기
function transferOwnership() onlyOwner public returns (bool) {
if(voteResult[_owners[1]] > voteResult[_owners[2]]){
require(_owners[1] != _owner);
require(_owners[1] != address(0x0));
address preOwner = _owner;
_owner = _owners[1];
emit OwnershipTransferred(preOwner, _owners[1]);
}
else if(voteResult[_owners[2]] > voteResult[_owners[0]]){
require(_owners[2] != _owner);
require(_owners[2] != address(0x0));
address preOwner = _owner;
_owner = _owners[2];
emit OwnershipTransferred(preOwner, _owners[2]);
}
return true;
}
투표 결과변경을 실행할 수있는사람은 현재 Owner이며 실행하게 되면 투표결과에 따라 블록체인에 기록되고 변경된다.
락 재 사용하기
function addTokenLock() onlyOwner public {
require(_tokenLock == false);
_tokenLock = true;
}
function addPersonalTokenLock(address _who) onlyOwner public {
require(_personalTokenLock[_who] == false);
_personalTokenLock[_who] = true;
}
Owner만이 토큰의 상태를 require로 확인한뒤 lock상태인 true로 바꾸어주며 특정 주소에 대해서도 lock을 할 수 있다.
2. 개발 회고
Keep: 작성하고 테스트하면서 맨 처음 관리자를 3명 지정하여 배포할 수 있지만 지정되기보다 이후에 직접 1명의 관리자에 의해 2명을 더 추가하고 3명의 관리자가 각각 투표를 할수 있는방식이 나을것 같다고 생각했다. 투표를 함에 있어 1번 투표하면 중복투표를 하는것을 방지해야했고 voteCounter를 추가하였다. 또한 투표를 할 때도 관리자3명 만의 주소가 실행되어야하므로 require로 제어하였다. 코드를 작성하고 테스트하면서 실제로 사용해보니 어느부분에서 누가 악용을 할 수 있는가 판단할때 마다 새롭게 코드와 변수를 추가하였다.
Problem: 많은 변수 선언보다는 이중 맵핑과 structor를 사용해봐야겠다. 그리고 Owner를 결정하는 순간에 투표값을 계산하는 과정에 대해 조금 더 쉬운 연산을 찾아봐야할것이다.
Try: 이중맵핑과 structor에 대한 공부를 더하여 변수선언을 줄이고 복잡한 로직을 간단하게 만들어야겠다.
3. 작동 영상
4. 코드 및 주소
Github : https://github.com/Parkstelth/ERC-20-voteOwnerSystem-lockToken/tree/master
Contract : https://ropsten.etherscan.io/address/0x245C5AccB2f34e87342eb5DaB4a108d175be8728
'포트폴리오 > Project_1' 카테고리의 다른 글
가위바위보 게임 개선하기(hand encoding) (0) | 2021.12.13 |
---|---|
Web3.js 서버프로젝트를 KAS기반 클레이튼 서버로 개발 (0) | 2021.12.12 |
니모닉 지갑 개발 (0) | 2021.12.12 |
졸업증명 DID를 백신 접종 증명 시스템으로 변경 (0) | 2021.12.10 |
댓글