超簡易 ブロックチェーン(Ethereum)上での匿名投票プログラム解説 ”Easiest voting app with blockchain”Part2
前回導入編では、環境準備としてnpm、web3、ganacheをインストールしました。
この記事を読む前にPart1を読むことをお勧めします。↓
miyatech.hatenablog.com
今回はプログラム作成編です!
実際にプログラミング言語のSolidityを利用して、コードを記述しコントラクトを作成していきます。
SolidityはJavascriptに構文が似ており、非常に勉強しやすい言語でもあります。
Solidityの構文や、解説は別記事で取り上げる予定です!
それでは早速コーディングを行っていきます。
※コードの塊ごとに必要な個所は解説を入れていきます。
2:コントラクト作成
※事前にコードエディタで新規作成をしVoting.solとでも名前を付けてvoting_app下に保存をしてください、そこにコードを記述していきます。私はSublime textを使用しています、
まずはSolidityのバージョンをpragmaで指定していきます。
pragma solidity ^0.4.18;
次にメインのコントラクトを追加します。
内容についてはのちに説明していきます。
contract Voting{ //① mapping(bytes32 => uint8) public votesReceived; bytes32[] public candidateList; //② constructor(bytes32[] candidateNames) public { candidateList = candidateNames; } //③ function totalVotesFor(bytes32 candidate) view public returns (uint8){ require(validCandidate(candidate)); return votesReceived[candidate]; } //④ function voteForCandidate(bytes32 candidate) public { require(validCandidate(candidate)); votesReceived[candidate] += 1; } //⑤ function validCandidate(bytes32 candidate) view public returns (bool) { for(uint i = 0; i < candidateList.length; i++){ if(candidateList[i] == candidate){ return true; } } return false; } }
何となくパット見ただけでも内容がわかると思います。
それではそれぞれ見ていきましょう。
mapping(bytes32 => uint8) public votesReceived; bytes32[] public candidateList;
①.mappingを使用して。キーと値に割り振る型を指定します。
mappingは簡単に言うとPythonでいう辞書みたいなものです。
今回はキーを候補者byte32型、値を投票数uint8型として指定しています。
また立候補者リストをbyte32のArrayで指定します。
constructor(bytes32[] candidateNames) public { candidateList = candidateNames; }
②.立候補者リストに投票者をストアしていきます。このコントラクターはブロックチェーンにデプロイするときに一度だけ呼ばれます。
元サイトではfunction Votingとなっていますが、そのままコンパイルするとエラーになります。
現在ではコントラクトと同じ名前を使う場合はconstructorと指定します。
他の書籍や、サイトを見ているとfunction ”コントラクトと同名”となっていることが多くありますが、エラーが出た場合は確認してみてください。
function totalVotesFor(bytes32 candidate) view public returns (uint8){ require(validCandidate(candidate)); return votesReceived[candidate]; }
③.この関数では、候補者がその時点で受け取った投票総数を戻します。
function voteForCandidate(bytes32 candidate) public { require(validCandidate(candidate)); votesReceived[candidate] += 1; }
④.ここでは投票数をインクリメントします。
インクリメントとは”足す”、 ”+=1”のことです。
function validCandidate(bytes32 candidate) view public returns (bool) { for(uint i = 0; i < candidateList.length; i++){ if(candidateList[i] == candidate){ return true; } } return false; }
⑤.最後に候補者が存在しているか確認してtrue、falseを返します。
candidateList.lengthを使ってArrayのインデックスをインクリメントして確認していきます。
これでコントラクトのコードは完了です。簡単ですよね!
次回はsolcをつかってコンパイルして、ついにブロックチェーン上にデプロイしていきます!最後までお付き合いいただきありがとうございました!
ご質問がありましたら、コメントにお願いします!