MacでEthereumを使ってブロックチェーン入門(Truffle,Browser-Solidity導入編) 


[Fusic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fusic)8日目の記事です。

[前回](https://qiita.com/ayasamind/items/ec1ee133478d5ac0c676#%E5%8F%82%E8%80%83%E6%9B%B8%E7%B1%8D)に引き続き、Ethereumでブロックチェーン入門の記事です。

前回はGo-Ethereum(Geth)のコンソールの立ち上げまでやりましたので、今回はEthereumのマイニングの実行やアカウントの発行からやっていきます。

また、今回はEthereumでスマートコントラクトを開発するためのフレームワークである[Browser-Solidity](https://remix.ethereum.org/#version=soljson-v0.4.19+commit.c4cbbb05.js)や[Truffle](http://truffleframework.com/)を用いて、スマートコントラクトの開発を始める準備もしていきたいと思います。


## Gethを使ってアカウント作成

前回のコンソールが立ち上がった状態からスタート

```
$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/ether-practice/testnet console 2>> ~/ether-practice/testnet/geth.log

Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable/darwin-amd64/go1.9.2

>
```

まずは以下のコマンドでアカウントを作ります。
***('pass')***の部分は各自設定したいパスワードを設定してください。

```
> personal.newAccount('pass')
"0x16161656de3b6809361aef2140ca286b7f400900"
```

自動的にアカウントのアドレスが発行されます。
パスワードは忘れないように、必ずどこかに保管しておきましょう。


eth.accountsコマンドで全てのアカウントのアドレスを見ることができます。

```
> eth.accounts
["0x16161656de3b6809361aef2140ca286b7f400900"]
```


## Gethを使ってマイニング


それでは遂にマイニングをしてみます。
まずは現在のアカウントのEthereumの残高を確認します。


```
> eth.getBalance(eth.accounts[2])
0
```

まだマイニングを開始していない為、もちろん0が表示されます。
また以下のコマンドでブロックチェーンのブロック数も確認することができます。

```
> eth.blockNumber
0
```

それではマイニングを始めましょう。
miner.start(1)コマンドでマイニングが開始されます。

```
> miner.start(1)
null
```

nullが表示され、一見何も起こっていないように見えますが、裏ではマイニングが走っています。
以下のコマンドでマイニングが動いているか確認することができます。

```
> eth.mining
true
```

新しく別のターミナルを開き、tailコマンドでログを見てみましょう。

```
$ tail -100f ~/testnet/geth.log
INFO [12-08|18:39:23] Commit new mining work                   number=81 txs=0 uncles=0 elapsed=1.026ms
INFO [12-08|18:39:24] Successfully sealed new block            number=81 hash=fb73bf…818bb5
INFO [12-08|18:39:24] 🔨 mined potential block                  number=81 hash=fb73bf…818bb5
INFO [12-08|18:39:24] Commit new mining work                   number=82 txs=0 uncles=0 elapsed=115.84µs
INFO [12-08|18:39:25] Successfully sealed new block            number=82 hash=9d8156…a46746
INFO [12-08|18:39:25] 🔨 mined potential block                  number=82 hash=9d8156…a46746
INFO [12-08|18:39:25] Commit new mining work                   number=83 txs=0 uncles=0 elapsed=129.391µs
```
こんな感じでマイニングが進んでいます。

```
> eth.getBalance(eth.accounts[0])
315
> eth.blockNumber
30
```

アカウントの残高、ブロック数も増えてます。

以上でテストネットワークでマイニングをすることができました。
ここで生成されたEtherはあくまでテストネット上のものですので、これ自体に価値はありません。
実際のライブネットワーク上でのマイニングはかなりのリソースがないと膨大な時間がかかってしまいます。

GethではそのほかにもEtherの送金やバックグラウンドで動かすことも可能です。

Gethの説明はここまでにして、次はTruffleの導入に入ります。


## Truffleのインストール

Truffleはブロックチェーン上でスマートコントラクトを実装するためのフレームワークです。
今回はフレームワークとしてではなく、Gethのコンソールの代替として使用します。

Truffleはnpmパッケージでインストールが可能です。
npmパッケージはNode.jsが必要ですので、未インストールの方はnodebrewなどを用いてインストールをしてください。

Truffleのインストールをします。

```
$ mkdir truffle-practice
$ cd truffle-practice
$ pwd ~/truffle-practice
$ npm install -g truffle
$ truffle init
```

これでいくつかファイルがディレクトリ上に生成されます。
このファイル達を編集すればスマートコントラクトの実装ができますが、今回は割愛します。
勉強したい方はTruffleのサイトにある[box](http://truffleframework.com/boxes/)を用いると、かなり詳細なチュートリアルを使いながらスマートコントラクトの練習をすることができます。


Gethの環境をTruffleで立ち上げます。


```
$ truffle develop
Truffle Develop started at http://localhost:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
```

このようにGethでアカウントを作る感じで、10のアカウントを生成してくれます。

それではこの環境のまま、Browser-Solidityを始めてみましょう。

## Browser-Solidityで自分の環境にアクセス

Browser-Solidityはスマートコントラクトの開発言語であるSolidityのIDEをブラウザ上で使用できるようにしたものです。SolidityはTruffleでも使用されており、javaScriptライクな言語でWeb開発をしている人にとっては親しみやすい文法で書かれています。

Browser-Solidityをインストールします。

```
$ git clone https://github.com/ethereum/browser-solidity
```

ローカルのindex.htmlをブラウザで開きます。

<img width="1432" alt="Remix - Solidity IDE 2017-12-08 19-28-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/a0961642-593c-a9c6-8aa7-5758c1698451.png">

このような画面が立ち上がります。

デフォルトで立ち上がっているballot.solファイルは閉じてしまいます。


それでは先ほどTruffleで立ち上げたネットワークにBrowser-Solidityから接続をしましょう。


右上の「Run」タブを開き、EnvironmentでWeb3 Providerを選択します。

<img width="393" alt="run.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/1827c874-e69f-10bf-c74b-781b07805157.png">


すると接続しますか？というダイアログがでるので、OKを押すと、以下のような画面がでます。

<img width="686" alt="setuzoku.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/af50ff3e-ab22-1223-fbbc-36ce61be8174.png">


ここでアドレスをTruffleが立ち上がっているアドレス(http://localhost:9545/)を入力します。


<img width="384" alt="acount.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/dccffdd4-7068-9c3d-98b6-a0c60d2005a8.png">


Accountの部分を押して、Truffleで立ち上がった10のアカウントがインポートされていたら無事接続完了です。
(Truffleでは自動で100etherがアカウントに付与されます。)
お疲れ様でした。



以上、Gethでのアカウントの操作、TruffleとBrowser-Solidityを用いたスマートコントラクトの開発環境の構築を行いました。

より発展的な構築をやっていきたい方は是非TruffleのBoxのチュートリアルをやってみましょう。Truffleの使いやすさがよくわかります。


最後まで読んでいただき、ありがとうございました。



## 参考書籍、サイト

[はじめてのブロックチェーンアプリケーション Ethereumによるスマートコントラクト開発入門](http://www.shoeisha.co.jp/book/detail/9784798151342)
[Truffle公式サイト](http://truffleframework.com/)