第3课

Впровадження підрахунку голосів та оголошення результатів

У цьому уроці ми запровадимо останні частини нашої децентралізованої системи голосування: підрахунок голосів та оголошення результатів. Це включатиме востаннє розширення нашого контракту з виборцем і створення функцій для розрахунку переможної пропозиції.

Розширення контракту з виборцем

Почнемо з додавання функції winningProposal до нашого контракту. Ця функція перегляне всі пропозиції та поверне ту, яка набрала найбільше голосів. Крім того, ми створимо функцію winnerName для повернення назви переможної пропозиції. Ось остаточний варіант нашого контракту:

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

 контракт Виборець { 
 struct Особа {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] публічні пропозиції; 
 відображення (адреса => особа) публічних виборців; 

 функція 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 повертає (uint winningProposal_) { 
 uint winningVoteCount = 0; 
 для (uint p = 0; p < offers.length; p++) { 
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    функція winnerName() загальнодоступний перегляд повертає (пам’ять рядка winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Розуміння Кодексу

Пояснимо нові доповнення:

  1. Функція виграшної пропозиції: ця функція переглядає всі пропозиції та знаходить ту, яка має найбільшу кількість голосів. Він повертає індекс цієї пропозиції в масиві proposals . Це функція view , тобто вона не змінює стан контракту, а лише читає дані.

  2. Функція імені переможця: ця функція викликає функцію winningProposal , щоб отримати індекс переможної пропозиції, а потім повертає назву цієї пропозиції.

Компіляція та тестування

Складіть свій договір, натиснувши піктограму компілятора Solidity на лівій бічній панелі, а потім натиснувши кнопку «Компілювати».

Розгорніть свій контракт на вкладці «Deploy & Run Transactions» і взаємодійте з ним. Зареєструйте виборців, додайте кілька пропозицій, віддайте свої голоси та, нарешті, визначте переможця.

Як це зробити:

  1. Розгортання: спочатку клацніть вкладку «Deploy & Run Transactions» у Remix IDE. Це той, що знаходиться під піктограмою компілятора Solidity. Переконайтеся, що ви перебуваєте в середовищі «JavaScript VM». Потім натисніть кнопку «Розгорнути».
  2. Реєстрація виборців: після розгортання контракту ви побачите його в розділі «Розгорнуті контракти». Натисніть стрілку, щоб розгорнути її. Там ви знайдете всі функції нашого контракту.
  3. Щоб зареєструвати виборців, знайдіть функцію registerVoter. Оскільки ми запрограмували наш контракт на реєстрацію облікового запису, який викликає цю функцію, як голосуючого, ви можете змінити обліковий запис у спадному списку «Обліковий запис» на вкладці «Розгортання та виконання транзакцій». Вибравши обліковий запис, натисніть функцію registerVoter. Повторіть цей крок для кожного облікового запису, який ви хочете зареєструвати як виборця.
  4. Додавання пропозицій: щоб додати пропозиції, знайдіть функцію addProposal. Введіть назву пропозиції у поле введення поруч із функцією та натисніть функцію. Повторіть цей крок для кожної пропозиції, яку ви хочете додати.
  5. Голосування: щоб проголосувати, перейдіть до облікового запису виборця та знайдіть функцію голосування. Введіть індекс пропозиції (порядок, у якому ви її додали, починаючи з 0), за яку ви хочете проголосувати, у поле введення поруч із функцією та натисніть функцію. Повторіть цей крок для кожного виборця.
  6. Перевірка переможця: після того, як усі учасники голосування віддадуть свої голоси, ви можете перевірити переможця. Знайдіть функцію winnerName і натисніть її. Назва переможної пропозиції відображатиметься на консолі внизу екрана.
  7. Пам’ятайте, що всі дії в блокчейні (включаючи тестові в Remix) є транзакціями. Ви можете розгорнути деталі транзакції на консолі, щоб побачити більше інформації, як-от вартість трансакції та дані. Рекомендується перевірити цю інформацію, щоб краще зрозуміти, як ваш контракт взаємодіє з блокчейном.

У наступному уроці ми обговоримо взаємодію контрактів і журналювання подій. Ми дізнаємося, як контракти можуть взаємодіяти один з одним і як реєструвати та контролювати діяльність у блокчейні. Вітаємо зі створенням вашої першої децентралізованої системи голосування на Ethereum!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第3课

Впровадження підрахунку голосів та оголошення результатів

У цьому уроці ми запровадимо останні частини нашої децентралізованої системи голосування: підрахунок голосів та оголошення результатів. Це включатиме востаннє розширення нашого контракту з виборцем і створення функцій для розрахунку переможної пропозиції.

Розширення контракту з виборцем

Почнемо з додавання функції winningProposal до нашого контракту. Ця функція перегляне всі пропозиції та поверне ту, яка набрала найбільше голосів. Крім того, ми створимо функцію winnerName для повернення назви переможної пропозиції. Ось остаточний варіант нашого контракту:

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

 контракт Виборець { 
 struct Особа {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] публічні пропозиції; 
 відображення (адреса => особа) публічних виборців; 

 функція 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 повертає (uint winningProposal_) { 
 uint winningVoteCount = 0; 
 для (uint p = 0; p < offers.length; p++) { 
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    функція winnerName() загальнодоступний перегляд повертає (пам’ять рядка winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Розуміння Кодексу

Пояснимо нові доповнення:

  1. Функція виграшної пропозиції: ця функція переглядає всі пропозиції та знаходить ту, яка має найбільшу кількість голосів. Він повертає індекс цієї пропозиції в масиві proposals . Це функція view , тобто вона не змінює стан контракту, а лише читає дані.

  2. Функція імені переможця: ця функція викликає функцію winningProposal , щоб отримати індекс переможної пропозиції, а потім повертає назву цієї пропозиції.

Компіляція та тестування

Складіть свій договір, натиснувши піктограму компілятора Solidity на лівій бічній панелі, а потім натиснувши кнопку «Компілювати».

Розгорніть свій контракт на вкладці «Deploy & Run Transactions» і взаємодійте з ним. Зареєструйте виборців, додайте кілька пропозицій, віддайте свої голоси та, нарешті, визначте переможця.

Як це зробити:

  1. Розгортання: спочатку клацніть вкладку «Deploy & Run Transactions» у Remix IDE. Це той, що знаходиться під піктограмою компілятора Solidity. Переконайтеся, що ви перебуваєте в середовищі «JavaScript VM». Потім натисніть кнопку «Розгорнути».
  2. Реєстрація виборців: після розгортання контракту ви побачите його в розділі «Розгорнуті контракти». Натисніть стрілку, щоб розгорнути її. Там ви знайдете всі функції нашого контракту.
  3. Щоб зареєструвати виборців, знайдіть функцію registerVoter. Оскільки ми запрограмували наш контракт на реєстрацію облікового запису, який викликає цю функцію, як голосуючого, ви можете змінити обліковий запис у спадному списку «Обліковий запис» на вкладці «Розгортання та виконання транзакцій». Вибравши обліковий запис, натисніть функцію registerVoter. Повторіть цей крок для кожного облікового запису, який ви хочете зареєструвати як виборця.
  4. Додавання пропозицій: щоб додати пропозиції, знайдіть функцію addProposal. Введіть назву пропозиції у поле введення поруч із функцією та натисніть функцію. Повторіть цей крок для кожної пропозиції, яку ви хочете додати.
  5. Голосування: щоб проголосувати, перейдіть до облікового запису виборця та знайдіть функцію голосування. Введіть індекс пропозиції (порядок, у якому ви її додали, починаючи з 0), за яку ви хочете проголосувати, у поле введення поруч із функцією та натисніть функцію. Повторіть цей крок для кожного виборця.
  6. Перевірка переможця: після того, як усі учасники голосування віддадуть свої голоси, ви можете перевірити переможця. Знайдіть функцію winnerName і натисніть її. Назва переможної пропозиції відображатиметься на консолі внизу екрана.
  7. Пам’ятайте, що всі дії в блокчейні (включаючи тестові в Remix) є транзакціями. Ви можете розгорнути деталі транзакції на консолі, щоб побачити більше інформації, як-от вартість трансакції та дані. Рекомендується перевірити цю інформацію, щоб краще зрозуміти, як ваш контракт взаємодіє з блокчейном.

У наступному уроці ми обговоримо взаємодію контрактів і журналювання подій. Ми дізнаємося, як контракти можуть взаємодіяти один з одним і як реєструвати та контролювати діяльність у блокчейні. Вітаємо зі створенням вашої першої децентралізованої системи голосування на Ethereum!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。