Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
baas-ide
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
guxukai
baas-ide
Commits
2e4439b6
Commit
2e4439b6
authored
Mar 09, 2017
by
chriseth
Committed by
yann300
Mar 12, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Replace example by the one from the documentation.
parent
f9707a79
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
111 additions
and
32 deletions
+111
-32
ballot.sol
contracts/ballot.sol
+111
-32
No files found.
contracts/ballot.sol
View file @
2e4439b6
pragma solidity ^0.4.0;
pragma solidity ^0.4.0;
contract Ballot {
/// @title Voting with delegation.
contract Ballot {
// This declares a new complex type which will
// be used for variables later.
// It will represent a single voter.
struct Voter {
struct Voter {
uint weight;
uint weight;
// weight is accumulated by delegation
bool voted;
bool voted;
// if true, that person already voted
uint8 vote;
address delegate; // person delegated to
address delegate;
uint vote; // index of the voted proposal
}
}
struct Proposal {
uint voteCount;
// This is a type for a single proposal.
struct Proposal
{
bytes32 name; // short name (up to 32 bytes)
uint voteCount; // number of accumulated votes
}
}
address chairperson;
address public chairperson;
mapping(address => Voter) voters;
Proposal[] proposals;
/// Create a new ballot with $(_numProposals) different proposals.
// This declares a state variable that
function Ballot(uint8 _numProposals) {
// stores a `Voter` struct for each possible address.
mapping(address => Voter) public voters;
// A dynamically-sized array of `Proposal` structs.
Proposal[] public proposals;
/// Create a new ballot to choose one of `proposalNames`.
function Ballot(bytes32[] proposalNames) {
chairperson = msg.sender;
chairperson = msg.sender;
voters[chairperson].weight = 1;
voters[chairperson].weight = 1;
proposals.length = _numProposals;
// For each of the provided proposal names,
// create a new proposal object and add it
// to the end of the array.
for (uint i = 0; i < proposalNames.length; i++) {
// `Proposal({...})` creates a temporary
// Proposal object and `proposals.push(...)`
// appends it to the end of `proposals`.
proposals.push(Proposal({
name: proposalNames[i],
voteCount: 0
}));
}
}
}
//
/ Give $(voter)
the right to vote on this ballot.
//
Give `voter`
the right to vote on this ballot.
//
/ May only be called by $(chairperson)
.
//
May only be called by `chairperson`
.
function giveRightToVote(address voter) {
function giveRightToVote(address voter) {
if (msg.sender != chairperson || voters[voter].voted) return;
if (msg.sender != chairperson || voters[voter].voted) {
// `throw` terminates and reverts all changes to
// the state and to Ether balances. It is often
// a good idea to use this if functions are
// called incorrectly. But watch out, this
// will also consume all provided gas.
throw;
}
voters[voter].weight = 1;
voters[voter].weight = 1;
}
}
/// Delegate your vote to the voter
$(to)
.
/// Delegate your vote to the voter
`to`
.
function delegate(address to) {
function delegate(address to) {
Voter sender = voters[msg.sender]; // assigns reference
// assigns reference
if (sender.voted) return;
Voter sender = voters[msg.sender];
while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)
if (sender.voted)
throw;
// Forward the delegation as long as
// `to` also delegated.
// In general, such loops are very dangerous,
// because if they run too long, they might
// need more gas than is available in a block.
// In this case, the delegation will not be executed,
// but in other situations, such loops might
// cause a contract to get "stuck" completely.
while (
voters[to].delegate != address(0) &&
voters[to].delegate != msg.sender
) {
to = voters[to].delegate;
to = voters[to].delegate;
if (to == msg.sender) return;
}
// We found a loop in the delegation, not allowed.
if (to == msg.sender) {
throw;
}
// Since `sender` is a reference, this
// modifies `voters[msg.sender].voted`
sender.voted = true;
sender.voted = true;
sender.delegate = to;
sender.delegate = to;
Voter delegate = voters[to];
Voter delegate = voters[to];
if (delegate.voted)
if (delegate.voted) {
// If the delegate already voted,
// directly add to the number of votes
proposals[delegate.vote].voteCount += sender.weight;
proposals[delegate.vote].voteCount += sender.weight;
else
} else {
// If the delegate did not vote yet,
// add to her weight.
delegate.weight += sender.weight;
delegate.weight += sender.weight;
}
}
}
/// Give a single vote to proposal $(proposal).
/// Give your vote (including votes delegated to you)
function vote(uint8 proposal) {
/// to proposal `proposals[proposal].name`.
function vote(uint proposal) {
Voter sender = voters[msg.sender];
Voter sender = voters[msg.sender];
if (sender.voted || proposal >= proposals.length) return;
if (sender.voted)
throw;
sender.voted = true;
sender.voted = true;
sender.vote = proposal;
sender.vote = proposal;
// If `proposal` is out of the range of the array,
// this will throw automatically and revert all
// changes.
proposals[proposal].voteCount += sender.weight;
proposals[proposal].voteCount += sender.weight;
}
}
function winningProposal() constant returns (uint8 winningProposal) {
/// @dev Computes the winning proposal taking all
uint256 winningVoteCount = 0;
/// previous votes into account.
for (uint8 proposal = 0; proposal < proposals.length; proposal++)
function winningProposal() constant
if (proposals[proposal].voteCount > winningVoteCount) {
returns (uint winningProposal)
winningVoteCount = proposals[proposal].voteCount;
{
winningProposal = proposal;
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal = p;
}
}
}
}
// Calls winningProposal() function to get the index
// of the winner contained in the proposals array and then
// returns the name of the winner
function winnerName() constant
returns (bytes32 winnerName)
{
winnerName = proposals[winningProposal()].name;
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment