LoginSignup
3
3

More than 5 years have passed since last update.

BUILDING ROBUST SMART CONTRACTS WITH OPENZEPPELINをなめる

Last updated at Posted at 2018-02-06

ERC20のチュートリアルである「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をインストールしておきます。

npm install -g truffle

zeppelin-solidity

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

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

npm init -f
npm install zeppelin-solidity

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

Ganache(ガナッシュ?)ɡəˈnɑːʃ

インストール(2018年3月29日更新)

今はインストーラー?があるみたいです。こちらかダウンロードしてインストール。

インストール(以前の方法:最新環境ではエラー)

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

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

MetaMask

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

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

チュートリアルをなめる

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

作業ディレクトリの作成

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

cd
mkdir oz-workspace
cd oz-workspace

サンプルを落とす

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

truffle unbox tutorialtoken

zeppelin-solidityをインストール

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

npm install zeppelin-solidity

Tokenコントラクトを書く

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

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が展開されるようマイグレーションを書きます。

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

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

truffle.js(参考)

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

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

Ganacheの起動

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

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

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

truffle compile
truffle migrate

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

(Web)コードの修正

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

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

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画面を起動します。

npm run dev

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

トークンの発行(送金)

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

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

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

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

MetaMaskへの登録

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

Custom RPCの登録

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

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

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

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

Tokenを追加

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

送金した残高(単位)が見えます。

再送信

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3