初めてのgeth環境構築とEtherマイニング体験　〜VR×Blockchainのサービスデプロイまでの道①〜

# ETHとUnityを使ってコンテンツを作ることになりましたので、ここにまとめつつ実装していくことにしました！


![ethereum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/378dbfb6-8d27-bfd6-0e7f-fec93b3775d3.png)


## 環境
PC: MacBook Air


## 参考記事（ほぼ下記参考記事通りで作業したので、そちらを参考にした方がベストだと思います！）
[Ethereumクライアント（client）・Gethの環境構築手順【Windows, Mac】](https://blockmania.jp/?p=51)
[テストネットワークでGeth起動（Gethの初期化、Gethのコマンド・オプション）](https://blockmania.jp/ethereum/62/)
[コマンドラインでEtherアカウント作成からマイニング（mining）までの手順](https://blockmania.jp/ethereum/121/)
[Ethereum - Gethコンソールのコマンドを試す](https://blog.y-yuki.net/entry/2018/08/12/164101)
[主な Ethereum ネットワークの Network ID および Chain ID 一覧](https://qiita.com/hm0429/items/224d420364b36cf43e85)
[Ethereum コントラクトの動作を確認するまでの手順](https://qiita.com/zaburo/items/9c8fab5da3b7d782ee89)

---
(:bee:以下実装メモ:bee:)

### Geth
Go-ethereumの略
Go言語で実装されたスマートコントラクトのクライアント

そもそも、EthereumとはEtherという通貨単位を持った、スマートコントラクトの実行基盤となるプラットフォームのことで、このEthereumのプラットフォームに参加するにはEthereumクライアントが必要になる

そのクライアントの一つがGeth

### Gethのインストール(A:BどちらかでOK)
#### A: Homebrewを使ってインストールする場合
すでにHomebrewがあるかどうか確認

`brew -v`

(バージョンが出てきたら、すでにインストール済みってこと！)

`brew tap ethereum/ethereum`
`brew install ethereum`


#### B: Gethリポジトリをクローンする場合
`git clone https://github.com/ethereum/go-ethereum`
`brew install go`
`go-ethereum`
`make geth`




##### インストールされているか確認
`geth --help`

gethのコピーライト的なものが最終行に表示されていれば、インストール完了！

#### Ethereumテストネットワーク上でGethを起動させるための前準備

Ethereumネットワークは大きく分けて、ライブネットワーク（本番環境）とテストネットワーク（テスト環境）がある
なので、開発手順としてはテストネットワークで確認を行なってからライブネットワークにリリースする形

テストネットワーク上でGethを起動するためには、

- データディレクトリ（送受信したデータや、アカウント情報を保存する役割）
- Genesisファイル（ブロックチェーンの０番目の情報が書かれているファイル）

の２つが必要になる

##### データディレクトリの準備

`cd`
`mkdir ~/testnet_block`
`cd testnet_block`
`pwd`

/Users/自分/testnet_block

と表示されればOK

##### Genesisファイルの作成

`touch genesis.json`
`vim genesis.json`

(※下記をインサート)

```
{
  "config": {
    "chainId": 15
    },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

#### Gethの初期化作業

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

`ls`
genesis.json	geth		keystore
が表示されればGeth初期化完了！
（ローカルでテストネットを利用するときにだけ初期化が必要）

#### テストネットワークでGethを実行

`geth --networkid 15 --nodiscover --maxpeers 0 --datadir ./ console`

アプリケーションの許可アラートが出てくるので許可し、Welcome to the Geth JavaScript console!がターミナルに表示されていれば
geth起動成功！！
（抜けたい時はexitする）

##### --networkid

ブロックチェーンネットワークの識別子を指定するオプション（0-3以外の番号なら自分で自由に選ぶことができる）

##### --nodiscover

他のノードが自分のノードを検出できないようにするための設定（テストの際によく使用される）
これを指定しないと、GenesisファイルとネットワークIDが同じブロックチェーンネットワークに自分のノードが接続されてしまう恐れが出てくる

##### --maxpeers 0

自分のノードに接続することができる数を指定（テストの場合は0を指定することが多い）

##### –datadir ./

データディレクトリを指定するオプション

##### console

JavaScriptのコンソールを起動するためのGethのオプション

ここまでで、Geth環境構築は完了！

#### Ethereumアカウント作成

Ethereumには下記２種類のアカウントがある
- EOAアカウント
- Contractアカウント

##### EOAアカウント
Externally owned accountsの略
ログインに使用するアカウント
Etherを送金したり、Contractを実行したりできる

##### Contractアカウント
Contractをブロックチェーン上にデプロイした際に作成されるアカウント
コントラクトコードによって制御されている
コードの実行、他のアカウントへのメッセージ送信の役割
（ただし、EOAアカウントや他のアカウントから働きがけがない限り、Contractアカウント自ら実行することはない）

##### EOAアカウントの作成

先ほどGethを起動したままだったので、そのままコマンドを下記コマンドを入力

`personal.newAccount("passwordhoge1")`

今回は送金もしたいので、もう一つアカウントを作成

`personal.newAccount("passwordhoge2")`

作ったアカウントを確認

`eth.accounts`

```
> eth.accounts
["0x083e9e928739eb010507f303ae0983cbd2e5f408", "0x19ae167796941291c57632b18e0677e7a76670ab"]
```
2つ配列に入っていればOK

#### Etherbaseアカウントを変更

Ethereumではマイニングの報酬を受け取るアカウントのことをEtherbaseと呼ぶ
デフォルトではeth.account[0]が設定されている

今回はその報酬を受け取るアカウントをeth.account[1]に変更してみる

`eth.coinbase`
eth.account[0]のアドレスが表示されることを確認

`miner.setEtherbase(eth.accounts[1])`
trueが出れば成功

`eth.coinbase`
eth.account[1]のアドレスに表示が変わったことを確認

変更ができること確認できたので、元に戻す

`miner.setEtherbase(eth.accounts[0])`

#### マイニング体験

##### まずはマイニング前の残高を確認
`eth.getBalance(eth.accounts[0])
eth.getBalance(eth.accounts[1])`

##### 現在のブロック数も確認
`eth.blockNumber`

##### 初回マイニングの実行

`miner.start(1)`

※初回実行じはDAGというものが生成されるため、マイニングはとても時間がかかる

```
INFO [08-31|18:14:36.282] Generating DAG in progress               epoch=0 percentage=83 elapsed=3m32.540s
INFO [08-31|18:14:38.276] Generating DAG in progress               epoch=0 percentage=84 elapsed=3m34.534s
INFO [08-31|18:14:40.260] Generating DAG in progress               epoch=0 percentage=85 elapsed=3m36.518s
INFO [08-31|18:14:42.261] Generating DAG in progress               epoch=0 percentage=86 elapsed=3m38.520s
INFO [08-31|18:14:44.246] Generating DAG in progress               epoch=0 percentage=87 elapsed=3m40.504s
INFO [08-31|18:14:46.475] Generating DAG in progress               epoch=0 percentage=88 elapsed=3m42.734s
INFO [08-31|18:14:48.822] Generating DAG in progress               epoch=0 percentage=89 elapsed=3m45.081s
INFO [08-31|18:14:50.859] Generating DAG in progress               epoch=0 percentage=90 elapsed=3m47.117s
INFO [08-31|18:14:52.987] Generating DAG in progress               epoch=0 percentage=91 elapsed=3m49.245s
INFO [08-31|18:14:55.627] Generating DAG in progress               epoch=0 percentage=92 elapsed=3m51.885s
```
しばらくすると、Genetating DAGではなくなり、マイニングが始まる

```
INFO [08-31|18:24:57.555] Successfully sealed new block            number=53 sealhash=f1d78c…bceb84 hash=0f29db…c35bd3 elapsed=9.778s
INFO [08-31|18:24:57.556] 🔗 block reached canonical chain          number=46 hash=b24cc6…e706cb
INFO [08-31|18:24:57.556] 🔨 mined potential block                  number=53 hash=0f29db…c35bd3
INFO [08-31|18:24:57.556] Commit new mining work                   number=54 sealhash=9cbec0…3eff83 uncles=0 txs=0 gas=0 fees=0 elapsed=399.746µs
> eth.mining
true
> eth.hashrate
26908
> INFO [08-31|18:25:15.457] Successfully sealed new block            number=54 sealhash=9cbec0…3eff83 hash=6713b6…d8ab48 elapsed=17.900s
INFO [08-31|18:25:15.458] 🔗 block reached canonical chain          number=47 hash=2aacec…e3cd13
INFO [08-31|18:25:15.458] 🔨 mined potential block                  number=54 hash=6713b6…d8ab48
INFO [08-31|18:25:15.464] Commit new mining work                   number=55 sealhash=7c1ec0…e1902e uncles=0 txs=0 gas=0 fees=0 elapsed=5.741ms
INFO [08-31|18:25:16.057] Successfully sealed new block            number=55 sealhash=7c1ec0…e1902e hash=779e87…559768 elapsed=592.602ms
INFO [08-31|18:25:16.057] 🔗 block reached canonical chain          number=48 hash=affadc…d40e06
INFO [08-31|18:25:16.057] 🔨 mined potential block                  number=55 hash=779e87…559768
INFO [08-31|18:25:16.057] Commit new mining work                   number=56 sealhash=ba7a3f…6dfdd6 uncles=0 txs=0 gas=0 fees=0 elapsed=340.548µs
INFO [08-31|18:25:16.464] Successfully sealed new block            number=56 sealhash=ba7a3f…6dfdd6 hash=7de274…fd9532 elapsed=406.441ms
INFO [08-31|18:25:16.464] 🔗 block reached canonical chain          number=49 hash=30c4bd…1a143a
INFO [08-31|18:25:16.464] 🔨 mined potential block                  number=56 hash=7de274…fd9532
INFO [08-31|18:25:16.464] Commit new mining work                   number=57 sealhash=2d21d9…3e8a13 uncles=0 txs=0 gas=0 fees=0 elapsed=480.469µs
> eth.blockNumber
56
> INFO [08-31|18:25:23.457] Successfully sealed new block            number=57 sealhash=2d21d9…3e8a13 hash=96c1fa…bd43e0 elapsed=6.992s
INFO [08-31|18:25:23.458] 🔗 block reached canonical chain          number=50 hash=deea6c…81f3a7
INFO [08-31|18:25:23.458] 🔨 mined potential block                  number=57 hash=96c1fa…bd43e0
INFO [08-31|18:25:23.458] Commit new mining work                   number=58 sealhash=d544ce…813af8 uncles=0 txs=0 gas=0 fees=0 elapsed=767.398µs
```

##### マイニング進捗確認

実行中の合間に、下記コマンドを打ち込んで進捗を確認することもできる

`eth.mining` マイニング中ならtrueが帰ってくる
`eth.hashrate`　一秒間に何回のハッシュ計算ができているか
`eth.blockNumber`　現在のブロック数

##### マイニングの終了

`miner.stop()`
trueが帰って来ればOKとのことなのに、nullが帰ってきてしまった
（コンソールのマイニングは止まった）
だけど、eth.miningしたらfalseだったので、ちゃんと止まった模様

##### マイニング報酬確認

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

※単位がweiで表示されるので要注意！

`web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")`

とかませばEther単位に変換できる！


---
(:alien:振り返り:alien:)

マイニングがこんなに簡単にできるものだとは思いませんでした。。Gethの環境構築も作業が少なく嬉しいです。この知識を前提に、次はアンロックAPIを使ってみたいです！


以上！