「Ethereum入門」の手順確認（環境構築〜ether送金まで）

　Ethereum技術入門書「[Ethereum入門](https://book.ethereum-jp.net/)」を元に環境構築〜ether送金までの手順をOSX/Ubuntu環境で手順確認してみました。

##0. 前提条件
以下の環境で環境構築を実施しています。
- mscOS HighSiera(10.13.5) / Ubuntu 16.04 LTS

##1. Ubuntu環境を構築
1. OSXに[Oracle VM VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)を導入。
2. [Ubuntu 16.04 LTS](http://ftp.jaist.ac.jp/pub/Linux/ubuntu-jp-cdimage/releases/16.04/ubuntu-ja-16.04-desktop-amd64.iso)をダウンロード。
3. VirtualBoxにUbuntu 16.04 LTSを導入。（詳細手順は省略）
4. 環境構築時に、再起動後「intel_rapl: no valid rapl domains found in package 0」とよく出るが、その際はVirtualBox上でVMをリセットで対処。

##2. 事前準備（１）

- カーネルの更新 

```
sudo apt-get dist-upgrade
```

- そして、いつものおまじない。

`sudo apt-get update`と`sudo apt-get upgrade`。

##3. 事前準備（２）
　Vimなのにと言われそうですが、、手抜きをするため、Vimでコピペが出来るように事前準備。
1. VirtualBox上で、「デバイス>Guest Additions CDイメージの挿入」を実施。
2. VirtualBox上で、「デバイス>クリップボードの共有>双方向」を有効に。
3. Terminal上で、`sudo reboot`で再起動。
4. クリップボードを使いたいので、`sudo apt-get install vim-gnome`でvim-gnomeをインストール。


##4. Gethをインストール

-  Gethインストール

```
sudo add-apt-repository -y ppa:ethereum/ethereum
```

```
sudo apt-get update
```

```
sudo apt-get install ethereum
```

- gethのインストール確認

```
geth --help
```
→オプションが表示されていればOK。

- gethのアップデート

```
sudo apt-get update
```
```
sudo apt-get upgrade
```
→自分が実施した時はアップデートはなし。

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

- 格納ディレクトリの作成

```
mkdir /home/[ユーザ名]/eth_private_net
```
→手順書上は、ubuntuになっているが、ユーザ名で作成する。以下、[ユーザ名]は同様。

- myGenesisファイルの作成

```
vim myGenesis.json
```
→以下の内容をコピペして、Vimを使ってgenesisファイルを作成する。


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

##6. Gethをプライベート・ネットで起動

- genesisブロックの初期化

```
geth --datadir /home/[ユーザ名]/eth_private_net init /home/[ユーザ名]/eth_private_net/myGenesis.json
```
→上記コマンドで、myGenesis.jsonの内容で初期化。

- Gethの起動

```
geth --networkid "15" --nodiscover --datadir "/home/[ユーザ名]/eth_private_net" console 2>> /home/[ユーザ名]/eth_private_net/geth_err.log
```
上記コマンドでGethを起動。Geth JavaScript consoleが立ち上がるので、以降はGethプロンプトで実施する。

##7. 口座の作成
　口座１から口座２へ送金を実施するため、口座を２つ作成します。


- ノードに登録された口座の事前確認

```
eth.accounts
```
→まだ口座を作成していないので、ここでは空のリストが返ってくる。

- 口座１の作成

```
personal.newAccount("[パスワード1]")  ※パスワードは任意
```

→`eth.accounts[0]`を実施した際に表示される口座。


- 口座２の作成

```
personal.newAccount("[パスワード2]")  ※パスワードは任意
```
→`eth.accounts[1]`を実施した際に表示される口座。

- 口座の確認

```
eth.coinbase
```
→上記コマンドで、プライマリー口座の確認が出来ます。デフォルトでは、`eth.accounts[0]`を実行した際に表示される口座。

-  etherの採掘開始

```
miner.start()
```
→上記コマンドで採掘開始します。今回の手順では、ネットワーク上で自分しかマイニングをしていないので、ether送金をする場合は、採掘をバックグラウンドで実行している必要がある。

- 採掘中かどうかの確認

```
eth.mining
```
→上記コマンドで採掘されているか分かる。採掘されていれば、trueが返る。

- 採掘状況の確認

```
eth.blockNumber
```

→上記コマンドでブロックチェーンに何番目のブロックまで連なっているのか（＝ブロック高）を確認。これがなかなか採掘されない。最初の10分～30分の間、DAGの生成が行われ、その後採掘となるので、結構時間がかかる。（しばらくしてやっと10）

##8. etherの送金

- etherの残高の確認。

```
eth.getBalance(eth.accounts[0])
```
→送金を行う前にetherの残高を事前に確認するため、上記のコマンドで、1番目の口座の残高を確認。（自分の場合は500 ether貯まってました）

- 口座のロック解除

```
personal.unlockAccount(eth.accounts[0])
```
→送金するためには、事前に口座のロック解除が必要なので、上記コマンドでロック解除します。

- 送金の実行

```
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
```
→口座１から口座２へ``5ether``を送金します。

- 口座２の残高確認

```
eth.getBalance(eth.accounts[1])
```
→口座２の残高を確認を行い、無事送金が完了していることを確認します。これで完了！



##参考文献
- [Ethereum入門](https://book.ethereum-jp.net/)
- [Windows10のVirtual BoxでUbuntu 16.04 LTSの仮想マシンを作成](https://ts0818.hatenablog.com/entry/2017/12/31/215618)
- [Ubuntu/System program problem detectedの対処方法](http://linux.just4fun.biz/?Ubuntu/System%20program%20problem%20detected%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95)