BUILDING ROBUST SMART CONTRACTS WITH OPENZEPPELINをなめる


ERC20のチュートリアルである「[BUILDING ROBUST SMART CONTRACTS WITH OPENZEPPELIN](http://truffleframework.com/tutorials/robust-smart-contracts-with-openzeppelin#building-robust-smart-contracts-with-openzeppelin)」をなめます。
このチュートリアルはERC20対応トークンの開発からMetaMaskでの管理までの一連の流れを確認できる素晴らしいものですが、最新の環境では一部動かないところもあるので、その辺をメモしながら動作確認してみます。

>2017年12月末にzeppelin-solidityが1.5から1.6に変更されたこと。Ganacheがリリースされたことなどが影響してるみたいです。
importのPathにERC20が追加されたり、プロパティーがtotalSupplyからtotalSupply_に変更になったり。。。

## 環境

* truffle
* zeppelin-solidiy(1.6.0ってのがくせ者）
* Ganache
* metamask

あたりを使います。事前に準備しておくといいと思います。あ、macOSです。

* node(8.9.4)
* mpn(5.6.0)

という感じ。

### truffle

まずはtruffleをインストールしておきます。

```bash
npm install -g truffle
```

### zeppelin-solidity

これはグローバルではなくプロジェクト毎にインストールします（後述）。

>なので、後ほどプロジェクトフォルダにて、

>npm init -f
>npm install zeppelin-solidity


などとします。npm intはproject.jsonがないと怒られるので作成する場合。

### Ganache（ガナッシュ？）ɡəˈnɑːʃ

#### インストール（2018年3月29日更新）

今はインストーラー？があるみたいです。[こちら](http://truffleframework.com/ganache/)かダウンロードしてインストール。

#### インストール（以前の方法：最新環境ではエラー）

Ganacheをインストールします。startで起動するとGUIが起動します。

```bash
git clone https://github.com/trufflesuite/ganache.git
cd ganache
npm install
npm start
```

<img src="http://www.bluecode.jp/qiita/eth02/001.png" style="width:600px;border:0.5px solid #aaa;" width=600px>

### MetaMask

インストールや利用方法は他の記事に譲ります。
テストでは頻繁に初期化したりするので普通のEthereum管理環境とは分けたほうがいいです。

>本番利用はFirefoxで開発はChromeなど。

## チュートリアルをなめる

では、チュートリアルをなめていきます。

### 作業ディレクトリの作成

別になんでもいいのですが、ここではチュートリアルどおりにします。

```bash
cd
mkdir oz-workspace
cd oz-workspace
```

### サンプルを落とす

truffleが最初から用意しているファイル？をunboxコマンドで取得します。
プロジェクトの雛形がダウンロードされます。

```bash
truffle unbox tutorialtoken
```

### zeppelin-solidityをインストール

zeppelin-solidityをインストールします。

```bash
npm install zeppelin-solidity
```

### Tokenコントラクトを書く

いよいよERC20トークンコントラクトを書きます。
とりあえず下記の通り。

```sol:contracts/TutorialToken.sol
pragma solidity ^0.4.17;

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

contract TutorialToken is StandardToken {

    string public name = 'TutorialToken';
    string public symbol = 'TT';
    uint8 public decimals = 2;
    uint public INITIAL_SUPPLY = 12000;

    function TutorialToken() public {
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
    }
    
}
```

>importのPathにERC20が追加され、publicプロパティ名がtotalSupply_と_がつくようになったようです。

### マイグレーションを書く

TutorialTokenが展開されるようマイグレーションを書きます。

```js:migrations/2_deploy_contracts.js
var TutorialToken = artifacts.require("TutorialToken");

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

### truffle.js（参考）

なお、マイグレーション先のネットワーク（本番とかテストとか）はtruffle.jsで定義されています。
必要に応じてここを変更します。このtutorialでは、Garacheに展開されるようになっているようです。

```js:truffle.js
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    }
  }
};

```

### Ganacheの起動

起動していないなら起動します。起動していないとmigrateできません。

### コンパイルとマイグレーション

コントラクトをコンパイルし、Ganacheにmigrateします。

```bash
truffle compile
truffle migrate
```

>GranacheのTransactionsにトランザクションが追加されます。

<img src="http://www.bluecode.jp/qiita/eth02/002.png" style="width:600px;border:0.5px solid #aaa;" width=600px>


### （Web)コードの修正

このチュートリアルにはトークンを発行するWeb画面のサンプル（次フェーズで実行）がついてくるのですが、そのコードが最新環境（というかGanache）に対応していないようなので、コードを修正します。

9行目付近からを下記のようにします。

```diff:src/js/app.js
  initWeb3: function() {
    // Initialize web3 and set the provider to the testRPC.
    if (typeof web3 !== 'undefined') {
-      App.web3Provider = web3.currentProvider;
-      web3 = new Web3(web3.currentProvider);
+      App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:7545');
+      web3 = new Web3(App.web3Provider);
    } else {
      // set the provider you want from Web3.providers
-      App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545');
+      App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:7545');
       web3 = new Web3(App.web3Provider);
    }

```

>どうやらtestrpcにつながるコードが残っているようです。要はどんな場合も http://127.0.0.1:7545 につながるように変更します。

### トークン発行Webの起動

トークン発行Web画面を起動します。

```bash
npm run dev
```

バランスが表示されていればとりあえず成功です。

<img src="http://www.bluecode.jp/qiita/eth02/004.png" style="width:600px;border:0.5px solid #aaa;" width=600px>

### トークンの発行（送金）

Ganacheの上から2番目のアドレス（index1）をコピーして、WebのAddressにセットし、Amountを2000としTranferをクリックします。
「Transfer Successful!」と表示され、Balanceが減算されれば成功です。

>2番目をつかえとチュートリアルで書いているので。。。（1番目：index0以外ならいいかと）。

<img src="http://www.bluecode.jp/qiita/eth02/008.png" style="width:600px;border:0.5px solid #aaa;" width=600px>

また、GanacheのTRANSACTIONSに履歴が表示されます。



この履歴のTO_CONTRACT_ADDRESSをコピーしておきます（MetaMaskへのToken登録に必要となります）。

<img src="http://www.bluecode.jp/qiita/eth02/009.png" style="width:600px;border:0.5px solid #aaa;" width=600px>

### MetaMaskへの登録

MetaMaskで送金されたトークンを管理（見たり）できるようにします。

#### Custom RPCの登録

標準では当然ながら本番ネット（Main Network）を見にくので、左上のプルダウンからCustom RPCを選択し、Ganacheのアドレスを登録してやります。

http://127.0.0.1:7545 を登録します。

<img src="http://www.bluecode.jp/qiita/eth02/012.png" style="width:300px;border:0.5px solid #aaa;" width=300px>

#### 管理アカウント追加(index1)

先程、送金の対象としたアカウントを登録します。
登録には秘密鍵を利用しますので、Garacheの一番右の鍵アイコンをクリックして取得して、登録します。

<img src="http://www.bluecode.jp/qiita/eth02/015.png" style="width:300px;border:0.5px solid #aaa;" width=300px>

#### Tokenを追加

MetaMaskにてADD TOKENを行い、Token Contract Addressに、送金時履歴のTO_CONTRACT_ADDRESSをペーストします。
するとトークンのSymbole、Decimalなどが表示されるので、問題なければ追加します。

<img src="http://www.bluecode.jp/qiita/eth02/017.png" style="width:300px;border:0.5px solid #aaa;" width=300px>

送金した残高（単位）が見えます。

<img src="http://www.bluecode.jp/qiita/eth02/018.png" style="width:300px;border:0.5px solid #aaa;" width=300px>

#### 再送信

送信Webから再送信してみましょう。ちゃんとMetaMaskの値も加算されています。
以上です。

<img src="http://www.bluecode.jp/qiita/eth02/019.png" style="width:300px;border:0.5px solid #aaa;" width=300px>