Ethereumのテストネットを導入してみた

##<b><font color="black">【開発環境】</b> </font>
OS:Ubuntu MATE 16.04
仕様ツール：Geth(ver1.7.3)
※Win10でリモートデスクトップ使ってUbuntuを動かしてるため、OSはMATEにしてます。特にこだわりがなければMATEで無くてもいいと思います。(Ubuntuでも動作確認済)
##<b>【導入方法】</b>
　参考URL:<a href="https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options">https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options</a>
####**Gethの導入**

```
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt update
sudo apt install ethereum
```

Gethの導入が終わったら導入できたかどうか確認します。

![d82f8fb4c8ab64d0b4a9ee266cb330c3.png](https://qiita-image-store.s3.amazonaws.com/0/234035/ff180a74-e71b-58a5-c2c6-71634d6a2e62.png)

(^ω^)・・・(GOPATH空欄だけど、よしとしよう)

####**GenesisBlockの生成**
　GenesisBlockとは、0番目のブロックで一番最初に来るブロックです。jsonファイルで作成して、任意の場所に保存した後、```--datadir /***/**** init genesis,json ```という感じで、ブロックデータを生成します。
```--datadir```の後のPATHは、gethとkeystoreというフォルダを生成する場所になります。また、gethフォルダの中には、ブロックデータを保存するchaindata,lightchaindataフォルダが生成されます。
以下、
模作
自作したgenesisBlockのファイルのソースです。

``` genesis.json
{
  "config": {
        "chainId": 15, //1～3は予約済のため使用不可 --networkidは、これと同一にする必要がある
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {}, //プレイマインの設定が可能
  "coinbase"   : "0x0000000000000000000000000000000000000000", //coinbase初期値,後でアカウントを追加したときに上書きされる
  "difficulty" : "0x20000", //採掘難易度
  "extraData"  : "", 
  "gasLimit"   : "0x2fefd8", //ガスリミット
  "nonce"      : "0x0000000000000042", //mixhashと混ぜるハッシュ値(64bit)
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",//nonceと合わせて使うhash値(256bit)
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",//nonce+mixhashが格納される値。親ノードのポインタ
  "timestamp"  : "0x00" //difficultyの調整を行う(前後のblock生成間隔を考慮して約15秒に一回blockが生成されるように調整する役割を持つ)
}
```
※</a href="https://github.com/ethereum/go-ethereum#defining-the-private-genesis-state">https://github.com/ethereum/go-ethereum#defining-the-private-genesis-state</a>を参考にしました。
※各値の内容は、<a href="https://ethereum.stackexchange.com/questions/2376/what-does-each-genesis-json-parameter-mean">https://ethereum.stackexchange.com/questions/2376/what-does-each-genesis-json-parameter-mean</a>から。

このファイルを以下のコマンドでGenesisBlockを生成します。
※あらかじめ、homeフォルダの直下にtestnetフォルダを作成しています。また、genesis.jsonもtestnetフォルダの中に保存してます。

```
geth --datadir /home/testnet init /home/testnet/genesis.json
```

これで準備が整いました。

次のコマンドを打ってください。

```
geth --networkid 15 --nodiscover --maxpeers 0 --datadir /home/testnet 
```
ちゃんと動いていれば以下の画面の表示が出ます。

![bd183d9181a159aa0211b085719be8e6.png](https://qiita-image-store.s3.amazonaws.com/0/234035/dabe2b3a-5376-a60b-6278-5d828c6f5b83.png)
<dev>
<details><summary><b>各コマンドの概要と注意点</b></summary>
IPC endpoint opened:以降に表示されてるファイルパスは、先程打ったコマンドの中のうちの```--datadir```で指定したところになります。ここにgeth.ipcが生成されます。
　注意するべきことは、ここで指定したファイルパスにgenesis.jsonで作成されたgeth,keystoreフォルダのあるファルダを指定しないと正しく動かないので要注意です。また、```--networkid``` で指定した数値は、Genesis.jsonで書いたchainidと同一にしなければいけません。
・残りのコマンドについて
　```--nodiscover``` //gethには、他の同一networkidのついたテストネットの探索して接続する機能があるそうで、それを無効化するのがこのコマンドです。
　```--maxpeers```  //テストネットに接続できる他PCの数を指定できます。デフォルトは25。0にするとオフライン環境になります。オンラインで使用する場合は0以外の数値に指定して、ポートを開放するためのコマンドなどを追加しなければなりません。
参考:<a href="http://inon29.hateblo.jp/entry/2017/07/11/154206">http://inon29.hateblo.jp/entry/2017/07/11/154206</a>
</details>
</dev>
<dev>
<details><summary>余談</summary>
number=73になってますけど、この記事書く前に色々いじってブロック生成して更新されてるので、初回起動時はたぶん0になってる・・・はず。
</details>
</dev>

次に別の端末(ターミナル)を開いて、`--datadir`で指定したフォルダまで移動してください。(今回の場合は、/home/testnet)
その後、以下のコマンドを入力してください。

```
geth attach geth.ipc
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/234035/28b4c4c7-3a42-6fc5-e333-d34888f7a77a.png)

　特に問題がなければ以上のような表示が出ます。それ以外の表示が出る場合、パスの指定を間違ってたり、バグってる？可能性があるので、Ctrl+Cで一度中断してもう一度コマンドを見直して打ち直したり、gethを入れ直したりしてもう一度試してください。

##<b>【テストネットを試す】</b>##
テストネットを作成したので、実際に動かしてみます。

####<b>アカウント作成</b>
`--eth.accounts`とコマンド打っても
`[]`としか返ってきません。Ethreumのアカウントが無いため、[]内は空欄になってます。
なので、アカウントの作成を最初に行います。
アカウントの作成のコマンドは以下のとおりです。
`personal.newAccount('password')`　//passwordの部分にアカウントのパスワードを入れてください。
少し待つと"0x21baabbd50c4ece4423be3588993bd97e92ef637"のような0から始まるアカウントが作成されます。
また、複数アカウントを作ることも可能です。

####<b>マイニング</b>
アカウントの作成が終わったのでマイニングをしてみます。
マイニングするアカウントは、デフォルトでは最初に作ったアカウントになります。
どのアカウントでマイニングするか確認するには`eth.coinbase`というコマンドで調べられます。
　確認したら実際にマイニングを行いましょう。

・コマンドリスト
`miner.start()` //マイニングを()内に数値をいれると使用するCPUのコア数を設定できます。デフォルトではフルです
`miner.stop()` //マイニングを止めます
`eth.hashrate` //ハッシュレート値が確認できます。マイニングしてない時やDAGの生成中以外は0になりません 
`eth.getBalance(eth.coinbase)` //マイニング報酬の確認が出来ます

`miner.start()`を実行すると、DAGが生成されるためしばらくハッシュレート値が更新されません。更新される時間はPCのマシンパワーによって変わります。気長に待ちましょう。
DAGの生成してる様子やマイニングの様子は、最初に開いた端末で確認できます。

![acdc67b5d5551d6389e126e4705f3ed4.png](https://qiita-image-store.s3.amazonaws.com/0/234035/74c81bd6-a58d-6935-295b-340252a71443.png)

マイニングを止めるときは、`miner.stop()`コマンドを押して、コンソールを閉じるときには、`exit`を入力するとgethが終了します。※最初に開いた端末側(ログが残ってる方)では、まだ動いてるままなので、終わらせたいときはCtrl+Cを入力してください。