Hyperledger composerで投票システムを作ってみた【テスト編】

最近はやりのブロックチェーンを触ってみよう！
ということで、手っ取り早く試せると定評のある「Hyperledger composer」で投票システムを作ってみました。

★★
スクリーンショットを取りながら書くとかなり長くなりそうだったので、
作成編とテスト編の2部構成に分けています。

作成編はこちら　→ https://qiita.com/sh003/items/8add167b71943aff9e73

なお、Hyperledger composer自体の解説は別の方が書かれているのでここでは割愛します

# このサンプルの概要
## やりたかったこと
* 候補者A,B,Cの誰かに投票できるシステム
  * 投票者は任意に追加できる
  * 追加された投票者には投票権(1票)が付与される
  * 投票を行うと、投票された票の所有者がA,B,Cいずれかの有権者に変わる

## 利用したもの
* Hyperledger composer Playground v0.14.0
  * Playground？：Hyperledger composerをWEB UIベースのお試し環境で触ってみれるもの(と認識しています)

## 作成したもの
* model file(.cto)
  * 参加者(participant)、資産(Asset)、トランザクションなどを定義するファイル
* script file(.js)
  * トランザクション処理の内容を記載するファイル。チェーンコードに相当。

以下、テスト手順
--- 

# 参加者(Participant)の生成
## テスト画面を開く

<img width="1440" alt="スクリーンショット 2017-10-17 9.07.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/1312df97-d0bf-4e56-3a9e-479c74881eb7.png">

作成編の最後で実施したUpdate処理後に上部の`Testタブ`を選択するとチェインコードのテスト実行モードになります。
この時点では、参加者も資産も生成されていないので、画面上には`empty`と表示されます。

## 候補者の情報を入力
<img width="1440" alt="スクリーンショット 2017-10-17 9.07.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/06df527e-a803-920b-5be3-22677aa49974.png">

左側のメニューで`Participant > User`を選んだ状態で右上の`+ Create New Participant`を選択すると、新しい参加者を生成する画面になります。
今回は候補者「Aさん」を生成します。
* name：A
* type：候補者(candidate)

> typeを定義していますが、現時点では特に意味はありません。

## 候補者の生成

<img width="1440" alt="スクリーンショット 2017-10-17 9.07.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/60436b9c-dfa9-7973-ed8d-e7960f73ba61.png">

候補者情報を入力後、`Create New`ボタンを押すと、Test画面に生成された候補者の情報が表示されます。

<img width="1440" alt="スクリーンショット 2017-10-17 9.08.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/661c4cea-a02c-7b1b-924e-046279185d13.png">

同様に候補者B,Cも生成します。

# トランザクション実行
## 投票者生成トランザクションの設定

<img width="1440" alt="スクリーンショット 2017-10-17 9.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/5fa8a23b-a0ba-0b62-3cbb-4087cef046c2.png">

画面左側下部`Submit Transaction`ボタンから、投票者を新しく作成するトランザクションの情報を入力します。
* name:testUser001

## 投票者の生成

<img width="1440" alt="スクリーンショット 2017-10-17 9.18.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/4faccfde-3868-e071-d0de-1dbf32e64956.png">

情報入力後、`submit`ボタンを押すとトランザクションが実行されます。
トランザクションの実行と同時に、Asset:Vote(この例では1票に相当)が生成されます。
> 正確には、ユーザ生成のトランザクション(addUser)のチェインコードにAssetを同時生成するように記述しています。

<img width="1440" alt="スクリーンショット 2017-10-17 9.19.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/463bb2c2-9626-da9b-9498-e7c4d70a57f2.png">

投票者生成トランザクション実施後に`Participant > User`を確認すると、testUser001が増えていることを確認できます。

<img width="1440" alt="スクリーンショット 2017-10-17 9.21.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/8629d2a3-5cc2-5023-b8fa-d6f8de8be97d.png">

同様に、testUserを３人生成しました。
次のステップでようやく投票を実施します。

## 投票先の設定
<img width="1440" alt="スクリーンショット 2017-10-17 9.22.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/309e9719-e8f2-de3b-ac06-0c6660e193a1.png">
画面左側下部`Submit Transaction`ボタンから、トランザクション情報入力画面を開き、
上部のプルダウンから`Transaction type : Voting`を選択します。
これにより、JSON　dataの表示が投票者と候補者の入力画面に変化します。
上記画面の例では「testUser001がAさんに投票する」という内容を設定しています。

## 投票の実施
<img width="1440" alt="スクリーンショット 2017-10-17 9.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/ca2ccc86-926b-fead-fa86-9f942f00fae2.png">

投票トランザクションで`Submit`ボタンを押すと、投票が実施されtestUser001の票の所有者(owner)がAさんに変わります。

これらを各ユーザで繰り返し、任意の候補者に投票を実施します。

<img width="1440" alt="スクリーンショット 2017-10-17 9.23.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/5c3be199-6628-6697-cfd2-4ec13f745f93.png">

なお、投票時に誤ったユーザ情報(例ではtestUserXXX)を設定して`Submit`しようとすると、そんなユーザはいませんと怒られます。

--- 

# まとめ
以上、Hyperledger composerを使ってざっくり投票システムを作成してみました。
サンプルシステムの構成やチェーンコードの内容など、ちゃんと紹介できていない部分もありますが、
`こんな感じ`という使用感を掴んでもらえたら幸いです。


### 参考：トランザクションの確認
<img width="1440" alt="スクリーンショット 2017-10-17 9.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/192468/480821ec-6651-4462-ff98-f0965c0726ec.png">

左側メニュー`TRANSACTIONS > All Transactions`から、実行したトランザクションの結果を確認できます。
この例は、上３つが候補者A,B,Cを生成したトランザクションです。
> ブロックチェーン上に記録されるトランザクション(と認識しています)