サルでもわかるEthereum,DAppsの使い方,作り方 その1 ～送金をしてみる編～

# 概要
実際にEthereumを触りながら、EthereumとDAppsに慣れていきましょうという記事です。
※筆者の勉強の備忘録を兼ねているので、間違い等あったらご連絡おねがいします。

# 仮想マシンの構築
この記事ではUbuntu 16.04(Xenial)を使います。
(わかる方は以下を読み飛ばしてください)

筆者はWindowsにVagrant＋Virtual BOXでUbuntuを動かしています。
Vagrantとかの使い方は以下を参考にしてください。
[ローカル開発環境の構築 [Windows編] (全14回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_localdev_win_v2)

Vagrantの構成(Vagrantfile)は以下の通り。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.provider :virtualbox do |vb|
  end
end
```

# Gethのインストール
Gethはgo-ethereumの略で、Ethereumnのコマンドラインツールです。

JavaScript(?)の記述で送金とかコントラクトのデプロイ、実行ができます。

以下のサイトまんまです。
[Installing Geth · ethereum/go-ethereum Wiki · GitHub](https://github.com/ethereum/go-ethereum/wiki/Installing-Geth)

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

# ローカルでブロックチェーンを使ってみる
ブロックチェーンを保存するために```local_bc```フォルダを作ります。
Vagrantの共有フォルダ内につくるとエラーが発生するので,今回はユーザのホームディレクトリ内につくります。

```
mkdir ~/local_bc
```

以下のコマンド(`geth`)で、ブロックチェーンの保存先を指定して(`--datadir`)、ブロックチェーンを開発者モード(`--dev`)でつくります。

開発者モードでつくると、あらかじめ大量のETHを持っているアカウントが用意されていたり、マイニングが一瞬で終わったりします。(もちろんここでのETHは外部で仕様できません)

`--networkid`はネットワークのIDを指定します。1だと本番ネット(実際のEthereumのネットワーク)を使ったりします。1~4はあらかじめ本番ネットやテストネットがアサインされているようです。他の数値を指定した場合には自身のローカルになる模様(?)

詳しくは[Command Line Options · ethereum/go-ethereum Wiki · GitHub](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options)を参照してください。


```
geth --networkid "123" --datadir "~/local_bc" --dev console
```

2回目以降は以下でも可

```
geth --datadir "~/local_bc" console
```


# 送金してみる
実際にETHの送金をやってみます。

開発者モードでブロックチェーンをつくったので、デフォルトで大量のETHを所有しているアカウントがあります。

Gethの起動

```
geth --datadir "~/local_bc" console
```

アカウントの一覧の取得(配列が返ってきます)

```javascript:
> eth.accounts
["0x6c8a35d433949f309ca7d0a368ceeb9f0103cc84"]
```

アカウントが所持してるETHの取得(めちゃくちゃ大量に入ってます)

```javascript:
> eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
```

`eth.getBalance(指定のアドレス)`で動くので、以下でも同じ動作をします。

```javascript:
> eth.getBalance("0x6c8a35d433949f309ca7d0a368ceeb9f0103cc84")
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
```

アカウントを新規作成します。(Passphrase:のあとに入力してもなにも表示されませんが、ちゃんと入力されてます)

```javascript:
> personal.newAccount()
Passphrase:
Repeat passphrase:
```

アカウントの一覧を取得すると、アカウントが増えてることがわかる。

```javascript:
> eth.accounts
["0x6c8a35d433949f309ca7d0a368ceeb9f0103cc84", "0x235bfa092771435de4a9dede1e6b6243562f214d"]
```

送金するトランザクションを作成してみる。
以下は```eth.accounts[0]```のアドレスから```eth.accounts[1]```に123ETH送金するというトランザクションです。

`value`は最小単位のweiで指定されているので、`web3.toWei()`で変換してます。
単位の話は[イーサリアムの通貨単位　＜wei・ether・tetherなど＞ - とってもやさしいビットコイン](http://www.tottemoyasashiibitcoin.net/entry/2017/10/01/090847)がわかりやすいです。

以下のように送金トランザクションを実行しようとすると、

```javascript:
> eth.sendTransaction({
    from: eth.accounts[0],
    to: eth.accounts[1],
    value: web3.toWei(123, "ether")
})
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
```

怒られます。

これは送金する際に、認証が必要ですよっていうことです。

以下のようにunlockしてあげます。(eth.accounts[0]のパスワードは""です。つまり、なにも入力しないでエンターでOKです。)

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

もう一度実行してやると、

```javascript:
> eth.sendTransaction({
    from: eth.accounts[0],
    to: eth.accounts[1],
    value: web3.toWei(123, "ether")
})
INFO [05-01|06:02:44] Submitted transaction                    fullhash=0xe9f940fa4aa8973f097ce7b889f6156ce34e5d624a58335ec0ef1ff747ed6219 recipient=0xDb3A44eAf1F2aaF03bFfe2013Ee6A33F58Ca534A
"0xe9f940fa4aa8973f097ce7b889f6156ce34e5d624a58335ec0ef1ff747ed6219"
```

成功するはずです。

`eth.getBalance(eth.accounts[1])`とかやってあげると、ちゃんと残高が増えているはずです。

# 次回予告

次回は[簡単なスマートコントラクトの実行編](https://qiita.com/redshoga/items/c20281e0d3b6eee7b115)です。