Pelajaran 3

Реализация подведения итогов голосования и объявления результатов

В этом уроке мы реализуем заключительные части нашей децентрализованной системы голосования: подсчет голосов и объявление результатов. Для этого необходимо в последний раз расширить наш контракт Voter и создать функции для расчета выигравшего предложения.

Расширение избирательного контракта

Давайте начнем с добавления функции winningProposal в наш контракт. Эта функция выполнит итерацию по всем предложениям и вернет то, которое имеет наибольшее количество голосов. Кроме того, мы создадим функцию winnerName, которая будет возвращать название победившего предложения. Вот окончательный вариант нашего контракта:

Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Voter {
 struct Person {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] public proposals;
 mapping(address => Person) public voters;

 function registerVoter() public {
        voters[msg.sender].voted = false;
    }

    function addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    function vote(uint _proposal) public { 
     require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check 

     Person storage sender = voters[msg.sender]; 
     require(!sender.voted, "Already voted."); 
     sender.voted = true; 
     sender.vote = _proposal; 

     proposals[_proposal].voteCount += 1; 
    }

    function winningProposal() public view returns (uint winningProposal_) {
 uint winningVoteCount = 0;
 for (uint p = 0; p < proposals.length; p++) {
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    function winnerName() public view returns (string memory winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Понимание Кодекса

Давайте объясним новые дополнения:

  1. Функция выигрышного предложения: Эта функция выполняет итерации по всем предложениям и находит то, которое имеет наибольшее количество голосов. Он возвращает индекс данного предложения в массиве предложений. Это функция представления, то есть она не изменяет состояние контракта и только считывает данные.

  2. Функция "Имя победителя": Эта функция вызывает функцию winningProposal, чтобы получить индекс победившего предложения, а затем возвращает название этого предложения.

Компиляция и тестирование

Скомпилируйте Ваш контракт, щелкнув на значке компилятора Solidity на левой боковой панели, а затем нажав на кнопку "Компилировать".

Разверните Ваш контракт на вкладке "Развернуть & Выполнить транзакции" и взаимодействуйте с ним. Зарегистрируйте несколько избирателей, добавьте несколько предложений, проголосуйте и, наконец, проверьте победителя.

Как это сделать:

  1. Развертывание: Сначала перейдите на вкладку "Deploy & Run Transactions" в Remix IDE. Это тот, который находится под пиктограммой компилятора Solidity. Убедитесь, что Вы находитесь в среде "JavaScript VM". Затем щелкните на кнопке "Развернуть".
  2. Регистрация избирателей: Как только контракт будет развернут, Вы увидите его в разделе "Развернутые контракты". Щелкните на стрелке, чтобы развернуть его. Там Вы найдете все функции нашего контракта.
  3. Чтобы зарегистрировать избирателей, найдите функцию registerVoter. Поскольку мы запрограммировали наш контракт на регистрацию учетной записи, вызывающей эту функцию, в качестве избирателя, Вы можете переключить учетные записи в раскрывающемся списке "Учетная запись" на вкладке "Развернуть & Выполнение транзакций". Выбрав учетную запись, щелкните на функции registerVoter. Повторите этот шаг для каждой учетной записи, которую Вы хотите зарегистрировать в качестве избирателя.
  4. Добавление предложений: Чтобы добавить предложения, найдите функцию addProposal. Введите имя предложения в поле ввода рядом с функцией и щелкните на функции. Повторите этот шаг для каждого предложения, которое Вы хотите добавить.
  5. Голосование: Чтобы проголосовать, переключитесь на учетную запись избирателя и найдите функцию голосования. Введите индекс предложения (порядок добавления, начиная с 0), за которое Вы хотите проголосовать, в поле ввода рядом с функцией и щелкните на функции. Повторите этот шаг для каждого избирателя.
  6. Проверка победителя: После того, как все избиратели отдали свои голоса, Вы можете проверить победителя. Найдите функцию winnerName и щелкните на ней. Название выигравшего предложения будет отображено в консоли в нижней части экрана.
  7. Помните, что все действия в блокчейне (включая тестовые в Remix) являются транзакциями. Вы можете развернуть детали транзакции в консоли, чтобы увидеть дополнительную информацию, например, стоимость транзакции и данные. Хорошей практикой является проверка этой информации, чтобы лучше понять, как Ваш контракт взаимодействует с блокчейном.

В следующем уроке мы обсудим взаимодействие с контрактами и регистрацию событий. Мы узнаем, как контракты могут взаимодействовать друг с другом и как регистрировать и отслеживать действия на blockchain. Поздравляем Вас с созданием первой децентрализованной системы голосования на Ethereum!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 3

Реализация подведения итогов голосования и объявления результатов

В этом уроке мы реализуем заключительные части нашей децентрализованной системы голосования: подсчет голосов и объявление результатов. Для этого необходимо в последний раз расширить наш контракт Voter и создать функции для расчета выигравшего предложения.

Расширение избирательного контракта

Давайте начнем с добавления функции winningProposal в наш контракт. Эта функция выполнит итерацию по всем предложениям и вернет то, которое имеет наибольшее количество голосов. Кроме того, мы создадим функцию winnerName, которая будет возвращать название победившего предложения. Вот окончательный вариант нашего контракта:

Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Voter {
 struct Person {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] public proposals;
 mapping(address => Person) public voters;

 function registerVoter() public {
        voters[msg.sender].voted = false;
    }

    function addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    function vote(uint _proposal) public { 
     require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check 

     Person storage sender = voters[msg.sender]; 
     require(!sender.voted, "Already voted."); 
     sender.voted = true; 
     sender.vote = _proposal; 

     proposals[_proposal].voteCount += 1; 
    }

    function winningProposal() public view returns (uint winningProposal_) {
 uint winningVoteCount = 0;
 for (uint p = 0; p < proposals.length; p++) {
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    function winnerName() public view returns (string memory winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Понимание Кодекса

Давайте объясним новые дополнения:

  1. Функция выигрышного предложения: Эта функция выполняет итерации по всем предложениям и находит то, которое имеет наибольшее количество голосов. Он возвращает индекс данного предложения в массиве предложений. Это функция представления, то есть она не изменяет состояние контракта и только считывает данные.

  2. Функция "Имя победителя": Эта функция вызывает функцию winningProposal, чтобы получить индекс победившего предложения, а затем возвращает название этого предложения.

Компиляция и тестирование

Скомпилируйте Ваш контракт, щелкнув на значке компилятора Solidity на левой боковой панели, а затем нажав на кнопку "Компилировать".

Разверните Ваш контракт на вкладке "Развернуть & Выполнить транзакции" и взаимодействуйте с ним. Зарегистрируйте несколько избирателей, добавьте несколько предложений, проголосуйте и, наконец, проверьте победителя.

Как это сделать:

  1. Развертывание: Сначала перейдите на вкладку "Deploy & Run Transactions" в Remix IDE. Это тот, который находится под пиктограммой компилятора Solidity. Убедитесь, что Вы находитесь в среде "JavaScript VM". Затем щелкните на кнопке "Развернуть".
  2. Регистрация избирателей: Как только контракт будет развернут, Вы увидите его в разделе "Развернутые контракты". Щелкните на стрелке, чтобы развернуть его. Там Вы найдете все функции нашего контракта.
  3. Чтобы зарегистрировать избирателей, найдите функцию registerVoter. Поскольку мы запрограммировали наш контракт на регистрацию учетной записи, вызывающей эту функцию, в качестве избирателя, Вы можете переключить учетные записи в раскрывающемся списке "Учетная запись" на вкладке "Развернуть & Выполнение транзакций". Выбрав учетную запись, щелкните на функции registerVoter. Повторите этот шаг для каждой учетной записи, которую Вы хотите зарегистрировать в качестве избирателя.
  4. Добавление предложений: Чтобы добавить предложения, найдите функцию addProposal. Введите имя предложения в поле ввода рядом с функцией и щелкните на функции. Повторите этот шаг для каждого предложения, которое Вы хотите добавить.
  5. Голосование: Чтобы проголосовать, переключитесь на учетную запись избирателя и найдите функцию голосования. Введите индекс предложения (порядок добавления, начиная с 0), за которое Вы хотите проголосовать, в поле ввода рядом с функцией и щелкните на функции. Повторите этот шаг для каждого избирателя.
  6. Проверка победителя: После того, как все избиратели отдали свои голоса, Вы можете проверить победителя. Найдите функцию winnerName и щелкните на ней. Название выигравшего предложения будет отображено в консоли в нижней части экрана.
  7. Помните, что все действия в блокчейне (включая тестовые в Remix) являются транзакциями. Вы можете развернуть детали транзакции в консоли, чтобы увидеть дополнительную информацию, например, стоимость транзакции и данные. Хорошей практикой является проверка этой информации, чтобы лучше понять, как Ваш контракт взаимодействует с блокчейном.

В следующем уроке мы обсудим взаимодействие с контрактами и регистрацию событий. Мы узнаем, как контракты могут взаимодействовать друг с другом и как регистрировать и отслеживать действия на blockchain. Поздравляем Вас с созданием первой децентрализованной системы голосования на Ethereum!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.