第2课

Здійснення реєстрації виборців та голосування

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

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

Ми додамо систему пропозицій і можливість голосувати зареєстрованим виборцям. Для цього нам знадобиться масив для зберігання пропозицій і нова функція для голосування.

У договір Voter додайте такі рядки коду:

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;
    }

    функція addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    функція 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; 
    }
}

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

Давайте розберемо новий код:

  1. Структура пропозиції: ми додали нову структуру, Proposal, яка містить назву пропозиції та кількість голосів, які вона отримала.

  2. Масив пропозицій: Масив proposals містить усі пропозиції в системі голосування.

  3. Функція Add Proposal: функція addProposal дозволяє нам додавати нову пропозицію до масиву proposals . Назва пропозиції передається як параметр, а підрахунок голосів спочатку обнулюється.

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

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

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

Щоб протестувати свій контракт, перейдіть на вкладку «Deploy & Run Transactions» (ту, що знаходиться під піктограмою компілятора Solidity) і натисніть кнопку «Deploy». Після розгортання контракту ви можете взаємодіяти з ним, викликаючи його функції з цієї вкладки. Спробуйте зареєструвати виборця, додати пропозицію та проголосувати, щоб побачити, як це працює.

На наступному уроці ми запровадимо функціональність для підрахунку голосів і оголошення результатів процесу голосування. До того часу сміливо досліджуйте та експериментуйте з контрактом. Solidity пропонує багато інших функцій, які можуть зробити ваш контракт більш надійним і безпечним. Щасливого кодування!

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

Здійснення реєстрації виборців та голосування

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

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

Ми додамо систему пропозицій і можливість голосувати зареєстрованим виборцям. Для цього нам знадобиться масив для зберігання пропозицій і нова функція для голосування.

У договір Voter додайте такі рядки коду:

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;
    }

    функція addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    функція 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; 
    }
}

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

Давайте розберемо новий код:

  1. Структура пропозиції: ми додали нову структуру, Proposal, яка містить назву пропозиції та кількість голосів, які вона отримала.

  2. Масив пропозицій: Масив proposals містить усі пропозиції в системі голосування.

  3. Функція Add Proposal: функція addProposal дозволяє нам додавати нову пропозицію до масиву proposals . Назва пропозиції передається як параметр, а підрахунок голосів спочатку обнулюється.

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

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

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

Щоб протестувати свій контракт, перейдіть на вкладку «Deploy & Run Transactions» (ту, що знаходиться під піктограмою компілятора Solidity) і натисніть кнопку «Deploy». Після розгортання контракту ви можете взаємодіяти з ним, викликаючи його функції з цієї вкладки. Спробуйте зареєструвати виборця, додати пропозицію та проголосувати, щоб побачити, як це працює.

На наступному уроці ми запровадимо функціональність для підрахунку голосів і оголошення результатів процесу голосування. До того часу сміливо досліджуйте та експериментуйте з контрактом. Solidity пропонує багато інших функцій, які можуть зробити ваш контракт більш надійним і безпечним. Щасливого кодування!

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