Easiest Blockchain~簡単 ブロックチェーン・Cloudの勉強ブログ~

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

超簡易 ブロックチェーン(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をつかってコンパイルして、ついにブロックチェーン上にデプロイしていきます!最後までお付き合いいただきありがとうございました!
ご質問がありましたら、コメントにお願いします!