Zeppelinの最新開発キット【Zepkit】のチュートリアルを触ってみた!!

この記事は、Getting started with Zepkitのチュートリアルの翻訳と少しのコードと説明を加えた記事となっています。
また修正などがありましたら、お手数だとは思いますがコメントを頂けると嬉しいです!

また今回は、コマンド自体の説明は少ないので次回以降の記事でまとめて行きたいと考えています!
*追記あり(2019/05/28)*

【目次】
・Zepkitについて・
・Zepkitの為のインストール・
・Zepkitをインストール・
・開発ネットワーク・
・アップグレード・
・Next Step: EVMパッケージ・


・Zepkitについて・

ここ数年でスマートコントラクト開発においての標準となりつつある、OpenZeppelinがこの商品を開発しています。
Zepkitは、2019年2月12日にこの記事でリリースが発表され、Dappsを簡単に作れるような機能や環境を整えてくれたスターターキットとして紹介されています。
その機能の中には、TruffleやOpenZeppelin,ReactとInfraが含まれていて開発をスピーディーにしてくれます。
では、実際に初めていきましょう!


・Zepkitの為のインストール・

Zepkitを使う為には、ZeppelinOS,Ganache,Truffleをインストールする必要があります。

npm install -g truffle@5.0.2
npm install -g ganache-cli@6.3.0
npm install -g zos@2.2.0

さらにブラウザベースのWeb3 WalletであるMetamaskやNifty Walletをまだインストールしていない場合は、後で必要になるのでインストールして下さい。この記事ではインストール方法は省きます。
次に、今回使用するディレクトリを作成し移動します。

mkdir zepkit_tutorial
cd zepkit_tutorial

・Zepkitをインストール・

Zepkitのインストールには、

truffle unbox zeppelinos/zepkit

を実行し、新しいターミナルウィンドウに移動、次のコマンドを実行してReactサーバーを起動します。

cd client
npm run start

少し待つと、http://localhost:3000でブラウザが起動します。
以下のようなページです。

ここで、お使いのWeb3 Walletから接続確認が行われるので接続して下さい。(アクセスを承認)
続いて、サイト上部のCOUNTERをクリックすると下の様な画面に移動するはずです。

この様に、「あなたのコントラクトは、このネットワークに接続されていません」と表示されるはずです。


・開発ネットワーク・

最初にGanache-cliをインストールしましたが、これを開発ネットワークとして使用して行きます。

このチュートリアルでは、MetamaskかNifty Walletで使用したニーモニックをGanache-cliで必要となる12個のニーモニックとして使用します。

新しいターミナルウィンドウで、

ganache-cli --secure --u 0 --u 9 --mnemonic “your twelve word mnemonic here”

このコマンドで、0番目と9番目のアカウントがロック解除となり、9番目のアカウントを使用します。
このコマンドはそのまま走らせておいて、別の新しいターミナルウィンドウを作成し、プロジェクトのトップで次のコマンドを実行します。

zos init zepkit_tutorial

そして、セッションを作成します。

zos session --network development --from {your 10th unlocked ganache address}

*注意*
進めて行く中で、よく

A network name must be provided to execute the requested action.

と、この様なエラーが出てきますが、上記のコマンドを再度実行すればすぐ無くなります。

contractフォルダを見ると、Counter.solとWallet.solの2つのコントラクトがあるのがわかります。今からZeppelinOSプロジェクトにCounter.solを追加します。
新しいターミナルウィンドウのトップレベルフォルダーから次のコマンドを実行します。

zos add Counter

を実行し、開発用のブロックチェーンにpushしましょう!

zos push

ここでCounterのコントラクトのインスタンスを作成する前に、ソースコードを確認します。

pragma solidity ^0.5.0;
// import "openzeppelin-eth/contracts/ownership/Ownable.sol";
import "zos-lib/contracts/Initializable.sol";
contract Counter is Initializable {
//it keeps a count to demonstrate stage changes
uint private count;
address private _owner;
function initialize(uint num) initializer public {
_owner = msg.sender;
count = num;
}
function owner() public view returns (address) {
return _owner;
}
// getter
function getCounter() public view returns (uint) {
return count;
}
//and it can add to a count
function increaseCounter(uint256 amount) public {
count = count + amount;
}
//We'll upgrade the contract with this function after deploying it
//function decreaseCounter(uint256 amount) public returns (bool) {
// require(count > amount, "Cannot be lower than 0");
// count = count - amount;
// return true;
}
}

開発ブロックチェーン上のプロジェクトからCounterのインスタンスを作成しましょう!

zos create Counter --init initialize --args 2

生成されたアドレスやファイルは、このプロジェクトの特徴やセットアップを示しています。

zos.dev-<<network-ID-here>>.json

ファイルは、開発ネットワークのネットワークIDを表す番号です。
そして、Web3 Walletが開発用のブロックチェーンに接続されているかを確認するには、Reactサーバーを起動しているウィンドウに戻り終了させ、再起動します。

npm run start

再起動したら、ブラウザでMetamaskかNifty Walletがganacheのブロックチェーンに接続されているのを確認し、更新します。すると、Zepkitのアプリケーションは、ネットワーク上のコントラクトを検出するはずです。

次に、Counterを1つ増やすボタンをクリックしてCounterコントラクトをテストします。クリックする度にウォレットのポップアップが表示されブロックチェーンへのトランザクションが確認されます。
取引が確認されるとカウンタ値が増えて行きます。

下の方にあるDecrese Counter by 1がまだ淡い青なのを確認しましょう。


・アップグレード・

Counter.solコントラクトをアップグレードするには、32~36行目のコメントアウトを外しましょう!

//We’ll upgrade the contract with this function after deploying it
//Function to decrease the counter
function decreaseCounter(uint256 amount) public returns (bool) {
require(count > amount, “Cannot be lower than 0”);
count = count — amount;
return true;
}

コントラクト内で新しい関数が有効になったので、反映させます。

ZeppelinOS2.2.0を使用している場合には、

zos push

を実行します。そして、プロジェクトの変更をブロックチェーンにpushしているので、インスタンスも更新します。

zos update Counter

このコマンドで、Counterコントラクトが最新になります。ブラウザに戻って確認して見ましょう。

この様になっているはずです。このボタンをクリックすれば、Counter Valueの値が減るはずです。


・Next Step: EVMパッケージ・

ここからは、EVMパッケージを使用してERC20トークンを作成して行きます。

zos link openzeppelin-eth

このコマンドはnpmからopenzeppelin-ethをダウンロードし、node_modulesフォルダにコントラクトコードを含めます。
新しいターミナルウィンドに移動して、次のコマンドを実行します。

zos add Wallet

Wallet.solのインスタンスを作成する前に、ソースコードを見てみます。

pragma solidity ^0.5.0;
import "openzeppelin-eth/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-eth/contracts/ownership/Ownable.sol";
import "zos-lib/contracts/Initializable.sol";
contract Wallet is Ownable {
function transferERC20(IERC20 token, address to, uint256 amount) public onlyOwner returns (bool) {
require(token.transfer(to, amount));
}
}

続いて、次のコマンドを実行します

zos push --deploy-dependencies

コードをブロックチェーンにpushしたので、Walletのインスタンスを作成します。

zos create Wallet
zos create Wallet --init --args {your web3 info Public address}

これでコントラクトのインスタンスが作成されました。
ブラウザに切り替えて、更新します。

最後に、ERC20トークンを作成するコードです。

zos create openzeppelin-eth/StandaloneERC20 --init --args 'MyToken,MYT,8,10000000000,your web3 info Public address,[],[]'

これで開発ネットワークに新しいERC20トークンを発行出来ました!


ここからは、僕個人の独り言みたいな部分です!

counter = Counter.at('counter_address')
wallet = Wallet.at('Wallet_address')
erc = StandaloneERC20.at('StandaloneERC20_address')

とターミナルでこのコマンド達を実行すると、詳細な情報が見れます。
各アドレスは、

zos.dev-<<network-ID-here>>.json

のファイルにあります!

最後に

ここまでこの記事を翻訳+少しコードと説明を加えましたが、最後のERC20トークンの確認がまだ出来ていません。もし、Zepkitチュートリアルを終了してERC20トークンの在りかが分かる方がいらっしゃったら、教えて頂けると幸いです。宜しくお願い致します。
(それとも、zos.dev~.jsonファイルにStandaloneERC20がある事自体が作成完了の印なのかな?)


追記(2019/05/28)

見つけました!下記にERC20トークンをMetamaskに表示させる方法を書きます。

1 zos.dev-<<network-ID-here>>.jsonファイルでERC20のアドレスを見つける
→このファイルの中に、ERC20トークンに関するアドレスの記述があるので確認して、コピーします。

2 次にMetamaskの”トークンを追加”というボタンをクリックし、カスタムトークンを選択
→カスタムトークンに移動すると、はじめに”Token Contract Address”という欄があるので、先ほどコピーしたアドレスを貼り付け。

3 Metamaskが自動的に”トークンシンボル”と”小数点桁数”を入力するので、次へを選択
→これで自分のMetamaskに作成したERC20トークンが発行されているのが確認出来ました!


・お知らせ

■ブロックチェーンエンジニア集中講座開講中!
HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。
ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/

■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

HashHub:https://hashhub.tokyo/
Twitter:https://twitter.com/HashHub_Tokyo

■HashHubでは下記のポジションを積極採用中です!
・コミュニティマネージャー
・ブロックチェーン技術者・開発者
・ビジネスディベロップメント

詳細は下記Wantedlyのページをご覧ください。

Wantedly:https://www.wantedly.com/companies/hashhub/projects