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トークンコントラクトを書きます。
とりあえず下記の通り。
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が展開されるようマイグレーションを書きます。
var TutorialToken = artifacts.require("TutorialToken");
module.exports = function(deployer) {
deployer.deploy(TutorialToken);
};
truffle.js(参考)
なお、マイグレーション先のネットワーク(本番とかテストとか)はtruffle.jsで定義されています。
必要に応じてここを変更します。このtutorialでは、Garacheに展開されるようになっているようです。
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行目付近からを下記のようにします。
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の値も加算されています。
以上です。