ERC20トークンをparityを使ってKovan(testnet)にdeployする

## ERC20トークンとは

ERC20トークンとは、Ethereumのcontractで、以下のfunction/eventを実装したものであり、暗号通貨の一種として機能する。

```solidity
contract ERC20 {
  function totalSupply() constant returns (uint totalSupply);
  function balanceOf(address _owner) constant returns (uint balance);
  function transfer(address _to, uint _value) returns (bool success);
  function transferFrom(address _from, address _to, uint _value) returns (bool success);
  function approve(address _spender, uint _value) returns (bool success);
  function allowance(address _owner, address _spender) constant returns (uint remaining);
  event Transfer(address indexed _from, address indexed _to, uint _value);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}
```

ここでは、これに基づいたトークンを作ってtestnet(ここではparityを利用してKovanにdeployしてみます)にて公開するところまで行う。

[Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう](https://qiita.com/amachino/items/8cf609f6345959ffc450)という記事でERC20トークンの実装手順、その説明が丁寧に記述されているが、ここではtestrpc(local端末だけのテスト環境)ではなく、testnet(RopstenやRinkeby、Kovan等)にdeployするところを目標にしたい。

## parityのセットアップ

parityとはEthereumクライアントの一種で、gethみたいなもの。parityを使ってKovanに接続する。

parityは以下のようにセットアップできる。

```bash
# parityのインストール
$ brew install parity

# Kovanにつないで起動する(はじめは同期に数時間かかる)
$ parity --chain kovan
```

## ERC20トークンを実装する

```bash
# プロジェクトの雛形作成
$ mkdir ~/erc20-token
$ cd ~/erc20-token
$ truffle init

# package.jsonの作成
$ npm init -f

# OpenZeppelinを導入
$ npm i zeppelin-solidity --save

# contractの雛形作成(contracts/MyToken.solが作成される)
$ truffle create contract MyToken
```

コントラクト(`contracts/MyToken.sol`)の中身の実装は以下のようにする。

```contracts/MyToken.sol
pragma solidity ^0.4.17;

import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';

contract MyToken is StandardToken {
  string public constant name = "MyToken";
  string public constant symbol = "MTK";
  uint256 public constant decimals = 0;
  uint256 public constant INITIAL_SUPPLY = 1000000;

  function MyToken() {
    totalSupply = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}
```

マイグレーションファイル(`migrations/2_deploy_contracts.js`)を作成し、以下のように実装する。

```migrations/2_deploy_contracts.js
const MyToken = artifacts.require("./MyToken.sol");

module.exports = function(deployer) {
  deployer.deploy(MyToken);
};
```

実装が完了したので、コンパイルする。

```bash
$ truffle complie
```

## parityを使ってKovanにdeployする

<img width="1668" alt="Screen Shot 2018-01-05 at 22.11.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/122365/37c5e95e-15d6-477e-8993-f34cba53b6af.png">

上のCONTRACTSタブを選択して、 `+ DEPLOY` を選択する。`contract name`には任意の名前を入れる。これは自分がparityでこのcontractを管理する時に表示されるだけなので自分がわかれば良いしあとで変更が可能。`abi/solc combined-output`には、先ほど、`truffle compile`した時に生成された`build/contracts/MyToken.json`の`abi`の配列をまるまるコピーして貼り付ける。`code`には`abi`のすぐ下にある`bytecode`の中身を貼り付ける。

<img width="1663" alt="Screen Shot 2018-01-05 at 22.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/122365/1f19cdbf-9a97-dd02-5d04-8c2085fd5046.png">


`CREATE`を押すと、パスワードを聞かれてdeployの実行に進む。6 confirmationsがつくとdeployが完了する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122365/737b6cda-92b4-b381-e486-0f2c876b489b.png)

## TokenRegistryを使ってKovanにトークンの登録もしてみる
これをしなくてもmetamaskでトークンのアドレスを登録するとdecimalsや名前が表示されたので、やらなくても良いかもしれない...。

(注：以下の手順には、kovanのアカウントで1ETHが必要。参考までに、[こちら](https://gitter.im/kovan-testnet/faucet)で自分のアドレスを送ると **Kovan** の5ETHがすぐもらえます。)

parityの画面のAPPLICATONSタブを選択して、`TOKEN REGISTRY`をクリックする。すると、以下のような画面になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122365/2a668368-1e1a-cd5f-6c0e-33473f61711a.png)

次に`REGISTER TOKEN`を選択する。以下の画像のように必要事項を埋めて登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122365/2020c01b-381b-5ac0-c148-6fa7c15f7133.png)

これでKovanに、自分が作ったtokenが登録された、はず。

## まとめ
ロジックを持たない簡単なトークンを作るだけであれば、数行でできてしまうことがわかる。ただ、ICOするのであれば、これにテストを書いたり、ロジックをどうもたせるのか、アップデートする時にはトークンアドレスを変えることなく、どのようにしてロジックだけ変更するのか、ということも考慮しないといけない。

[githubにも上げておきました](https://github.com/ngo275/token-sample)