5 - Votons !
contract Democracy {
    uint public votingTimeInMinutes ;
    
    // Propriétaire du contrat
    address public owner;
    // Les membres (tableau adresse / appartenance aux votants)
    mapping (address => bool) public members;
    // Liste des propositions
    Proposal[] proposals;
    // Definition de l'objet proposal
    struct Proposal {
        string description;
        mapping (address => bool) voted;
        bool[] votes;
        uint end;
        bool adopted;
    }
    // Auth propriétaire uniquement
    modifier ownerOnly(){
        if (msg.sender != owner) throw;
        _
    }
   // Auth membre uniquement
   modifier memberOnly(){
        if (!members[msg.sender]) throw;
        _
    }
   // Si la proposition correspondant à cet index n'est pas ouverte au vote, la fonction n'est pas exécutée
    modifier isOpen(uint index) {
        if(now > proposals[index].end) throw;
        _
    }
    
    // Si la proposition correspondant à cet index est fermée au vote, la fonction est exécutée
    modifier isClosed(uint index) {
        if(now < proposals[index].end) throw;
        _
    }
    
    // Si le compte (msg.sender) a déjà vôté pour cette proposition, la fonction n'est pas exécutée
    modifier didNotVoteYet(uint index) {
        if(proposals[index].voted[msg.sender]) throw;
        _
    }
    // Constructeur
    function Democracy() {
        owner = msg.sender;
        setVotingTime(votingTime);
    }
     // Fonction de modification du temps
    function setVotingTime(uint newVotingTime) ownerOnly() {
        votingTimeInMinutes = newVotingTime;
    }
    // Ajout des membres
    function addMember(address newMember) ownerOnly() {
        members[newMember] = true;
    }
    // Ajouter une proposition
    function addProposal(string description) memberOnly() {
        uint proposalID = proposals.length++;
       
        Proposal p = proposals[proposalID];
        
        // Donner la description
        p.description = description;
        
        // Donner le moment de fin de vote
        p.end = now + votingTimeInMinutes * 1 minutes;
    }
    // Voter pour une proposition
    function vote(uint index, bool vote) memberOnly() isOpen(index) didNotVoteYet(index) {
        proposals[index].votes.push(vote);
        proposals[index].voted[msg.sender] = true;
    }
    // Obtenir le résultat d'un vote
    function executeProposal(uint index) isClosed(index) {
        uint yes;
        uint no;
        bool[] votes = proposals[index].votes;
        // On compte les pour et les contre
        for(uint counter = 0; counter < votes.length; counter++) {
            if(votes[counter]) {
                yes++;
            } else {
                no++;
            }
        }
        if(yes > no) {
           proposals[index].adopted = true; 
        }
    }
 
}
Les conditions isOpen et isClosed vont vérifier que la date de fin de vote de la proposition index est passée ou non. Selon le cas, on pourra faire un nouveau vote via la fonction vote() ou obtenir le résultat de la proposition via la fonction executeProposal()
La condition didNotVoteYet va vérifier que le compte souhaitant voter ne l’a pas déjà fait.
fonction vote()
function vote(uint index, bool vote) memberOnly() isOpen(index) didNotVoteYet(index) {
        proposals[index].votes.push(vote);
        proposals[index].voted[msg.sender] = true;
    }
push permet  d’ajouter le vote (booléen) à la liste des votes de l’objet proposal (trouvé à la position index dans la liste des propositions)
On va ensuite modifier la variable voted associée au votant en true (cette variable ayant été mise par défaut à false)
fonction executeProposal()
// Obtenir le résultat d'un vote
    function executeProposal(uint index) isClosed(index) {
        uint yes;
        uint no;
        bool[] votes = proposals[index].votes;
        // On compte les pour et les contre
        for(uint counter = 0; counter < votes.length; counter++) {
            if(votes[counter]) {
                yes++;
            } else {
                no++;
            }
        }
        if(yes > no) {
           proposals[index].adopted = true; 
        }
    }
Cette fonction ne peut être exécutée que si la proposition (trouvée à index) est terminée. On va tout simplement parcourir le tableau des votes de la proposition et compter combien de votes oui et votes non ont été faits.
Si il y a plus de votes oui que de votes non, la fonction va retourner un résultat positif (booléen true), sinon rien.
Suite
Avec ce code nous en avons donc finit avec notre contrat. Maintenant il serait agréable de pouvoir faire une application permettant de voter en utilisant ce contrat. vous pouvez voir cela dans la partie 2 :