Easiest Blockchain~超簡単 大学生に向けたブロックチェーン技術の勉強ブログ~

ブロックチェーン技術の勉強のために学んだことをシェアしていきます。ブロックチェーン技術の基礎から応用まで幅広く勉強していきます。

超簡易 ブロックチェーン(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の使い方や、その他ブロックチェーン記事を引き続き書いていきます!
最後までお付き合いいただきありがとうございます!
今後も引き続きよろしくお願いします!