본문 바로가기
포트폴리오/Project_1

관리자3명이 Owner 투표 / 락 재 사용 구현

by StelthPark 2021. 12. 10.

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. 작동 영상

관리자3명이 Owner 투표

 

lockToken 재사용

 

4. 코드 및 주소

 

Github : https://github.com/Parkstelth/ERC-20-voteOwnerSystem-lockToken/tree/master

 

GitHub - Parkstelth/ERC-20-voteOwnerSystem-lockToken

Contribute to Parkstelth/ERC-20-voteOwnerSystem-lockToken development by creating an account on GitHub.

github.com

 

Contract : https://ropsten.etherscan.io/address/0x245C5AccB2f34e87342eb5DaB4a108d175be8728

 

Contract Address 0x245C5AccB2f34e87342eb5DaB4a108d175be8728 | Etherscan

The Contract Address 0x245C5AccB2f34e87342eb5DaB4a108d175be8728 page allows users to view the source code, transactions, balances, and analytics for the contract address. Users can also interact and make transactions to the contract directly on Etherscan.

ropsten.etherscan.io

 

댓글