05-22

조하빈 ·2023년 5월 22일
0

05월 22일 월요일


Solidity 문제풀기 복습

/*
안건을 올리고 이에 대한 찬성과 반대를 할 수 있는 기능을 구현하세요.
안건은 번호, 제목, 내용, 제안자(address) 그리고 찬성자 수와 반대자 수로 이루어져 있습니다.(구조체)
안건들을 모아놓은 자료구조도 구현하세요.
사용자는 자신의 이름과 주소, 자신이 만든 안건 그리고 자신이 투표한 안건과 어떻게 투표했는지(찬/반)에 대한 정보[string => bool]로 이루어져 있습니다.(구조체)

  • 사용자 등록 기능 - 사용자를 등록하는 기능
  • 투표하는 기능 - 특정 안건에 대하여 투표하는 기능, 안건은 제목으로 검색, 이미 투표한 건에 대해서는 재투표 불가능
  • 안건 제안 기능 - 자신이 원하는 안건을 제안하는 기능
  • 제안한 안건 확인 기능 - 자신이 제안한 안건에 대한 현재 진행 상황 확인기능 - (번호, 제목, 내용, 찬반 반환 // 밑의 심화 문제 풀었다면 상태도 반환)
  • 전체 안건 확인 기능 - 제목으로 안건을 검색하면 번호, 제목, 내용, 제안자, 찬반 수 모두를 반환하는 기능
  • 안건 진행 과정 - 투표 진행중, 통과, 기각 상태를 구별하여 알려주고 전체의 70% 그리고 투표자의 66% 이상이 찬성해야 통과로 변경, 둘 중 하나라도 만족못하면 기각
    */
  • 안건 구조체 만들기
struct Poll{
  uint number;
  string title;
  string context;
  address by;
  uint pros;
  uint cons;  
}
  • 안건들을 모아놓은 자료구조도 구현하세요.
    이 부분은 전체 안건확인기능 문제가 있기때문에 검색이 용이한 mapping으로 자료구조를 만드는게 좋다.
    mapping(string=>poll) polls;

  • 사용자 구조체 만들기

struct user{
	string name;
    address addr;
    string[] titles;
    mapping(string=>bool) voted;
}

유저들을 모아놓은 자료구조
mapping(address=>user) Users

  1. 사용자 등록 기능 - 사용자를 등록하는 기능
  function pushUser(string memory _name) public {
        (users[msg.sender].name, users[msg.sender].addr) = (_name, msg.sender);
    	// userList[msg.sender] = user(_name, msg.sender); 이렇게 넣으면 mapping값을 초기값을 입력할 수 없다.
    }
  1. 투표하는 기능
    투표하는 기능을 구현하기 위해서는 현재 투표상황에 대한 enum이 필요하다.
  enum votingStatus {
        notVoted,
        pro,
        con
    }
   function vote(string memory _title, bool _vote) public {
        require(users[msg.sender].voted[_title]==votingStatus.notVoted); //투표자가 해당 안건에 대해서 투표를 안했어야 함
        // 찬성이냐, 반대이냐
        if(_vote==true) {
            polls[_title].pros++;
            users[msg.sender].voted[_title] = votingStatus.pro;
        } else {
            polls[_title].cons++;
            users[msg.sender].voted[_title] = votingStatus.con;
        }
    }
  1. 안건 제안 기능 - 자신이 원하는 안건을 제안하는 기능
    안건을 제안하기 위해서 현재 안건의 상태를 나타낼수 있는 enum이 필요하다.
    또한 나중에 안건을 검색하기 위해서와 투표자의 수를 확인하기 위해 상태변수 count를 설정해주어야한다.
	uint count;<br/>
  enum pollSatus {
        ongoing,
   		 passed,
        rejected
    }
function suggest(string calldata _title, string calldata _context) public {
  polls[_title] = poll(++count, _title, _context, msg.sender, 0,0,pollStatus.ongoing);
}

4.제안한 안건 확인 기능 - 자신이 제안한 안건에 대한 현재 진행 상황 확인기능 - (번호, 제목, 내용, 찬반 반환 // 밑의 심화 문제 풀었다면 상태도 반환)

function searchSuggest(string calldata _title) public view returns(poll memory){
require(msg.sender == polls[_title].by);
  return polls[_title];
}

5.전체 안건 확인 기능 - 제목으로 안건을 검색하면 번호, 제목, 내용, 제안자, 찬반 수 모두를 반환하는 기능

function getPoll(string calldata _title) public view returns(poll memory)
{
  return polls[_title];
}

심화문제
6. 안건 진행 과정 - 투표 진행중, 통과, 기각 상태를 구별하여 알려주고 전체의 70% 그리고 투표자의 66% 이상이 찬성해야 통과로 변경, 둘 중 하나라도 만족못하면 기각

function checkStatus(string memory _title) public{
  require(polls[_title].pros + polls[_title].cons > count*7/10 // 전체의 70%이상
&&//solidity에서는 곱하고 난 후 나눌것 왜냐하면 다른 값이 나옴 소수점 떼버리기 떄문에,
	 polls[_title].pros/polls[_title].pros + polls[_title].cons*100 > 66 // 투표자의 66%이상);
	polls[_title].pollStatus status.passed;
}
profile
PPisland

0개의 댓글