Ethereumではじめてのブロックチェーン

# 目次

1. Ethereumとは
2. gethのインストールと起動
3. ちょっと触ってみる。

# 1.Ethereumとは

Ethereumとは、Vitalik (ヴィタリック)が作ったパブリックブロックチェーンのプロダクト。
2013年12月以降から開発が進められていて、ビットコインの次に古い代表的なプロダクト。
ビットコインとの大きな違いは、スマートコントラクトと呼ばれるプログラムをEthereum Vurtual Macine(EVM)上で動作させられる点で、仮想通貨だけではなく、様々なサービスを非中央集権的に運営できるプラットフォームである。

Ethereum上ではEtherという規定通貨で取引がされて、Etherの送金やスマートコントラクトの実行にはEtherが手数料として支払われる。そしてその手数料はビットコインと同様、マイニングに成功した人に支払われる。

話すと長くなるので、説明はこの辺で。

# 2.gethのインストールと起動

Ethereumは様々な言語で記述されており、共通のインターフェースによってそれらが同じネットワークに参加している。
今回は最もポピュラーで開発の進んでいるgolangで書かれたEthereumである「geth」を扱う。

### 環境

* MacOS 10.14.6
* Homebrew 2.1.16

### インストール

``` bash:インストール

$ brew tap ethereum/ethereum
$ brew install ethereum
```
``` bash:確認

$ geth --help
```
↓こんな感じのメッセージがダーッとでたらインストールは成功

>NAME:
   geth - the go-ethereum command line interface
   Copyright 2013-2019 The go-ethereum Authors
USAGE:
   geth [options] command [command options] [arguments...]
VERSION:
   1.9.8-stable
~~~~~~~省略~~~~~~~

### 初期設定

今回は手軽に遊べる自分だけのEthereumNetworkを作ります。

``` bash:フォルダ作り
$ mkdir /Users/{username}/ethereum
$ cd /Users/{username}/ethereum
$ vi genesis.json
# 下のgenesis.jsonの内容をコピーします。
```

``` json:genesis.json
{
  "config": {
    "chainId": 10,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0
  },
  "alloc": {},
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x20000",
  "extraData": "",
  "gasLimit": "0x2fefd8",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}
```


``` bash:起動
$ geth --datadir /Users/｛username｝/ethereum/ init /Users/｛username｝/ethereum/genesis.json
#初期化
$ --networkid "10" --nodiscover --datadir "/Users/{username}/ethereum" console 2>> /Users/{username}/ethereum/geth_err.log
#起動！
```

コンソールが立ち上がりました。

``` bash:コンソール
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.8-stable/darwin-amd64/go1.13.4
at block: 73 (Mon, 02 Dec 2019 12:16:56 JST)
 datadir: /Users/{username}/ethereum
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>
```

起動まで完了

# 3.ちょっとさわってみる

### アカウントを作ってみよう。

コンソール画面でいろいろコマンドを打ってみる。

``` bash:アカウント作成もろもろ
> personal.newAccount("password")
"0x0e3f2f3f55ab79459c7368206019a35679f19d09"
>
#パスワードと公開鍵のセットができました。ビットコインと一緒で公開鍵がこのアカウントの口座となります。

> eth.accounts
["0x0e3f2f3f55ab79459c7368206019a35679f19d09"]
>
#このノードで作ったアカウントの一覧。

> eth.coinbase
"0x0e3f2f3f55ab79459c7368206019a35679f19d09"
#このノードがマイニングに成功したときに報酬が振り込まれるアカウントをコインベースと呼ぶ。
#設定で変えられるが、最初に作ったアカウントが自動でコインベースになる。

> eth.getBalance("0x0e3f2f3f55ab79459c7368206019a35679f19d09")
0
#なんにもしていないので、当然残高は0

> eth.blockNumber
0
#なんにもしていないのでブロックはまだ0
```

### レッツマイニング

``` bash
> miner.start()
null
>
#マイニングできるまでちょっと待ちます。

> eth.blockNumber
42
#ブロックが進んでる！

> eth.getBalance("0x0e3f2f3f55ab79459c7368206019a35679f19d09")
146000000000000000000
#大金持ち！
```

### 送金してみる

```bash
> personal.newAccount("test")
"0x3e20bd9cfb18533533126d0d4086dc1bad4ae924"
#もうひとりユーザーを作る。

> eth.sendTransaction({from:"0x0e3f2f3f55ab79459c7368206019a35679f19d09", to:"0x3e20bd9cfb18533533126d0d4086dc1bad4ae924", value: 100})
Error: authentication needed: password or unlock
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at <anonymous>:1:1
#最初に作ったアカウントから新しく作ったアカウントに送金しようとしたら
#パスワードアンロックしろ！と怒られる。

> personal.unlockAccount("0x0e3f2f3f55ab79459c7368206019a35679f19d09", "password", 100)
true
#パスワードをアンロック(最後の数字は何秒間アンロックするか)

> eth.sendTransaction({from:"0x0e3f2f3f55ab79459c7368206019a35679f19d09", to:"0x3e20bd9cfb18533533126d0d4086dc1bad4ae924", value: 100})
"0xcbab37f0f38e35f5b2485f8e8a8bbd4daf20784a122def2ec5d84db438be28a6"
>
#もう一回送金したら行けました。(出てきた文字列はトランザクションID)

> eth.getBalance("0x3e20bd9cfb18533533126d0d4086dc1bad4ae924")
100
>
#送金先の残高が増えてたので、ちゃんと送金できました。(この間マイニングをminer.stop()で止めとくと取引は成功してるのに送金されない様が見える。)
```

一通りうごかせましたね。今回はこのへんで。