EnterpriseEthereum/Kaleidoをローカルtruffleからアクセスする

# What's this?

パーミッションドのブロックチェーン勉強中です。

BaaS色々使いたいですが如何せんお金がかかります。
そんな中、EthereumベースのBaaS「Kaleido」は永久無料プランがあるのでそれは使いやすい、ということで勉強しています。

あんまり情報ないですが、マルチリージョンとかにもできるしEnterpriseEthereumのBaaSとしてはかなり優秀なのでは、という印象です。
詳しくは下記をみてください。

[「Kaleido」企業向けイーサリアム開発のフルスタックBaaSとは？](https://coinpost.jp/?post_type=column&p=118876)


今回はコンソーシアムを立ててコントラクトをデプロイ、ローカルのアプリケーションからパーミッションドアクセスできるところまでを確認します。
ここまでできればDAppが作れるはずです。

# 環境

下記で検証

```sh
$ sw_vers
> ProductName:	Mac OS X
> ProductVersion:	10.14.5
> BuildVersion:	18F2058
$ node -v
> v10.18.0
$ npm -v
> 6.13.4
```

nodeのバージョンは一個前のLTS？であるv10.18.0でないと動作しません。
後続のtruffleboxの```npm install```で死にます。
初めv12.13.1とかでやってると死んでました。
まだtruffleかweb3のサポートが追いついてないようです。

# 手順

## Kaleidoのコンソーシアム作成

Kaleidoのコンソーシアム作成については、先人の記事を参考ください。
ぽちぽちやれば良い感じになるはずです。

[Ethereumベースのブロックチェーンを構築できるKaleidoを触ってみた](https://qiita.com/Mr_Y/items/25056e7eb890fcd5c5bc)


## truffle環境の構築

Kaleido.ioが下記にtrufflebox置いてくれているので、基本ここに準拠するだけです。

[truffle-kaleido-box](https://www.trufflesuite.com/boxes/truffle-kaleido-box)

下記コマンドがローカルでうまく機能するかどうかを確認しましょう。

```sh
mkdir truffle-kaleido-box
cd truffle-kaleido-box
npx truffle unbox kaleido-io/truffle-kaleido-box
truffle develop
# 以下、truffle console上で
compile
test
migrate
```

## Kaleidoへの接続・コントラクトデプロイ

ローカルでうまく動作することが確認できれば、次はコントラクトをKaleidoにデプロイしてみます。
これもぶっちゃけtruffle-kaleido-boxの「Connect to Kaleido」に従うだけです。
デプロイしたいノードで「+ Connect Node」をクリック（下記ボタン）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/f9b5714a-f8a5-9b9b-89c1-f99d5cfc4c05.png)

「Native JSON/RPC」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/8b60462f-c575-2cc9-9765-15a479a65bd7.png)

必要なCredentialsを選択or新規作成
入れたら下記をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114040/9c2b0616-a5f9-8e7c-18d8-39dd050081ee.png)


表示されている「App Credential」、「Connection Url」をtruffleのconfigに記述します。
truffle-config.jsを開いて下記を修正。


```javascript
const appCred = 'yourappcred'; // from application credential widget
const connectionURL = 'nodeConnectionURL'; // without protocol (https://)
```

_※作成したコンソーシアムがQuorumであれば、```type: 'quorum'```のコメントアウトを外しておく。_

下記コマンドでコントラクトをデプロイします


```
npx truffle migrate --reset
```

デプロイに成功したら、コンソールにデプロイしたコントラクトのアドレスが出ています。

```
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0xf38a1E94A9F65118caa957D60806688397BD147c
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying SimpleStorage...
SimpleStorage: 0xAAbDE02d23eD1Fe769d22e2666E1490dAb9F58B6 ←これ
Saving successful migration to network...
Saving artifacts...
```

KaleidoのBlockExplorer上で、デプロイしたコントラクトを確認できます。

## デプロイしたコントラクトを触ってみる

truffle consoleから確認

下記コマンドでtruffle consoleへ

```
npx truffle console
```

console上で下記コマンドでデプロイ済のコントラクトを取得

```javascript
let deployedContract = await SimpleStorage.deployed()
```

処理実行に必要なアドレスを取得

```javascript
let accounts = await web3.eth.getAccounts()
```

下記でコントラクトにアクセス、storedData変数に格納されている数値を確認できる。

```javascript
deployedContract.contract.methods.storedData().call()
> '(なんらかの数字)'
```

下記でstoreされている数値を更新する。

```javascript
deployedContract.contract.methods.set([数字]).send({from: accounts[0]})
// ex) >deployedContract.contract.methods.set(99999).send({from: accounts[0]})
```

もう一度値を確認すると、値が更新されていることがわかる。

```javascript
deployedContract.contract.methods.storedData().call()
> '(さっき指定した数字)'
```

_※ちなみにRPC接続だけでなく、KaleidoではREST APIサーバーも置いてくれるので、
REST API経由でも今回デプロイしたコントラクトにアクセスできます。
デプロイしたアドレスを指定して簡単に実行できます。_

---

以上です。

ここまでできれば、あとはコントラクトアクセスするようなDAppを作れるはずです。
他の参加者もノードをポチって追加して、Credentialsを提供するだけで良い感じにできる、はずです。
運用方針あってんのか、もうちょっとコントラクトをセキュアにするとかワークフロー的なこともできると思いますが、そこの作り込みは勉強中です。

重ねてですが、パーミッションドなEthereumを利用するのは、Kaleidoが一番軽い感じで良いのではないのでしょうか。
何より無料、これがすごい。（どうやって収益化してるんだろう、、、）

これでコンソーシアムでの検証をやってみたいと思います。


## 参考

- [「Kaleido」企業向けイーサリアム開発のフルスタックBaaSとは？](https://coinpost.jp/?post_type=column&p=118876)
- [Ethereumベースのブロックチェーンを構築できるKaleidoを触ってみた](https://qiita.com/Mr_Y/items/25056e7eb890fcd5c5bc)
- [truffle-kaleido-box](https://www.trufflesuite.com/boxes/truffle-kaleido-box)