超簡易 ブロックチェーン(Ethereum)上での匿名投票プログラム解説 ”Easiest voting app with blockchain”Part3
今回も前回に引き続きブロックチェーンアプリケーション匿名投票Dappsプログラムの解説をしていきます。
その前にモナコインのブロックチェーンへの攻撃が行われました。
簡単に言うと、事前にブロックチェーンをある程度生成しておいて、本丸のブロックチェーンに載せる、そこでコンセンサスにより長いチェーンが採用されるため悪意のあるブロックチェーンのほうが採用されてしまう。これによって取引が改ざんされてしまいました。
このようなことは今後も少なからず起きてしまうと思います。
しかしネガティブな側面をとらえることはとても大事なことですので、今後も注目していきたいと思います。
では本題の投票プログラムの続きに入りましょう。
前回Solidityを使用したコーディングを行いました、今回はコンパイル編です。
3:コンパイル
※事前にcdコマンドでvoting_appフォルダに移動しておきましょう、また別ウインドウでganache-cliを起動しておきましょう。
まず初めにSolidityのコードをコンパイルするためにnpmモジュールのsolcをインストールしましょう。
npm install solc
次にnodeを起動します。node内でweb3、solcライブラリを使用します。
ここではweb3、solcオブジェクトを初期化します。
node >Web3 = require("web3") >web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
今回はlocalhostポート8545を使用します。
※他のサイトや教材でほとんどが8545ポートを利用しています。
次にweb3の初期化+ブロックチェーンとの関連付けの確認のためにethereumアカウントを確認しておきましょう。
>web3.eth.accounts [ '0x4dcd2e673fe1c920c45de581b9347614640575f0', '0x5a209645aac68435603257c74146d5d90fd6169d', '0xd34db156bf746766de85066ce658ccdddf489c4f', '0x40cb7f6830d049981a0e74c3595b6eb3b12a0969', '0x5260f537c3cca4f502f70473b3414f91f3f38c00', '0x425f7db511183848b99143b20d02aecf1358a976', '0x43567eb9c530e7c2c2b50889dc0d4b69ba3b01f3', '0xa47b2f3a661e741e9e0674ca28661a367ba837cf', '0x5136fadac75c2aba4d5d2688aed7ae494ff138ab', '0x6eb4e6ce52de4605d869edbf258f63c16349184e' ]
手順が間違っていなければ上記のようにethのテストアカウントが表示されます。
※テストアカウントはそれぞれ異なります。
最後にコードをString型で読み取ってコンパイルしていきましょう。
>code = fs.readFileSync("Voting.sol").toString() >solc = require("solc") >compiledCode = solc.compile(code)
code変数にはnode.jsのfsを利用しVoting.solをString型で読み取ります。
compiledCodeにコンパイルされたデータをストアします。
これでコンパイルができました。
無事にコンパイルが成功するとダーッとコードが表示されます。
コード内のcontractオブジェクト内に2つ大切な個所があります。
1.[bytecode]
Voting.solをコンパイルしたときにできるソースコードです。
のちにブロックチェーンにデプロイされるのはこのbytecodeです。
2.[interface]
ユーザーになんのメゾッドが利用可能であるかを知らせるテンプレートです。abiとも呼ばれます。コントラクトと関わる際に今後このabi定義が重要となってきます。
ひとまずこれでコンパイルができました。
ブロックチェーンへのデプロイはこのプログラムのメインともいえるので、ブロックチェーンへのデプロイは次回の記事で解説します!
今回も最後までおつきありいただきありがとうございました!
p.s.この記事を書いている際にブラウザがクラッシュして、ほぼ完成した記事が消滅しました。皆さんも気を付けてください。下書き保存やなどをはこまめに!
超簡易 ブロックチェーン(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をつかってコンパイルして、ついにブロックチェーン上にデプロイしていきます!最後までお付き合いいただきありがとうございました!
ご質問がありましたら、コメントにお願いします!
超簡易 ブロックチェーン(Ethereum)上での匿名投票プログラム解説 ”Easiest voting app with blockchain”Part1
今回からは手始めにブロックチェーンアプリケーションの初級編として
匿名投票をブロックチェーン上に載せるプログラムを作っていきます。
今回はPart1ということで導入編です。
参考にしたのはこちらのサイトです↓
medium.com
今回はnpmとnodeを使用し、またweb3.jsを利用して動かしていきます!
仮想ブロックチェーンとして使うものは(ブロックチェーンシミュレーター)ganache-cliです。
※勉強中の学生が勉強中の方に向けて書いている記事ですので、指摘箇所があればコメントしていただけると幸いです。また解釈として簡単な言葉を選ぶようにしています。使用OSはWindows10です。
まずは準備をしていきましょう。
1:環境準備
事前にnpmとnodeをインストールします。
Node.js
にアクセスし、ダウンロードインストールをしてください。
インストールが終わるとnodeそしてnpmもインストールされているはずです。
それでは事前準備ができましたので。
作業に入っていきます。
まずはディレクトリを作成しましょう。
mkdir voting_app cd voting_app
今回はわかりやすいようにvoting_appとしましたが。ご自由に指定してもらって構いません。
mkdir はディレクトリを作成するコマンドです。
cd は指定した場所(フォルダ)へ移動するコマンドです。
次にモジュールをインストールするフォルダを作成します
mkdir node_modules
次にganache-cli、web3.jsをインストールします
npm install ganache-cli web3@0.20.2
インストールが完了したら起動してみましょう
ganache-cli
すると以下のようにずらっと出てきます。
Ganache CLI v6.1.0 (ganache-core: 2.1.0) Available Accounts ================== (0) 0xc867001038388828bede9ed24a50cba7d87d0152 (1) 0x207154aabb5616846e9f9e6b9adce2f8dd4f453a (2) 0x5ce62cf9fb11f8ebb7649e3e7ba0ccbdbda62cc1 (3) 0xe604ad444eb1daa0b2fd8d414fdb9a4841c7d3c3 (4) 0x7e0ae96bce372879dcee28882f469300822f4d5d (5) 0xb91e3e1a564296308124dbbe2a7ca72294b75569 (6) 0x373823574a2bbe1ddd1ae3666a3620391dc6f5e4 (7) 0x935e71ab4e268103556a721579ba2de5852050ed (8) 0x9971dea65beefdcebc4e063027e36ea7c798926d (9) 0xab1aedcb0d9e024cbfdbc4159b0e9bd3ba280e59 Private Keys ================== (0) 0a357266958266835871bd7f111b48e667713f34aec2f172d7ed0aee9f1a6ce4 (1) e251db6254ace222a517cbd040ae71a6538866b4b554c539a268bd6afc78b0e4 (2) 51652d38f1473b3af148bb942f7e5b69000b1f9340644e86c638bbba7b884553 (3) 4354e235331698961d33e3e836fe5b8a7a13f03e555cea688a4f1d53de5d96d5 (4) e3b08a5b0efaafebd0900de9867837d1c7df763d10ceb58368bcf1fb07417a01 (5) c5dded37ea4dbbe28bc062ad5332ef846f37acfa385dbc7ba00053dcdd0ddcc7 (6) 24dc8b017e5e59f8afd300fc3fed32b3fab660b62efb4bfbbbd47ec670ea8359 (7) 385df4314c653262a005311db36c9bc2d4c00def0f2e000f321bdfccc7108ebf (8) c67c45100cef9f89bd95ab5e49fbc53748c7b2575f792459ed50230f5a66f565 (9) 6faee674d7844420fa87ab3fbe13cbe479a07a062b5e33094f46f60161332856 HD Wallet ================== Mnemonic: umbrella cute combine latin donkey pitch peasant luxury reveal another gallery tissueBase HD Path: m/44'/60'/0'/0/{account_index} Listening on localhost:8545
ganache-cliは親切にテスト用アカウントを10個自動生成してくれます。
※起動時毎にアカウントが作成されるため、アドレスは上記とは異なります
無事にインストールできたでしょうか?
次回Part2では実際にコードを記述し、コントラクトを作成していきます!