반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 맥
- vsCode
- unittest
- androidstudio
- 오블완
- 센토스
- webpack
- IOS
- ReactNative
- build
- Android
- 리눅스
- PYTHON
- 개발
- qunit
- linux
- MAC
- 티스토리챌린지
- VirtualBox
- 네트워크
- Chrome
- xcode
- centos
- node
- TensorFlow
- react
- MachineLearning
- localserver
- jest
Archives
- Today
- Total
로메오의 블로그
[DApp] 중복 투표 방지하기 본문
반응형
중복투표를 방지하기 위해 vote 메서드에 코드를 추가하겠습니다.
/contracts/Election.sol
pragma solidity ^0.5.0;
contract Election {
...
// 투표하기
function vote(uint _candidateId) public {
// 중복투표를 하면 오류를 발생 시킨다.
require(!voters[msg.sender]);
// 목록에 없는 후보자에게 투표하면 오류를 발생시킨다.
require(_candidateId > 0 && _candidateId <= candidatesCount);
// 투표에 참여한 ID를 기록해서 두번 투표하지 못하도록 한다.
voters[msg.sender] = true;
// 득표수를 +1 한다.
candidates[_candidateId].voteCount ++;
}
}
투표하기 메서드에 중복투표 방지 코드를 추가합니다.
require는 throw와 같다고 보시면 됩니다.
if문으로 분기처리하지 않고 require로 오류를 발생시키는 이유는 if문의 경우 투표하지 않더라도 gas를 소모시키지만
오류가 발생하면 gas를 소모시키지 않기 때문입니다.
전체 코드는 아래와 같습니다.
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 {
// addCandidate('romeoh');
// addCandidate('doraemong');
// addCandidate('pororo');
}
// 투표하기
function vote(uint _candidateId) public {
// 중복투표를 하면 오류를 발생 시킨다.
require(!voters[msg.sender]);
// 목록에 없는 후보자에게 투표하면 오류를 발생시킨다.
require(_candidateId > 0 && _candidateId <= candidatesCount);
// 투표에 참여한 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')
truffle(development)> web3.eth.getAccounts().then(accounts => myAccount = accounts[0])
Election을 deploy 하고 3명의 후보자를 등록한 후에
myAccount 변수에 계정 주소까지 추가했습니다.
투표하기
truffle(development)> app.vote(1, {from: myAccount})
첫 번째 투표는 성공했습니다.
다시 1번에 투표합니다.
truffle(development)> app.vote(1, {from: myAccount})
이번에는 exception이 발생했습니다.
truffle(development)> app.vote(99, {from: myAccount})
이번에는 99번 후보자에 투표합니다.
마찬가지로 exception이 발생합니다.
이번에는 다른 계정으로 투표해 보겠습니다.
truffle(development)> web3.eth.getAccounts().then(accounts => myAccount = accounts[1])
truffle(development)> app.vote(1, {from: myAccount})
투표가 성공했습니다.
반응형
'Backend > Python & Blockchain' 카테고리의 다른 글
[DApp] 투표하기 화면 구현 (1) | 2019.07.07 |
---|---|
[DApp] 중복 투표 방지 테스트 코드 작성 (0) | 2019.07.07 |
[DApp] 투표하기 테스트 코드 작성 (0) | 2019.07.07 |
[DApp] 투표하기 구현 (0) | 2019.07.07 |
[DApp] Solidity Front-end Election에서 후보자 읽어오기 (0) | 2019.07.07 |
Comments