たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Dappsアプリ】選挙投票Dappsの作成-その2-

   

この記事は【Dappsアプリ】選挙投票Dappsの作成-その1-のつづきです。

さらにCandidateを増やす



    // add Candidate
    function addCandidate(string _name) private {
        candidatesCount ++;
        candidates[candidatesCount]=Candidate(candidatesCount,_name,0);
    }

addCandidateは外部からアクセスされないようにするために、アクセス修飾子はprivateとします。

これを追記すると、Election.solは下記のようになります。


pragma solidity ^0.4.24;
 
contract Election {
    // Model a CAndidate
    struct Candidate{
        uint id;
        string name;
        uint voteCount;
    }
    // Store candidate
    // Fetch candidatei
    mapping(uint => Candidate) public candidates; // when we add candidate to this mapping we are changing the state of our contract
    // Store candidates Count
    uint public candidatesCount;


    constructor() public{
        addCandidate("Candidate 1");
        addCandidate("Candidate 2");
    }


  // add Candidate
    function addCandidate(string _name) private {
        candidatesCount ++;
        candidates[candidatesCount]=Candidate(candidatesCount,_name,0);
    }




}

ふたたびmigrate



truffle migrate --reset

で一度コンパイルした状態をリセットします
一度migrateして、スマートコントラクトをブロックチェーン上にデプロイし、ブロックチェーン上にtransactionを発行してしまうとトランザクションの変更はできません。ですので、スマートコントラクトのコードに変更があったときには、あらためてスマートコントラクトをブロックチェーン上にデプロイする必要があります。

これは、データベースに例えるならば、いちど作ったテーブルをドロップすることに似ています。

リセットできたら、
それでは、ふたたびconsoleを開いてみましょう。
そして、デプロイされたコントラクトを確認しましょう。



Election.deployed().then(function(i){app=i;})

デプロイされたcandidateの情報を確認しましょう。

いま、Election.solで書いたスマートコントラクトでは、candidates 1とcandidate 2をconstructorで呼び出しているので、それらを参照することが可能です。
(app.candidate()として、すべてのcandidateをいちどに参照したくもなりますが、それはsolidityが与えるこのcandidate()関数ではできません。)

app.candidates(1)とapp.candidates(2)では、たしかにスマートコントラクトのコントラクタで呼び出したは、Candidate 1とCandidate2の情報が得られることがわかります。そして、app.acndidates(99)はどうなるかというと、空欄が返ってくることがわかります。これは、スマートコントラクトで定義していないcandidateを呼び出したためです。いま一体何人の候補者がいるのかを確認するために、app.candidatesCount()を実行します。すると、c[2]となっているので、二名のcandidateがいることが確認できます。なので、この場合は、app.candidates()には、1~2のIDを渡して、candidateの情報を取得可能なことがわかるのです。
Image from Gyazo

candidateをひとりづつ取り出すときには、app.candidates(1).then(function(c){candidate=c})
を実行して、
candidateを実行します。すると、上記で指定したcandidateの情報にアクセスできます。

solidityの構造体は、文法的にやや未熟なところがあり、
candidate.idとしても、構造体の要素であるidにはアクセスができず、ethereumの仮想マシンもそれに気がついていません。

ですので、0始まりの配列番号でcandidateコマンドでアクセスできる情報にアクセスします。

すると、candidateで取得できた情報を個別に取り出すことができます。

candidateのIDはcandidate[0].toNumber()として得られ、candidateの投票数はcandidate[2].toNumber()として得られます。

Image from Gyazo

このようにして、mappingされたcandidateの情報を取得することができます。

つぎにweb3を利用してみましょう。
web3.jsとはEthereumのJavaScript APIのことで、HTTPやIPC(プロセス間通信)を使ってローカルまたはリモートのEthereumノードとやりとり出来るJavaScriptライブラリのことです。くわしくはこちらweb3.js - Ethereum JavaScript API — web3.js 1.0.0 documentationをご覧ください。

web3はethオブジェクトをもっています。
ethオブジェクトも、わたしたちのネットワークに紐づいているアカウントにアクセスが可能です。

ethereumの開発フレームワークであるtruffleコンソールから、web3.eth.accountsと入力しましょう。

Image from Gyazo

すると、gancheで確認できる10個のアカウントと同じものが表示されるでしょう。

これらは配列なので、それぞれのデータにアクセスするには、このようにインデックスをつけて入力すると、各データにアクセスできます。
Image from Gyazo

今回はここまでです。

なお、ブロックチェーンについて本腰を入れて学びたいひとは、Udemyなどにたくさんよいレッスンがあったりします。ぜひUdemyでブロックチェーンと検索してみてください。

ではでは!

 - solidity, BlockChain, プログラミング系