Blockchainハッカソンの振り返り（その２）〜Etherを送金〜

今回は機械学習コミュニティ「[Team AI](https://www.team-ai.com/)」が開催している**ブロックチェーンハッカソン**の振り返りを書こうと思います！
できる限り「Short & Simple」を心がけます。
なお、私自身ブロックチェーン初学者なので、内容に誤り等ありましたらご指摘いただけると幸いです。

## 今回やったこと
今回のハッカソンでは以下のことを行いました。

- Etherの送金（プライベートネット上）
    - トランザクションの確認
    - 手数料の確認
- Contractの作成
    - Node.js＆npmのインストール
    - Truffleのインストール
    - Browser-Solidityのインストール

Contractの作成については、Browser-Solidityのインストールでちょっと躓いてしまったので残念ながら作成までたどり着けていません。なので今回は割愛して、作成までできたら改めてまとめようと思います。
なので今回のテーマは「Etherの送金」についてです。
これまでやってきたこととして、必要に応じて以下の記事もご参照ください。

- [Blockchainハッカソンの振り返り（その１）〜Etherを採掘！〜](https://qiita.com/nagata03/items/12c3ffb2f3de8b0f3006)
- [ブロックチェーンにおけるトランザクションとは](https://qiita.com/nagata03/items/b2a4a2a3d1e5081be28b)
- [ブロックチェーンのトランザクション手数料とは](https://qiita.com/nagata03/items/ba64e882861fcf127d87)

ちなみにパソコンはMac（OSバージョンは10.12.6）です。

## Gethの起動＆アカウントの確認
まずはGethを起動しましょう。デゥレクトリなどは上述の記事で作成したものです。

```
$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/ether-practice/testnet console 2>> ~/ether-practice/testnet/geth.log
```

アカウントの確認。

```
> eth.accounts
["0x5af6f4139ecd7b0497e36a26e0c5828efad55be1", "0xd7bd6786ced3bf0ece162db41c8579fb5ac08035"]
```

各アカウントのetherの持ち高を確認。

```
> eth.getBalance(eth.accounts[0])
950000000000000000000

> eth.getBalance(eth.accounts[1])
435000000000000000000
```

単位が「wei」になっていますが、`accounts[0]`が`950ether`、`accounts[1]`が```435ether```保持しています。

## Etherの送金

`accounts[1]`から`accounts[0]`に`35ether`を送金してみます。

実際には送金時に送金元のアカウントのロックの解除が事前に必要なので、まずはロックを解除します。

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

上記の通りパスワードを求められるので、アカウント作成時に設定したパスワードを入力すればロックを解除できます。
また、送金の際は採掘処理をバックグラウンドで実行しておく必要があるので、採掘しておきましょう。

```
> miner.start(1)
```

etherを送金する準備が整いました。早速送金しましょう。

```
> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(35, "ether")})
"0x3c7d835a20aa4211dd02812cd293cc3aa182f9a3e6f0c974fba75bc09da598a1"
```

持ち高を確認します。

```
> eth.getBalance(eth.accounts[0])
985000000000000000000

> eth.getBalance(eth.accounts[1])
399999622000000000000
```

`accounts[0]`の持ち高は`35ether`増えて`985ether`になっています。`accounts[1]`の持ち高はというと、、、`35ether`以上減っていますね。具体的には`35.000378ether`減っています。この`0.000378ether`がトランザクション手数料です。

## トランザクション情報の確認
トランザクション情報を確認してみましょう。`eth.getTransaction(tx_id)`コマンドで確認できます。`tx_id`には送金した際に出力されたトランザクションＩＤを指定します。

```
> eth.getTransaction("0x3c7d835a20aa4211dd02812cd293cc3aa182f9a3e6f0c974fba75bc09da598a1")
{
  blockHash: "0xd66268be66394441a9861c82d4e75d07b600f7f00f0a303aa462407aa16bcb0c",
  blockNumber: 726,
  from: "0xd7bd6786ced3bf0ece162db41c8579fb5ac08035",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x3c7d835a20aa4211dd02812cd293cc3aa182f9a3e6f0c974fba75bc09da598a1",
  input: "0x",
  nonce: 0,
  r: "0x9b70974d01bc8ac3a1c8896b55b916d5a2cd774c64b27975b97fc313c84d8e39",
  s: "0x7d1642382bacca2c0f581ca0e71de7afd881611a4adfaec9dd4547f31ed76204",
  to: "0x5af6f4139ecd7b0497e36a26e0c5828efad55be1",
  transactionIndex: 0,
  v: "0x41",
  value: 35000000000000000000
}
```

- gas
    - トランザクション処理時のgasの使用量の「最大値」を示しています。（実際のトランザクション処理時のgasの使用量ではないので注意！）
- gasPrice
    - トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料（wei）を示しています。

今回のトランザクションにどれだけのgasを使用したのかというと、

```
トランザクション手数料(wei) / gasPrice(wei) = 使用したgas
```

なので、

```
378000000000000 / 18000000000 = 21000
```

`21,000 gas`が使用されたことがわかります。

ということで今回はここまでです。

## 参考文献
- [Ethereum 事始め](https://book.ethereum-jp.net/first_use/)