Lição 2

投票人註冊和投票

在本章中,我們將繼續開髮我們的去中心化投票繫統,實現投票人註冊和投票功能。我們將首先對Voter合約進行擴展,然後深入講解Solidity映射和數組。

擴展Voter合約

我們將添加一個提案繫統和一個供已註冊投票人投票的選項。爲此,我們需要一個數組來存儲提案和一個新的函數用於投票。

Voter合約中,添加以下代碼:

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

代碼解析

爲便於理解,我們將對新代碼進行拆分講解:

  1. Proposal結構:我們添加了一個新結構Proposal,包含提案的名稱和它所穫得的票數。

  2. Proposals數組:proposals數組包含投票繫統中的所有提案。

  3. AddProposal函數:addProposal函數允許我們曏proposals數組添加一個新提案。初始投票數設置爲零。

  4. Vote函數:vote函數是使已註冊投票人進行投票的函數。它以提案的索引爲參數,併將提案的票數增加一個。此函數還會檢查投票人是否已經投票併更新投票人的狀態。

編譯和測試

截至目前,我們已曏合約添加了諸多功能,接下來便可以編譯和測試它了。在Remix IDE中,單擊左側邊欄的Solidity編譯器圖標,然後單擊“Compile”按鈕。

要測試合約,請進入“Deploy & Run Transactions”選項卡(Solidity編譯器圖標下方的圖錶)併單擊“Deploy”按鈕。部署完成後,您可以從此選項卡調用其函數來運行它。您還可以通過註冊投票人、添加提案和投票,查看其運行方式。

在下一章中,我們將統計票數併宣布投票結果。在此之前,您可以隨意探索和試用該合約。Solidity提供了很多功能,可以使您的合約更加安全、強大。祝編碼愉快!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.
Catálogo
Lição 2

投票人註冊和投票

在本章中,我們將繼續開髮我們的去中心化投票繫統,實現投票人註冊和投票功能。我們將首先對Voter合約進行擴展,然後深入講解Solidity映射和數組。

擴展Voter合約

我們將添加一個提案繫統和一個供已註冊投票人投票的選項。爲此,我們需要一個數組來存儲提案和一個新的函數用於投票。

Voter合約中,添加以下代碼:

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

代碼解析

爲便於理解,我們將對新代碼進行拆分講解:

  1. Proposal結構:我們添加了一個新結構Proposal,包含提案的名稱和它所穫得的票數。

  2. Proposals數組:proposals數組包含投票繫統中的所有提案。

  3. AddProposal函數:addProposal函數允許我們曏proposals數組添加一個新提案。初始投票數設置爲零。

  4. Vote函數:vote函數是使已註冊投票人進行投票的函數。它以提案的索引爲參數,併將提案的票數增加一個。此函數還會檢查投票人是否已經投票併更新投票人的狀態。

編譯和測試

截至目前,我們已曏合約添加了諸多功能,接下來便可以編譯和測試它了。在Remix IDE中,單擊左側邊欄的Solidity編譯器圖標,然後單擊“Compile”按鈕。

要測試合約,請進入“Deploy & Run Transactions”選項卡(Solidity編譯器圖標下方的圖錶)併單擊“Deploy”按鈕。部署完成後,您可以從此選項卡調用其函數來運行它。您還可以通過註冊投票人、添加提案和投票,查看其運行方式。

在下一章中,我們將統計票數併宣布投票結果。在此之前,您可以隨意探索和試用該合約。Solidity提供了很多功能,可以使您的合約更加安全、強大。祝編碼愉快!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.