Pelajaran 3

開票と結果発表の実施

このレッスンでは、分散型投票システムの最後の部分である投票の集計と結果の発表を実装します。 これには、最後にもう一度投票者契約を拡張し、勝者の提案を計算する関数を作成することが含まれます。

有権者契約の拡大

まず、コントラクトに関数を追加し 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;
    }
}

コードの理解

新しい追加機能について説明しましょう。

  1. Winning Proposal 関数: この関数は、すべての提案を反復処理し、投票数が最も多い提案を見つけます。 この提案のインデックスを proposals 配列に返します。 viewこれは関数であり、コントラクトの状態を変更せず、データを読み取るだけです。

  2. 勝者名関数: この関数は、関数を winningProposal 呼び出して勝者の提案のインデックスを取得し、この提案の名前を返します。

コンパイルとテスト

左サイドバーのSolidityコンパイラーアイコンをクリックし、「Compile」ボタンをクリックして、コントラクトをコンパイルします。

「Deploy & Run Transactions」タブでコントラクトをデプロイし、コントラクトを操作します。 何人かの有権者を登録し、いくつかの提案を追加し、投票し、最後に勝者を確認します。

それを行う方法:

  1. デプロイメント: まず、Remix IDE の "Deploy & Run Transactions" タブをクリックします。 これは、Solidityコンパイラアイコンの下にあるものです。 "JavaScript VM" 環境にいることを確認します。 次に、「デプロイ」ボタンをクリックします。
  2. 投票者の登録: コントラクトがデプロイされると、「デプロイされたコントラクト」セクションに表示されます。 矢印をクリックして展開します。 そこには、契約のすべての機能がリストされています。
  3. 投票者を登録するには、registerVoter 関数を見つけます。 この関数を呼び出すアカウントを投票者として登録するようにコントラクトをプログラムしたので、「Deploy & Run Transactions」タブの「Account」ドロップダウンでアカウントを切り替えることができます。 アカウントを選択したら、registerVoter 関数をクリックします。 有権者として登録するアカウントごとに、この手順を繰り返します。
  4. プロポーザルの追加: プロポーザルを追加するには、addProposal 関数を見つけます。 関数の横にある入力ボックスに提案名を入力し、関数をクリックします。 追加するプロポーザルごとにこの手順を繰り返します。
  5. 投票: 投票するには、有権者アカウントに切り替えて、投票機能を見つけます。 投票するプロポーザルのインデックス(0から始まる追加した順序)を関数の横にある入力ボックスに入力し、関数をクリックします。 投票者ごとにこの手順を繰り返します。
  6. 勝者の確認: すべての投票者が投票した後、勝者を確認できます。 winnerName 関数を見つけてクリックします。 落札されたプロポーザルの名前は、画面下部のコンソールに表示されます。
  7. ブロックチェーン内のすべてのアクション(Remixのテストアクションを含む)はトランザクションであることを忘れないでください。 コンソールでトランザクションの詳細を展開すると、トランザクションコストやデータなどの詳細情報を表示できます。 この情報を確認して、コントラクトがブロックチェーンとどのように相互作用しているかをよりよく理解することをお勧めします。

次のレッスンでは、コントラクトの相互作用とイベント ログについて説明します。 コントラクトが互いにどのように相互作用するか、ブロックチェーン上のアクティビティを記録および監視する方法を学びます。 イーサリアムで初の分散型投票システムを構築した皆さん、おめでとうございます!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 3

開票と結果発表の実施

このレッスンでは、分散型投票システムの最後の部分である投票の集計と結果の発表を実装します。 これには、最後にもう一度投票者契約を拡張し、勝者の提案を計算する関数を作成することが含まれます。

有権者契約の拡大

まず、コントラクトに関数を追加し 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;
    }
}

コードの理解

新しい追加機能について説明しましょう。

  1. Winning Proposal 関数: この関数は、すべての提案を反復処理し、投票数が最も多い提案を見つけます。 この提案のインデックスを proposals 配列に返します。 viewこれは関数であり、コントラクトの状態を変更せず、データを読み取るだけです。

  2. 勝者名関数: この関数は、関数を winningProposal 呼び出して勝者の提案のインデックスを取得し、この提案の名前を返します。

コンパイルとテスト

左サイドバーのSolidityコンパイラーアイコンをクリックし、「Compile」ボタンをクリックして、コントラクトをコンパイルします。

「Deploy & Run Transactions」タブでコントラクトをデプロイし、コントラクトを操作します。 何人かの有権者を登録し、いくつかの提案を追加し、投票し、最後に勝者を確認します。

それを行う方法:

  1. デプロイメント: まず、Remix IDE の "Deploy & Run Transactions" タブをクリックします。 これは、Solidityコンパイラアイコンの下にあるものです。 "JavaScript VM" 環境にいることを確認します。 次に、「デプロイ」ボタンをクリックします。
  2. 投票者の登録: コントラクトがデプロイされると、「デプロイされたコントラクト」セクションに表示されます。 矢印をクリックして展開します。 そこには、契約のすべての機能がリストされています。
  3. 投票者を登録するには、registerVoter 関数を見つけます。 この関数を呼び出すアカウントを投票者として登録するようにコントラクトをプログラムしたので、「Deploy & Run Transactions」タブの「Account」ドロップダウンでアカウントを切り替えることができます。 アカウントを選択したら、registerVoter 関数をクリックします。 有権者として登録するアカウントごとに、この手順を繰り返します。
  4. プロポーザルの追加: プロポーザルを追加するには、addProposal 関数を見つけます。 関数の横にある入力ボックスに提案名を入力し、関数をクリックします。 追加するプロポーザルごとにこの手順を繰り返します。
  5. 投票: 投票するには、有権者アカウントに切り替えて、投票機能を見つけます。 投票するプロポーザルのインデックス(0から始まる追加した順序)を関数の横にある入力ボックスに入力し、関数をクリックします。 投票者ごとにこの手順を繰り返します。
  6. 勝者の確認: すべての投票者が投票した後、勝者を確認できます。 winnerName 関数を見つけてクリックします。 落札されたプロポーザルの名前は、画面下部のコンソールに表示されます。
  7. ブロックチェーン内のすべてのアクション(Remixのテストアクションを含む)はトランザクションであることを忘れないでください。 コンソールでトランザクションの詳細を展開すると、トランザクションコストやデータなどの詳細情報を表示できます。 この情報を確認して、コントラクトがブロックチェーンとどのように相互作用しているかをよりよく理解することをお勧めします。

次のレッスンでは、コントラクトの相互作用とイベント ログについて説明します。 コントラクトが互いにどのように相互作用するか、ブロックチェーン上のアクティビティを記録および監視する方法を学びます。 イーサリアムで初の分散型投票システムを構築した皆さん、おめでとうございます!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.