[blockchain.nagoya] 7/12 ERC20トークン ハンズオン

#概要
7/12(金)に行われるblockchain.nagoyaのイベント「ERC20トークン ハンズオン」の資料です。
Rinkbyネットワークへのスマートコントラクトのデプロイ, ERC20トークンの送金を行います。

#開発環境
- Google Chromeのみ

#セットアップ
- solidityの総合開発環境(IDE)である[remix](https://remix.ethereum.org/#optimize=false&evmVersion=null&version=soljson-v0.5.1+commit.c8a2cb62.js)を開く

- ETHのウォレットであるメタマスクを[インストール](https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=ja)する
- [メタマスクのセットアップ方法のページ](https://kasobu.com/metamask/#MetaMask-4)の「Metamaskのウォレット作成方法」の項目をそのままする。
- ネットワークを「Rinkebyテストネットワーク」に設定する

<img width="360" alt="スクリーンショット 2019-07-02 20.33.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/c546c7ad-6977-6ec6-deab-0396a7ba45aa.png">

- [rinkeby testnet faucetのページ](https://faucet.rinkeby.io/)でRinkebyネットワークのETHを調達する。

TwitterでETHアドレスをそのままコピペしてツイート
<img width="605" alt="スクリーンショット 2019-07-02 20.36.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/ca1ded58-26fd-d522-3151-08e3f2212562.png">

そのツイートのURLをコピー
<img width="1173" alt="スクリーンショット 2019-07-02 20.37.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/99c951a4-4f32-2e1d-29f8-575ee0e5a3de.png">

URLをfaucetのページに貼り付けてGive me Etherします
<img width="902" alt="スクリーンショット 2019-07-02 20.39.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/1a637354-0be4-2050-4deb-62dc01e49b7e.png">

#スマートコントラクトの作成
[openzeppelin-solidity](https://github.com/OpenZeppelin/openzeppelin-solidity)というライブラリがERC20トークンのスマートコントラクトを書いてくれているので, それらを継承する形で使います

- [ERC20.sol](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/ERC20.sol)
- [ERC20Detailed.sol](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/ERC20Detailed.sol)

こちらが今回使用するSampleTokenコントラクトになります
(ハンズオンで解説します！）

```:SampleToken.sol
pragma solidity ^0.5.0;

import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";

contract SampleToken is ERC20, ERC20Detailed {
    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals,
        uint256 initSupply
    ) ERC20Detailed(name, symbol, decimals)
      public 
    {
        _mint(msg.sender, initSupply);
    }
}
```
[Remix](https://remix.ethereum.org/#optimize=false&evmVersion=null&version=soljson-v0.5.1+commit.c8a2cb62.js)を開いてファイルを作成します

+ボタンを押して、

<img width="1438" alt="スクリーンショット 2019-07-02 20.50.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/0eab5d09-ea9a-3683-e4a3-2ddec4c838a1.png">

SampleToken.solという名前でファイルを作成します
<img width="1297" alt="スクリーンショット 2019-07-02 20.53.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/49f80b01-c2fa-8733-9d0f-de33cb7c0cf9.png">

上のコントラクトコードをそのままのファイルに貼り付けます
<img width="1258" alt="スクリーンショット 2019-07-02 20.54.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/60175228-00da-c23a-0c2b-9ce3e0da83b3.png">

#スマートコントラクトのコンパイル
まずコントラクトをコンパイルする機能とデプロイする機能を使用可能にします。
左端のバーにあるプラグのマークをクリックします。
<img width="1193" alt="スクリーンショット 2019-07-02 20.55.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/d3ea8dbb-a697-8613-a3ec-4a17d743e521.png">

```Deploy & Run Transactions```と```Solidity Compiler```をActivateしましょう
<img width="1136" alt="スクリーンショット 2019-07-02 21.00.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/b9bdc5cf-4987-a715-b103-185e042b85ec.png">

左のバーで```Solidity Compiler```を選択して、```Compile SimpleToken.sol```のボタンをクリックします。
<img width="1427" alt="スクリーンショット 2019-07-02 21.03.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/73ea921a-ce57-f926-07c2-47b9169222e3.png">

#スマートコントラクトのデプロイ
次にスマートコントラクトをデプロイします。
```Environment```を```Injected Web3```に設定します。
```Deploy```のところに```constructer```の引数を入力します。

```
"NagoyaCoin", "NC", 18, 10000000000
```
そして```Deploy```をクリックします。
<img width="934" alt="スクリーンショット 2019-07-02 21.08.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/72c1d6bb-07be-0d45-e42a-c4bf685fe5b4.png">

すると、メタマスクが起動するので```確認```を押しましょう。
<img width="764" alt="スクリーンショット 2019-07-02 21.12.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/c4882ad6-1560-d359-f9a2-32d9e2dd7288.png">

#ERC20トークンを送金する
現在、発行されたトークンはスマートコントラクトをデプロイしたアカウントが全て持っています。
そのアカウントから別のアカウントにトークンを送金してみましょう。

メタマスクで2つめのアカウントを選択します
<img width="359" alt="スクリーンショット 2019-07-02 21.18.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/5fc815aa-5814-eefb-1d76-4b0e2ef40d96.png">

アドレスをコピーして、再び1つめのアカウントに戻します。
<img width="353" alt="スクリーンショット 2019-07-02 21.19.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/a147d5c9-9009-3e94-3e6e-502959e3919b.png">

では送金しましょう。
Deployed Contractsにあるタブを開くと関数が実行できます。

```transfer``` の横に先ほどコピーした2つめのアカウントのアドレスと、送る量を入力します

```
"2つめのアカウントのアドレス", 1000
```

そしてtransferをクリックします。
<img width="1177" alt="スクリーンショット 2019-07-02 21.22.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/b8ddc996-1518-5355-01c6-226310f54b4c.png">

メタマスクが開くので```確認```を押しましょう。
うまくいくと下のように表示されます。

<img width="982" alt="スクリーンショット 2019-07-02 21.34.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/a0fe65f5-e434-244a-c3ba-2e7e8db3a920.png">


2つめのアカウントのアドレスを入力して```balanceOf```関数を実行すると、
1000トークンが送られていることが確認できます。
<img width="380" alt="スクリーンショット 2019-07-02 21.27.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326169/eead0240-3af3-747c-c609-1f9c5cc88dc1.png">

#終わりに
お疲れ様です！
Rinkebyネットワークへのスマートコントラクトのデプロイ、トークンの送金ができました！

時間があれば、他の人にETHアドレスを教えてもらって送金するなどしてみてください！