まず、コントラクトに関数を追加し winningProposal
ましょう。 この関数は、すべての提案を反復処理し、最も多くの票を獲得した提案を返します。 さらに、落札されたプロポーザルの名前を返す関数 winnerName
を作成します。 これが契約の最終版です。
硬度
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;
}
function winningProposal() public view returns (uint winningProposal_) {
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
function winnerName() public view returns (string memory winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
新しい追加機能について説明しましょう。
Winning Proposal 関数: この関数は、すべての提案を反復処理し、投票数が最も多い提案を見つけます。 この提案のインデックスを proposals
配列に返します。 view
これは関数であり、コントラクトの状態を変更せず、データを読み取るだけです。
勝者名関数: この関数は、関数を winningProposal
呼び出して勝者の提案のインデックスを取得し、この提案の名前を返します。
左サイドバーのSolidityコンパイラーアイコンをクリックし、「Compile」ボタンをクリックして、コントラクトをコンパイルします。
「Deploy & Run Transactions」タブでコントラクトをデプロイし、コントラクトを操作します。 何人かの有権者を登録し、いくつかの提案を追加し、投票し、最後に勝者を確認します。
次のレッスンでは、コントラクトの相互作用とイベント ログについて説明します。 コントラクトが互いにどのように相互作用するか、ブロックチェーン上のアクティビティを記録および監視する方法を学びます。 イーサリアムで初の分散型投票システムを構築した皆さん、おめでとうございます!
まず、コントラクトに関数を追加し winningProposal
ましょう。 この関数は、すべての提案を反復処理し、最も多くの票を獲得した提案を返します。 さらに、落札されたプロポーザルの名前を返す関数 winnerName
を作成します。 これが契約の最終版です。
硬度
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;
}
function winningProposal() public view returns (uint winningProposal_) {
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
function winnerName() public view returns (string memory winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
新しい追加機能について説明しましょう。
Winning Proposal 関数: この関数は、すべての提案を反復処理し、投票数が最も多い提案を見つけます。 この提案のインデックスを proposals
配列に返します。 view
これは関数であり、コントラクトの状態を変更せず、データを読み取るだけです。
勝者名関数: この関数は、関数を winningProposal
呼び出して勝者の提案のインデックスを取得し、この提案の名前を返します。
左サイドバーのSolidityコンパイラーアイコンをクリックし、「Compile」ボタンをクリックして、コントラクトをコンパイルします。
「Deploy & Run Transactions」タブでコントラクトをデプロイし、コントラクトを操作します。 何人かの有権者を登録し、いくつかの提案を追加し、投票し、最後に勝者を確認します。
次のレッスンでは、コントラクトの相互作用とイベント ログについて説明します。 コントラクトが互いにどのように相互作用するか、ブロックチェーン上のアクティビティを記録および監視する方法を学びます。 イーサリアムで初の分散型投票システムを構築した皆さん、おめでとうございます!