レッスン2

有権者登録と投票の実施

このレッスンでは、有権者登録と投票の機能を実装することにより、分散型投票システムの開発を続けます。 まず、Voter コントラクトを拡張し、次に Solidity のマッピングと配列の詳細を掘り下げます。

有権者契約の拡大

提案制度と登録有権者が投票できるオプションを追加します。 このためには、提案を格納するための配列と、投票用の新しい関数が必要です。

コントラクトに Voter 、次のコード行を追加します。

硬度
SPDX-ライセンス識別子: GPL-3.0
プラグマの堅実さ >=0.7.0 <0.9.0;

契約有権者 {
    struct Person {
        bool voted;  
        uint vote;   
    }

struct プロポーザル {
        string name;   
        uint voteCount; 
    }

プロポーザル[] 公開プロポーザル;
    mapping(address => Person) 一般投票者;

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

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

function vote(uint _proposal) 公開 { 
     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. 提案関数の追加: この addProposal 関数を使用すると、配列に proposals 新しい提案を追加できます。 プロポーザル名はパラメーターとして渡され、投票数は最初は 0 に設定されます。

  4. 投票機能: 登録 vote 有権者が投票できる機能です。 プロポーザルのインデックスをパラメーターとして受け取り、プロポーザルの投票数を 1 つ増やします。 また、投票者がすでに投票しているかどうかを確認し、投票者のステータスを更新します。

コンパイルとテスト

コントラクトにさらに機能を追加したので、次はそれをコンパイルしてテストします。 Remix IDEで、左側のサイドバーにあるSolidityコンパイラアイコンをクリックし、「コンパイル」ボタンをクリックします。

コントラクトをテストするには、"Deploy & Run Transactions" タブ (Solidity コンパイラーアイコンの下) に移動し、「Deploy」ボタンをクリックします。 コントラクトがデプロイされたら、このタブからその関数を呼び出すことで、コントラクトを操作できます。 有権者を登録し、提案を追加し、投票して、それがどのように機能するかを確認してください。

次のレッスンでは、投票を集計し、投票プロセスの結果を通知する機能を実装します。 それまでは、コントラクトを自由に調べて実験してください。 Solidityは、契約をより堅牢で安全なものにするために、さらに多くの機能を提供しています。 ハッピーコーディング!

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
カタログ
レッスン2

有権者登録と投票の実施

このレッスンでは、有権者登録と投票の機能を実装することにより、分散型投票システムの開発を続けます。 まず、Voter コントラクトを拡張し、次に Solidity のマッピングと配列の詳細を掘り下げます。

有権者契約の拡大

提案制度と登録有権者が投票できるオプションを追加します。 このためには、提案を格納するための配列と、投票用の新しい関数が必要です。

コントラクトに Voter 、次のコード行を追加します。

硬度
SPDX-ライセンス識別子: GPL-3.0
プラグマの堅実さ >=0.7.0 <0.9.0;

契約有権者 {
    struct Person {
        bool voted;  
        uint vote;   
    }

struct プロポーザル {
        string name;   
        uint voteCount; 
    }

プロポーザル[] 公開プロポーザル;
    mapping(address => Person) 一般投票者;

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

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

function vote(uint _proposal) 公開 { 
     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. 提案関数の追加: この addProposal 関数を使用すると、配列に proposals 新しい提案を追加できます。 プロポーザル名はパラメーターとして渡され、投票数は最初は 0 に設定されます。

  4. 投票機能: 登録 vote 有権者が投票できる機能です。 プロポーザルのインデックスをパラメーターとして受け取り、プロポーザルの投票数を 1 つ増やします。 また、投票者がすでに投票しているかどうかを確認し、投票者のステータスを更新します。

コンパイルとテスト

コントラクトにさらに機能を追加したので、次はそれをコンパイルしてテストします。 Remix IDEで、左側のサイドバーにあるSolidityコンパイラアイコンをクリックし、「コンパイル」ボタンをクリックします。

コントラクトをテストするには、"Deploy & Run Transactions" タブ (Solidity コンパイラーアイコンの下) に移動し、「Deploy」ボタンをクリックします。 コントラクトがデプロイされたら、このタブからその関数を呼び出すことで、コントラクトを操作できます。 有権者を登録し、提案を追加し、投票して、それがどのように機能するかを確認してください。

次のレッスンでは、投票を集計し、投票プロセスの結果を通知する機能を実装します。 それまでは、コントラクトを自由に調べて実験してください。 Solidityは、契約をより堅牢で安全なものにするために、さらに多くの機能を提供しています。 ハッピーコーディング!

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.