Gethのインストールと採掘・送金〜mac編〜

#やること
スマートコントラクトに必要なEthereumクライアントであるgethをローカルにインストールしてHello worldまでいってみます。

#Gethの発音
Go言語で作られていて、Ethereumを扱うってことで、Go Ethereumの省略らしいですが、発音気になりませんか？
ゲース？
ギース？
ゴース？（goっていってるし）
ゲート？
ゴート？

####**正解発表**
Youtubeより
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Ancj8aJ9ARk/0.jpg)](https://youtu.be/Ancj8aJ9ARk)

というわけで
ゲース　なのですが思ったイントネーションと違いました。

#インストール
homebrewを使ってMac OSにインストールします

```sh
$ brew tap ethereum/ethereum
$ brew install ethereum
```

#プライベートネットの作成
[Ethereum入門](https://book.ethereum-jp.net/)ではGenesisファイルを作成していましたが、`--dev`を使うと簡単らしいのでこちらを採用

今回、ホームディレクトリ下のworkmフォルダにethtestをつくってここをデータに入れるところにします。

```sh
$ cd ~/work
$ mkdir ethtest
$ cd ethtest 
$ geth --dev --datadir .
```
これでチェーンが立ち上がりました。
この画面はプライベートチェーンがひたすら動いてるだけのものになるので、新しいターミナルウィンドウを開いて、
gethのコンソールを起動します。

```sh
$ cd work/ethtest
$ geth attach ipc:geth.ipc
```
これでコンソールが立ち上がりましたのでアカウントを作成します。

```console
> personal.newAccount("PW")
"0x699a41fb91251f35149d6c4d1bf6b4589a0c6e45"
```
`PW`がパスワードですが、空白でも可能みたいなので空白でも作ってみます

```console
> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0xd77bfea42da2508a0d4b06a4d457b2eb7a9b18df"
```

**確認**

```console
> eth.accounts
["0x94da4fca6188bf0510fc8b6b2ccfbc8f4ecc8527", "0x699a41fb91251f35149d6c4d1bf6b4589a0c6e45", "0xd77bfea42da2508a0d4b06a4d457b2eb7a9b18df"]
> 
> eth.coinbase
"0x94da4fca6188bf0510fc8b6b2ccfbc8f4ecc8527"
```
なにやら作った覚えがない`0x94da4fca6188bf0510fc8b6b2ccfbc8f4ecc8527`というアカウントがあるが、`--dev`を使ったからなのか、developer accountらしい

**アンロック**
いろんなところで使えるように全部ロックを解除しておきます。

```console
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x94da4fca6188bf0510fc8b6b2ccfbc8f4ecc8527
Passphrase: 
true

> personal.unlockAccount(eth.accounts[1])
Unlock account 0x699a41fb91251f35149d6c4d1bf6b4589a0c6e45
Passphrase: 
true

> personal.unlockAccount(eth.accounts[2])
Unlock account 0xd77bfea42da2508a0d4b06a4d457b2eb7a9b18df
Passphrase: 
true
```


#マイニング開始

```console
> miner.start()
null
```
スタートしたはいいものの、ぜんぜん採掘されている気がしない
（チェーンのコンソール画面もぜんぜん動かない）

```console
> eth.blockNumber
0
> eth.mining
true
> eth.hashrate
0
```
うーん
動いてはいるらしいけど何も採掘されない。
genesisブロックはあってもその先がなにもない。

```console
> eth.getBlock(0)
{
  difficulty: 1,
  extraData: "0x000000000000000000000000000000000000000000000000000000000000000094da4fca6188bf0510fc8b6b2ccfbc8f4ecc85270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  gasLimit: 6283185,
  gasUsed: 0,
  hash: "0x7400cf60082e03e0cb6b6aec88def6a3fc0adb83381ce559b8995bcdb2092abb",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 622,
  stateRoot: "0x095f9fff627b81c2338bbbc850cf0f992f7a2bf14629d88e01a4cf98bd4507f4",
  timestamp: 0,
  totalDifficulty: 1,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
> eth.getBlock(1)
null
```

調べてみると、`--dev`を使った場合はtransactionがないとマイニングしないとかなんとか
あちこちの記事では`--dev`を紹介してるのに結局はGenesisファイル使ってやってるのか、、、、


#送金
残高確認

```console
> eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[2])
0
```
めちゃくちゃいっぱい入ってた、、、、、
約10の77乗weiで、etherはweiの10の18乗倍なので、10の55etherくらい。とにかく大金

ケチなので1wei送ります。

```console
> eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:"1"})
"0x3d0f79a51bc273d266ca51a6c0d74c768d9291b93175277d2a0dba0d8f927d6e"
> eth.getBalance(eth.accounts[1])
1
```
1weiが入りました。新たなブロックができてることも確認

```console
> eth.getBlock(1)
{
  difficulty: 2,
  extraData: "0xd983010803846765746888676f312e31302e318664617277696e00000000000042050f8fbe7beff3c52c837bbaac4165581e900efb0866d1085872717bc7b04e75a697a3c5bb0f0d42c272c01a97d0c0791f60e846f904fe9f1a064d84d97d5e01",
  gasLimit: 6277051,
  gasUsed: 21000,
  hash: "0xcf16179e579c8051710093924bd74b1cae338c7bb87f10bd7ad6756f6153bd2d",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 1,
  parentHash: "0x7400cf60082e03e0cb6b6aec88def6a3fc0adb83381ce559b8995bcdb2092abb",
  receiptsRoot: "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 709,
  stateRoot: "0xe541a1749a31bc99c9ac3001c21f08a69444e75138b79182fb0ed5509b9c8d02",
  timestamp: 1522575943,
  totalDifficulty: 3,
  transactions: ["0x3d0f79a51bc273d266ca51a6c0d74c768d9291b93175277d2a0dba0d8f927d6e"],
  transactionsRoot: "0xef936d5e25d692542d4e4546971e807c0f057659f68ccb95e9447f911cfdfeca",
  uncles: []
```

調子出てきたのでもっと大量に送ってみます。

```console
> eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value: web3.toWei(1000, "ether")})
"0x1d77b0f001575c6a97bdcd543e302cf7f80061b223c7ab03392ab00e1b226377"
> eth.getBalance(eth.accounts[1])
1.000000000000000000001e+21
```

いっぱい送れました

```console
> eth.getTransaction("0x1d77b0f001575c6a97bdcd543e302cf7f80061b223c7ab03392ab00e1b226377")
{
  blockHash: "0x5af8f20225ac903132fbc9b3c1e83df5b339de50b03faa373e22adea290fd14f",
  blockNumber: 2,
  from: "0x94da4fca6188bf0510fc8b6b2ccfbc8f4ecc8527",
  gas: 90000,
  gasPrice: 1,
  hash: "0x1d77b0f001575c6a97bdcd543e302cf7f80061b223c7ab03392ab00e1b226377",
  input: "0x",
  nonce: 1,
  r: "0x4394335e5a41f157c25089f209f74ec9b776b2ad43183e3ce83980ba64624f22",
  s: "0x298217349eaea647f03eaf84ec5b7be42270906f2e127dbb5ac71103be25acb4",
  to: "0x699a41fb91251f35149d6c4d1bf6b4589a0c6e45",
  transactionIndex: 0,
  v: "0xa96",
  value: 1e+21
}
```
9000gas取られてるっぽいですね。わかりやすく1→2で送金

```console
> eth.sendTransaction({from:eth.accounts[1], to:eth.accounts[2], value: web3.toWei(500, "ether")})
"0x938d0ecc3b6c966409b43784e89c263fc335cfc5ae1f384b3000a5fde94a8f2d"
> eth.getBalance(eth.accounts[1])
499999999999999958001
```
gas取られてますね

続いてsolidityを使用したHello worldをしてみようと思います