로메오의 블로그

[DApp] 투표하기 구현 본문

Backend/Python & Blockchain

[DApp] 투표하기 구현

romeoh 2019. 7. 7. 17:20
반응형

/contracts/Election.sol 추가하기

pragma solidity ^0.5.0;

contract Election {
    ....

    // 투표에 참여한 ID 기록
    mapping(address => bool) public voters;

    ....

    // 투표하기
    function vote(uint _candidateId) public {
        // 투표에 참여한 ID를 기록해서 두번 투표하지 못하도록 한다.
        voters[msg.sender] = true;

        // 득표수를 +1 한다.
        candidates[_candidateId].voteCount ++;
    }
}

위와 같이 voters 데이터와 vote 메서드를 추가합니다.

그리고 constructor에서 3명의 후보자를 추가한 코드를 주석처리 합니다.

최종 코드는 아래와 같습니다.

pragma solidity ^0.5.0;

contract Election {
    
    // 후보자 모델
    struct Candidate {
        uint id;
        string name;
        uint voteCount;
    }

    // 후보자 기호 변수
    uint public candidatesCount;

    // 후보자 반환하기
    mapping(uint => Candidate) public candidates;

    // 투표에 참여한 ID 기록
    mapping(address => bool) public voters;

    // 후보자 등록하기
    function addCandidate (string memory _name) public {
        candidatesCount++;
        candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);
    }

    // constructor
    constructor() public {
        // constructor 에서 미리 3명의 후보자를 추가한 코드를 제거함
        // addCandidate('romeoh');
        // addCandidate('doraemong');
        // addCandidate('pororo');
    }

    // 투표하기
    function vote(uint _candidateId) public {
        // 투표에 참여한 ID를 기록해서 두번 투표하지 못하도록 한다.
        voters[msg.sender] = true;

        // 득표수를 +1 한다.
        candidates[_candidateId].voteCount ++;
    }
}

 

Build하기

$ truffle migrate --reset

Truffle Console에서 확인하기

$ truffle console
truffle(development)> Election.deployed().then(instance => app = instance)
truffle(development)> app.addCandidate('romeoh')
truffle(development)> app.addCandidate('doraemong')
truffle(development)> app.addCandidate('pororo')

Election을 deploy해서 app 변수에 할당하고 3명의 후보자를 등록합니다.

 

계정 주소 가지고 오기

truffle(development)> web3.eth.getAccounts().then(accounts => myAccount = accounts[0])
truffle(development)> myAccount

myAccount 변수에 Ganache의 첫 번째 계정 ID가 저장되었습니다.

 

투표하기

truffle(development)> app.vote(1, {from: myAccount})

1번 후보에 투표하였습니다.

투표를 위해서 62347 gas가 소모된 것을 확인 할 수 있습니다.

 

투표현황 확인하기

truffle(development)> app.candidates(1)

voteCount에 words가 1인것을 알 수 있습니다.

BN은 Big Number라는 의미입니다.

truffle(development)> app.candidates(1).then(c => romeoh = c)
truffle(development)> romeoh.voteCount.toNumber()

후보자를 romeoh 라는 변수로 저장해서 voteCount를 확인 할 수 있습니다.

반응형
Comments