提案制度と登録有権者が投票できるオプションを追加します。 このためには、提案を格納するための配列と、投票用の新しい関数が必要です。
コントラクトに 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;
}
}
新しいコードを分解してみましょう。
プロポーザル構造体: プロポーザルの名前と受け取った投票数を含む新しい構造体 Proposal
を追加しました。
提案配列: 配列には proposals
、投票システム内のすべての提案が保持されます。
提案関数の追加: この addProposal
関数を使用すると、配列に proposals
新しい提案を追加できます。 プロポーザル名はパラメーターとして渡され、投票数は最初は 0 に設定されます。
投票機能: 登録 vote
有権者が投票できる機能です。 プロポーザルのインデックスをパラメーターとして受け取り、プロポーザルの投票数を 1 つ増やします。 また、投票者がすでに投票しているかどうかを確認し、投票者のステータスを更新します。
コントラクトにさらに機能を追加したので、次はそれをコンパイルしてテストします。 Remix IDEで、左側のサイドバーにあるSolidityコンパイラアイコンをクリックし、「コンパイル」ボタンをクリックします。
コントラクトをテストするには、"Deploy & Run Transactions" タブ (Solidity コンパイラーアイコンの下) に移動し、「Deploy」ボタンをクリックします。 コントラクトがデプロイされたら、このタブからその関数を呼び出すことで、コントラクトを操作できます。 有権者を登録し、提案を追加し、投票して、それがどのように機能するかを確認してください。
次のレッスンでは、投票を集計し、投票プロセスの結果を通知する機能を実装します。 それまでは、コントラクトを自由に調べて実験してください。 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;
}
}
新しいコードを分解してみましょう。
プロポーザル構造体: プロポーザルの名前と受け取った投票数を含む新しい構造体 Proposal
を追加しました。
提案配列: 配列には proposals
、投票システム内のすべての提案が保持されます。
提案関数の追加: この addProposal
関数を使用すると、配列に proposals
新しい提案を追加できます。 プロポーザル名はパラメーターとして渡され、投票数は最初は 0 に設定されます。
投票機能: 登録 vote
有権者が投票できる機能です。 プロポーザルのインデックスをパラメーターとして受け取り、プロポーザルの投票数を 1 つ増やします。 また、投票者がすでに投票しているかどうかを確認し、投票者のステータスを更新します。
コントラクトにさらに機能を追加したので、次はそれをコンパイルしてテストします。 Remix IDEで、左側のサイドバーにあるSolidityコンパイラアイコンをクリックし、「コンパイル」ボタンをクリックします。
コントラクトをテストするには、"Deploy & Run Transactions" タブ (Solidity コンパイラーアイコンの下) に移動し、「Deploy」ボタンをクリックします。 コントラクトがデプロイされたら、このタブからその関数を呼び出すことで、コントラクトを操作できます。 有権者を登録し、提案を追加し、投票して、それがどのように機能するかを確認してください。
次のレッスンでは、投票を集計し、投票プロセスの結果を通知する機能を実装します。 それまでは、コントラクトを自由に調べて実験してください。 Solidityは、契約をより堅牢で安全なものにするために、さらに多くの機能を提供しています。 ハッピーコーディング!