超簡易 ブロックチェーン(Ethereum)上での匿名投票プログラム解説 ”Easiest voting app with blockchain”Part5
前回までにEthereumを利用した匿名投票プログラムをコーディング、ブロックチェーンへデプロイをしてきました。
今回は前回のデプロイ編の続きになります。
↓前回の記事
www.miyatech-univ.com
投票プログラムをブロックチェーンにのせる行程に関しては前回で完了しました。せっかくプログラムを作ったので使ってみたいですよね!
というか動作確認を行っていませんのでそこも併せて確認していきましょう。
今までの記事通りにやったがエラーが出てきた。という方は共有したいのでコメントしていただけると助かります。
それではNodejsのコンソール内でコントラクトを動かしてみましょう!
5:コントラクト実行
※1、前回同様cdコマンドでvoting_appフォルダに移動してから、さらに別ウィンドウのシェルでganache-cliを起動してから行ってください。
※2、前回の記事と続いています、Part2で書いたコードPart3でコンパイルしてからPart4でデプロイした後にこの記事を読んでください。
>contractInstance.totalVotesFor.call("Taro") BigNumber { s: 1, e: 0, c: [ 0 ] }
前回指定したcontractInstanceからコントラクト内のtotalVotesForを呼び出して。Taroの数値を確認します。
c[0]となっているのが確認できます。
まだ誰からも投票を受けてないので総数が0となっています。
では投票してみましょう。
> contractInstance.voteForCandidate("Taro", {from: web3.eth.accounts[0]}) '0xb6aa941a9958f0b50407caa6f62ada684d74f09d0b7a38f06983a7b38bcf1a91'
ganacheで生成されたテストアカウントのインデックス番号0のアカウントからTaroに投票を行いました。
その下にすぐにhashが表示されます。
これがこのトランザクション(コントラクト実行)のhash値(トランザクションid)になります。
Ethereumではトランザクションが実行されるごとにこのハッシュ値が生成されます。
この値が各トランザクションの証拠となります。この値はイミュータブル(変更不可)です。
ここで一度ganache-cliのウィンドウを見てみましょう。
eth_accounts eth_sendTransaction Transaction: 0xb6aa941a9958f0b50407caa6f62ada684d74f09d0b7a38f06983a7b38bcf1a91 Gas usage: 43411 Block Number: 2 Block Time: Wed May 30 2018 20:48:44 GMT+0900 (東京 (標準時))
どうでしょう、トランザクションidが一致していますよね。
そして使用されたgas、取り込まれたブロックの番号、時間が表示されます。
一番最初のトランザクションなのにBlock Numberが2になっていますね。
これは前回のデプロイした際
deployedContract = VotingContract.new(["Taro","Kenji","Naoko"],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000})
ここでブロックチェーンにデプロイし、コントラクトがブロック1に取り込まれたためです。
では続いて投票してみましょう
> contractInstance.voteForCandidate("Taro", {from: web3.eth.accounts[0]}) '0x1cf83e75f545bbea6904148ffffb28da66bf3dc52225dbf65e280fc6bef2de45' > contractInstance.voteForCandidate("Naoko", {from: web3.eth.accounts[0]}) '0x2a5160dca86a79564d2db06b8c1fd1ead3b8b438449b23050ce1ac4377ef1027'
最後に投票されたか得票数を確認してみましょう。
> contractInstance.totalVotesFor.call("Taro").toString() '2' > contractInstance.totalVotesFor.call("Naoko").toString() '1' > contractInstance.totalVotesFor.call("Kenji").toString() '0'
総数が投票した数だけ変わりましたね。
以上がコントラクトを実際に動かして、投票を行う流れです。
一通り試してみてEthereumの理解が深まったと思います。
※シェル上でコントラクトを動かすのは実用的ではないため次回は参考元サイトのソースをお借りして、html上で投票を行う方法を紹介したいと思います。
今後はSolidityの使い方や、その他ブロックチェーン記事を引き続き書いていきます!
最後までお付き合いいただきありがとうございます!
今後も引き続きよろしくお願いします!