Ethereumベースのブロックチェーンを構築できるKaleidoを触ってみた

#Kaleido
Ethereumベースのブロックチェーンを構築できるAWS上のサービスです。
現在は無料で試せます。

# チュートリアル
※AWSのアカウントが必要です

### Kaleidoの導入
下記リンクから「Continue to Subscrbe」を行います
https://aws.amazon.com/marketplace/pp/B07CSLDS7R

以降は画面に従って、Kaleidoのアカウント作成などを行ってください。

### ブロックチェーンの構築
Create Environment
名前、プロバイダ、コンセンサスを指定します。今回はSample、Quorum、Raftを指定しました。
<img width="1310" alt="create_environment.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/2c4be229-1707-1d6e-7f61-e8a82aa5da2c.png">

コンセンサスアルゴリズムについては下記が詳しいです
Raftはブロック生成時間が短く、一般的ネットワークでの平均ブロック生成時間は1秒未満とのことです。
https://kaleido.io/consensus-algorithms-poa-ibft-or-raft/

MAINNET ANCHOR
このままFINISHします
<img width="1322" alt="mainnet_anchor.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/f3b5c168-ee78-55e3-94c8-1bbb4861a0ca.png">

### ノードの作成
ノードの名前を設定します
<img width="980" alt="add_a_node.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/10dd6b53-eb1d-ede9-f450-6907a84270c5.png">

### App Credentialの作成
ノード作成画面で「Generate additional credential」を選択します
<img width="781" alt="generate.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/890d24eb-6726-af51-87ed-f134c2189169.png">

NAMEを設定
<img width="844" alt="generateappcredential.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/3729140c-a619-3f16-23df-f833f591f571.png">

ユーザ名とパスワードが発行されるのでメモ
<img width="821" alt="password.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/9fe54f2b-e5f6-7044-773a-1abb248fe111.png">

### truffleでデプロイまで

#### truffleのインストール

```console:
npm install -g truffle
```

#### プロジェクトフォルダの作成

```console:
mkdir truffleProject && cd truffleProject
```

#### プロジェクトの初期化

`npm init`の際のentry pointはtruffle.jsを設定しました

```console
truffle init 
npm init
```



#### コントラクトの作成
以降はVisual Studio Codeを使って作業しました。
contractフォルダでSimpleStorage.solを作成し、以下のコードを記述します。

```solidity:SimpleStorage.sol
pragma solidity ^0.4.23;

contract SimpleStorage {
    uint public storedData;

    constructor(uint initVal) public {
        storedData = initVal;
    }

    function set(uint x) public {
        storedData = x;
    }

    function get() view public returns (uint retVal) {
        return storedData;
    }
}
```

#### マイグレーションファイルの作成

migrationsフォルダで2_deploy_simplestorage.jsを作成し、以下のコードを記述します。

```javascript:2_deploy_simplestorage.js
const SimpleStorage = artifacts.require("SimpleStorage");

module.exports = function (deployer) {
  deployer.deploy(SimpleStorage, 123);
};
```

#### Web3のインストール

※1.0系ではtruffle.jsでエラーが発生し、動作しませんでした。

```console:
npm install web3@0.20.6 --save
```


#### ネットワーク設定
truffle.jsを書き換えます。

```javascript:truffle.js
var Web3 = require('web3');

const endpoint = "";
const user = "";
const pass = "";

module.exports = {
  networks: {
    sample_node: {
      provider: new Web3.providers.HttpProvider(endpoint, 0, user, pass),
      network_id: "*", // Match any network id
      gasPrice: 0,
      gas: 4500000
    },
  }
};

```

endpointは作成したノードのDetailsの「RPC ENDPOINT」を入力します。
userとpassは先ほど作成したcredentialの値を入力します。

#### shの作成
RAFTコンセンサスを実行しているQuorumネットワークはtruffleでのデプロイが遅いので、shellを作って解決します。

プロジェクト直下にtruffle_migrate.shを作成します。


```sh:truffle_migrate.sh
#!/bin/bash
truffle migrate --network sample_node --reset > /dev/null &
sleep 1
set -x
truffle migrate --network sample_node --reset

```

#### コントラクトのデプロイ

```
chmod +x truffle_migrate.sh
./truffle_migrate.sh
```

### コントラクトがデプロイされたか確認
KALEIDO Block Explorerから確認できます

<img width="1216" alt="smart_contradct.png" src="https://qiita-image-store.s3.amazonaws.com/0/109724/5f23978c-265c-02e7-06b2-7e4880c26619.png">


### コントラクトを触ってみる

```console:
truffle console --network sample_node
```

保存されている値を確認

```javascript:
SimpleStorage.deployed().then(function(instance){return instance.get()});
> BigNumber { s: 1, e: 2, c: [ 123 ] }
```

状態変数を更新

```javascript:
SimpleStorage.deployed().then(function(instance){return instance.set(234)});
```

再度保存されている値を確認

```javascript:
SimpleStorage.deployed().then(function(instance){return instance.get()});
> BigNumber { s: 1, e: 2, c: [ 234 ] }
```

# まとめ
Kaleidoを使って独自のブロックチェーンを作成できました。
Raftは本当に早かったので使ってみようと思いました。

# 参考
KALEIDO - Docs
http://console-ap.kaleido.io/docs/docs/home/
Connecting with Truffle
http://console-ap.kaleido.io/docs/docs/truffle/