テストブロックチェーンネットワークを使って分散アプリケーションを動かす - メモ程度 - 

# 始めに
- かなり初級レベルの話になります。自分の整理のために書いている記事となります。
    - [DApps開発を始める動機と工程(粗め)紹介](https://qiita.com/taishinagasaki/items/f9a4166d051089d9a444)にて学習動機を記載しています。
- [ETHEREUM PET SHOP -- YOUR FIRST DAPP](https://truffleframework.com/tutorials/pet-shop#ethereum-pet-shop)に従い、開発環境で構築して挙動確認までしました。
    - 構成としては
        - テストブロックチェーン: Ganache
        - デプロイ、コンパイル、アプリケーション本体の管理: Truffle
        - コントラクト言語: Solidity
        - ブラウザ内のEthereum DAppsとブロックチェーンネットワークを接続: MetaMask

# 所感
- やってよかった。
    - 各構成要素が何を具体的に処理しているのかイメージできるようになった。
        - 例えば、Truffleだと想定以上に幅広い守備範囲を持つとおもった。compile, deploy以外にも、他の人が開発したmodule(?)を簡単に呼び出したりできる[TRUFFLE BOXES](https://truffleframework.com/boxes)というものがあるとは知らなかった。今回は、このBOXESの中からPET-SHOPをもってくることになった。
        - MetaMaskは、ブラウザ上のアプリケーションとネットワークの接続を可能にしてくれている(RPC)
        - Ganacheを見ていると、コンソールでみているときよりもGASやどんな類のものにコストが発生するのかがより整理されていく。ブロックチェーン自体への理解が浅いなって思える。
    - 各構成要素の接続もイメージできるようになった。
        - お互いにどんな情報を受け渡しているのか、などをソースコードレベルで見れると「なるほど」と理解が深まることが多かった。
    - 地味にnode.jsとかの理解も深まった。そもそも触ったことがなかったので。
- 所要時間は環境構築など含めて３時間くらいで終わる。だらだらすると６時間くらい。

# 使った資料
- [ETHEREUM PET SHOP -- YOUR FIRST DAPP](https://truffleframework.com/tutorials/pet-shop#ethereum-pet-shop)でメインは進めていくとよい。
    - 英語だけど、そんなに難しかったり、既存のWeb技術と比較して新しいもの盛りだくさんというわけではない。
    - 日本語の文献もあるが、正直、このページがソース元なので一番説明が正しい。また、やはり説明が結構丁寧なので、理解が深まりやすかった。
    - 日本語の資料は、ところどころ抜けていたり、齟齬がある箇所があるので、補足程度に扱うのがよいと思う。
- 日本語資料
    - [Dapps作成手順をイチから学べる！Truffleの「イーサリアム・ペットショップ」](http://kojiryo.com/811/)
    - [【TruffleでDapp開発】公式チュートリアル「ETHEREUM PET SHOP」で基礎を学ぶ](https://takuyafujita.hatenablog.com/entry/2018/08/15/085236)

# Tips
### 環境構築編
１． node.js
node.jsを「フレームワーク」だと勘違いしていたけど、全然違った。
[Node.js を5分で大雑把に理解する](https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559)
[初心者向け！3分で理解するNode.jsとは何か?](https://eng-entrance.com/what-is-nodejs)
> Node.jsでは、Webサーバとアプリケーションが同じ PHPのWebサイトで無理やり例えると、Apache + mod_php + Webアプリ です。なので、Node.js の Hello Worldのサンプルは、HTTPを受付け、200とヘッダーと内容を返す、というのが多い。

node.jsをインストールする方法
npmっていうのを聞いたことはあった。
> Node Package Manager。npmの正式名称からも解るように、Node.jsのパッケージ（Package ）を管理する（Manager）ツール
[便利なパッケージ管理ツール！npmとは【初心者向け】](https://techacademy.jp/magazine/16105#sec1)
面白いとおもったのが、MVCフレームワークとかもある。

実際にMacにインストールしてみる。
[Macにnode.jsをインストールする手順。](https://qiita.com/akakuro43/items/600e7e4695588ab2958d)
[MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
nodebrewをインストールするとパッケージで諸々使えるようになる。

#### ブロックチェーンテストネットワーク
[Ganache](https://truffleframework.com/ganache)をインストール
新しい設定は必要ない。立ち上げるだけでlocalhost:7545で動いてくれる。
個人的にはgethなどを使ってコンソール操作ではなくてGUIで直感的にブロックの動きとか、ログが見れたりするので、ありがたかった。本当に素晴らしい。
gethなどのインストールが不要。

#### truffleで実装
Dappsのフレームワーク提供、関連するcompile, deployをしてくれるツールであるTruffleに加えて、Ethereum処理言語Solidity, JSフレームワークのWeb3.jsもインストールにしてくれている。

```bash
 ~ $ truffle version
Truffle v5.0.8 (core: 5.0.8)
Solidity v0.5.0 (solc-js)
Node v11.12.0
Web3.js v1.0.0-beta.37

```

*ディレクトリ構造*

```bash
.git/
.github/
contracts/ #Contains the Solidity source files for our smart contracts. There is an important contract in here called Migrations.sol, which we'll talk about later.ここにスマートコントラクトスクリプトは格納
migrations/ #Truffle uses a migration system to handle smart contract deployments. A migration is an additional special smart contract that keeps track of changes. ここでマイグレーションを管理する。
node_modules/ #たくさん入っている
src/ #front-endの情報が入っていた
test/ #JavaScript, Solidityのテスト
LICENSE
README.md
box-img-lg.png
box-img-sm.png
bs-config.json
package-lock.json #package.jsonで実際にインストールされているもの
package.json #プロジェクトに必要なパッケージとバージョン記述することでnpmがインストールしてくれる.。https://qiita.com/Sekky0905/items/452619651cdd950c2271。truffleが動く上で必要なパッケージが記述されている。
truffle-config.js #truffleの設定ファイル
```

#### compileとmigration
- compileが成功するとbuildディレクトができて、各ソースコード分のJSONが作られていた

```bash
.
└── contracts
    ├── Adoption.json
    └── Migrations.json
```

- migrate
    - migration fileは各solidity code fileごとに作成してあげる。
    - migrations/ ディレクトリ配下にて管理してある。
    - １つのcontract ソースコードfileに対して1つのmigration fileを作成してあげる。
    - 注意としては、「 we don't double-migrate unchanged contracts in the future.」
        - 再度、migrateしたいときは`--reset`オプションで.

#### あとはGUI作成...

### 次にやりたいこと
- コードリーディング。ゾンビの方もやれるとHAPPY
- 自分で作ってみる
- 最終的に本番ネットワークに上げてみる
    - 守備範囲広めなのでキャッチアップが大変そうだけど、楽しみ。

---
お読みいただきありがとうございました。
間違い、ないし、改善レビューがありましたらコメントいただけると嬉しいです。