ローカル環境（Truffle＋Ganache）でブロックチェーンアプリ開発入門②【チェーン構築・コントラクトデプロイ】

# はじめに
今回はローカル環境にプライベートチェーンを構築して、スマートコントラクトをデプロイしていくところまでをやっていきます。

# 前提条件
- node10 以上がインストールされている

また、私が環境構築したOSはMacですがWindowsでも大きくは変わらないと思うので、随時読みかえるようお願いします。

# Ganache インストール
Ganacheとは、Ethereumの開発環境を簡単に構築してくれるものです。
また以下のような特徴があります。

- 開発用のチェーンを構築するだけでなく、GUI でブロックやトランザクションを参照して、アプリケーションの動作を確認することができる。
- トランザクションは即時にマイニングされたり、Gasやマイニングスピードを自由に設定可能なので開発環境に適する。

実際にNodeを立ててマイニングを行っていると時間がかかってしまうため、開発にとても適しています。
それではインストールをしていきます。

まずは以下のサイトにアクセスしてください。
https://www.trufflesuite.com/ganache

アクセスすると以下のような画面が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500829/e32afb46-be33-974d-5cc0-79f19b7ad528.png)

画面に表示されているDOWNLOADボタンを押下して、あとは指示に従っていくだけでインストールできます。
インストール後にアプリを起動して、QUICKSTARTボタンを押下するとチェーンが構築できます。
チェーンが構築できると以下のような画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500829/f1dfa343-f384-b7d8-7cf7-483e3a8b90ce.png)


初期設定で自動的に１００ETHを所持したアカウントが１０個作成されています。
今回はまだ設定をいじらずにアプリを起動したまま、放置しておくだけでOKです。
これだけの作業でブロックチェーンの環境が簡単に構築できてしまいました。

# Truffle インストール
　Ethereumのスマートコントラクトを開発するのに様々な言語が提供されていますが、今回は一番オーソドックスなSolidityを使用していきたいと思います。
　なおSolidityについての説明は省略いたしますので、もし分からないことなどあれば[クリプトゾンビズ](https://cryptozombies.io/jp/)というSolidityでスマートコントラクトの構築を学習できるサイトがあるので参考にしてみてください。


またTruffleとはSolidityで書かれたスマートコントラクトのコンパイル及びブロックチェーンへのデプロイを行うことができます。

まずは任意のディレクトリに移動して以下のコマンドを実行してください。

```
$ npm install -g truffle
```

前回の記事でも紹介した「Metacoin」というスマートコントラクトのテンプレートを作成していきます。
Truffleインストール後、以下のコマンドを実行します。

```
$ mkdir MetaCoin
$ cd MetaCoin
$ truffle unbox metacoin
```

完了すると以下のようなファイル構成になっていることが確認できるはずです。

```
$ tree
.
├── LICENSE
├── contracts
│   ├── ConvertLib.sol
│   ├── MetaCoin.sol
│   └── Migrations.sol
├── migrations
│   ├── 1_initial_migration.js
│   └── 2_deploy_contracts.js
├── test
│   ├── TestMetaCoin.sol
│   └── metacoin.js
└── truffle-config.js

```

Contractsディレクトリの中のファイルが今回使用するスマートコントラクトのコードになります。
コードの説明は以下の記事で細かく説明してくださっています。
[DApps開発チュートリアル Truffleを利用した「MetaCoin」の実装方法【Truffle v5.0.3】](https://qiita.com/dacciinfo/items/1cdd56e45b349c9ff089#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%81%AE%E8%A7%A3%E8%AA%AC)


次にコンパイルをしていきます。

```
$ truffle compile
```

コンパイルされると、buildディレクトリが作成されていてその中に各スマートコントラクトファイルがjsonファイルに変換されていると思います。
このファイルがブロックチェーンへのデプロイに使用されます。

次はいよいよブロックチェーンにデプロイをしていきます。
truffle-config.jsを変更して、デプロイする先を変更していきます。
以下の部分のコメントアウトを外すことで、Ganacheの設定と同じになります。

```js:truffle-config.js
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    test: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  }
```

これでブロックチェーンにデプロイする準備が整いました。
以下のコマンドを実行してみてください。

```
$ truffle migrate

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



Starting migrations...
======================
> Network name:    'ganache'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0x3534d0395b98c8b80e33c671a103ccbc570f1a0d62f2c477ccbdd9bf9f184cf2
   > Blocks: 0            Seconds: 0
   > contract address:    0x777552514797c715E4023c7e7d9f08a0e6a88032
   > block number:        12
   > block timestamp:     1616770902
   > account:             0x7fBC6E6548B0c57E2873cd845EC98AC30D0A2EFc
   > balance:             99.9710509
   > gas used:            164175 (0x2814f)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0032835 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0032835 ETH


2_deploy_contracts.js
=====================

   Deploying 'ConvertLib'
   ----------------------
   > transaction hash:    0x5de37aaf95558cec634adc54b79fb30439ee824597834b9ae7e483e4da3bffab
   > Blocks: 0            Seconds: 0
   > contract address:    0xb54ea03DFc905f90F497B02Fa3A14894ECb5219b
   > block number:        14
   > block timestamp:     1616770902
   > account:             0x7fBC6E6548B0c57E2873cd845EC98AC30D0A2EFc
   > balance:             99.96829468
   > gas used:            95470 (0x174ee)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0019094 ETH


   Linking
   -------
   * Contract: MetaCoin <--> Library: ConvertLib (at address: 0xb54ea03DFc905f90F497B02Fa3A14894ECb5219b)

   Deploying 'MetaCoin'
   --------------------
   > transaction hash:    0x8179583b03911077e38e5c1b7627bf99d448c3287e9f7837072b610dabf86b41
   > Blocks: 0            Seconds: 0
   > contract address:    0xea54691d2F13E1527598FAfd8E32F8e1Fcb3487D
   > block number:        15
   > block timestamp:     1616770903
   > account:             0x7fBC6E6548B0c57E2873cd845EC98AC30D0A2EFc
   > balance:             99.96256338
   > gas used:            286565 (0x45f65)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0057313 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0076407 ETH


Summary
=======
> Total deployments:   3
> Final cost:          0.0109242 ETH
```
上記のように表示されていれば成功です。
この時Ganache側を見てみると、一番上のアカウントのETHが少し減っていると思いますが、これはデプロイするための手数料としてこのアカウントのETHが支払われたということです。



今回はローカル環境にブロックチェーンを構築し、スマートコントラクトをデプロイするところまで行っていきました。
次回はアプリケーションと連携してコントラクトコードを実行し、トークンを交換できるアプリを作成していきます。