OpenZeppelin SDK (旧ZeppelinOS) を使って、コードを1行も書かずに3分でERC721を発行する

# はじめに
本記事では、タイトルの通り「[OpenZeppelin SDK (旧ZeppelinOS)](https://docs.openzeppelin.com/sdk/2.5/) を使って、コードを１行も書かずに3分でERC721トークンを発行する」方法を示します。(ERC20もほとんど同じ方法で発行可能)
OpenZeppelin SDKが好きすぎて伝えたいことは色々あるのですが、まずは触ってもらうことが第一だと思うので、それ以外の内容は必要最低限におさえるようしています。

# OpenZeppelin SDKとは
[OpenZeppelin SDK](https://docs.openzeppelin.com/sdk/2.5/) は、Ethereumのコントラクトを開発したりデプロイしたりするためのフレームワークです。
OpenZeppelinと聞くと、「[検証された再利用可能なスマートコントラクト(SafeMathやERC20,ERC721など)を提供するライブラリ](https://github.com/OpenZeppelin/openzeppelin-contracts)」を思い浮かべる人が多いと思いますが、今回紹介するOpenZeppelin SDKの比較対象は[Truffle](https://www.trufflesuite.com/docs/truffle/overview)です。
`truffle compile` の代わりに `openzeppelin compile` を使うような立ち位置のツールです。

# なぜOpenZeppelin SDKを使うのか
理由は複数ありますが、今回はこの１点を推したいと思います。
### CLIが圧倒的に使いやすい
この記事を書くきっかけにもなったのですが、ZeppelinOS (現OpenZeppelin SDK) は、[v2.4.0へのアップデート](https://docs.openzeppelin.com/sdk/2.5/new-2.4)（2019/06/25）によって、以前まで密接な依存関係にあったTruffleへの依存を大きく減らし、StandaloneなCLIとなりました。
これがとんでもなく使いやすく、「コードを１行も書かずに3分でERC721を発行する」ことが可能になったのです。

一例として、コントラクトのcallを紹介します。
![openzeppelin-call.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141797/d2fe773f-69c1-6bdd-af12-c4a3219fa8b1.gif)
入力は `❯ openzeppelin call` だけです。
あとは、インタラクティブなCLIに従って、
- ネットワーク
- そのネットワークにデプロイされているコントラクト
- 実行したい関数
を順に選ぶだけで実行できます。
![](https://img.gifmagazine.net/gifmagazine/images/125786/original.gif)

このように、OpenZeppelin SDKは、インタラクティブなCLIがとんでもなく使いやすいです。
`truffle develop`や`truffle console`と比較して、まさに痒いところに手が届いていると思います。

OpenZeppelin SDKを使う理由として、他にも以下のように非常に有力なものがありますが、今回は紹介するのを我慢して次に進めます。

- **upgarade可能な設計**
- **メンテナンスが容易な設計**
- **ツール自体の開発が活発**


# 本題：コードを1行も書かずに3分でERC721を発行する
では、実際にツールを使っていきます。

## 前提
nodeとnpmをインストールしていない人は、インストールしてください。
nodeのversionは12には対応していないようです。

**筆者開発環境** 
- PC: macOS High Sierra Version 10.13.6
- node: v10.11.0
- npm: v6.4.1

ここから3分で発行します:fire::fire::fire:
![](https://img.gifmagazine.net/gifmagazine/images/3540762/original.gif)

## 準備
### Toolのインストール
以下のコマンドで、OpenZeppelin SDKと、ローカル開発用のツールであるganache-cliをglobalにインストールします。

```zsh
❯ npm install --global @openzeppelin/cli # openzeppelin-sdkのcliをインストール
❯ npm install --global ganache-cli # ganache-cliをインストール
```

### ganache-cliを起動する
```zsh
❯ ganache-cli
```

## ERC721を発行する
### ディレクトリを作成してnpmを初期化
```zsh
❯ mkdir openzeppelin-sdk-test # 開発ディレクトリ作成
❯ cd openzeppelin-sdk-test # 開発ディレクトリに移動
❯ npm init -y # npmを初期化
```

### OpenZeppelin SDKの初期化
```zsh
❯ openzeppelin init
```
![openzeppelin-init.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141797/d108b1f6-27f9-fee5-0bab-5965862600b8.gif)

### OpenZeppelinのコントラクトをプロジェクトにリンク
```zsh
❯ openzeppelin link @openzeppelin/contracts-ethereum-package
```
![openzeppelin-link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141797/22439782-0691-0e18-3376-c9f222878c06.gif)

### ERC721コントラクトのデプロイ
```zsh
❯ openzeppelin create
```
![openzeppelin-create.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141797/897bb0ec-6fdc-d877-0770-7428a10ee41e.gif)

これで、コードを書かずにERC721コントラクトのデプロイが完了しました。

インタラクティブなCLIでは、入力として、
- tokenの名前
- tokenのシンボル
- minter (ERC721を発行する権限を持つアドレス。今回はganache-cliの１つ目のアドレスを指定した)
- pauser (ERC721コントラクトを停止する権限を持つアドレス。同じくganache-cliの１つ目のアドレスを指定した)
を指定しています。

コードを書いてないのにデプロイできたのは、
`❯ openzeppelin link @openzeppelin/contracts-ethereum-package` 
の段階で、デプロイ済みのロジックコントラクトの情報が入ってきているため、ProxyコントラクトをデプロイするだけでOKだったからです。この辺の技術的な理解については以前[こちら](https://medium.com/kyuzan/zeppelinos-%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-%E5%89%8D%E5%8D%8A-8c6c522b31ba)に記事を書いたので、興味がある方は是非ご覧ください。
（正確には、ローカル環境の場合は、`zos create`時にロジックコントラクトもデプロイしている。）

### ERC721トークンを発行
```
❯ zos send-tx
```
![openzeppelin-sendTx.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141797/6dd770a4-9dc0-8cac-a113-4189f4a86b90.gif)
インタラクティブなCLIでは、入力として、
- ネットワーク -> development
- コントラクト -> さっきデプロイしたERC721
- 実行したい関数 -> mintWithTokenURI
- 引数
　- to
　- tokenId
　- tokenURI
を指定しています。



**DONE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!**

上術した`zos call`を使うと、totalSupplyが1になっていることも簡単に確認できるので、是非試してみてください！

# 終わりに
[OpenZeppelin SDK (旧ZeppelinOS)](https://docs.openzeppelin.com/sdk/2.5/) を使って、コードを１行も書かずに3分でERC721トークンを発行してみました。
このインタラクティブなCLIだけでも、「TruffleじゃなくてOpenZeppelin SDKを使おうかな」と思った人も多いのではないでしょうか。

一方で、このフレームワークは[「アップグレード可能なコントラクト」を作成するためのフレームワーク](https://medium.com/kyuzan/zeppelinos-%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-%E5%89%8D%E5%8D%8A-8c6c522b31ba)として始まった側面もあります。(ZeppelinOS)
リンク先の記事を書いた1年前には、本当にそのためだけのツールで、正直使い勝手もあまりよくなかったのですが、それからどんどん開発が進み、今ではアップグレード可能なコントラクト**も**簡単に作れる、総合的なフレームワークとなりました。
githubの更新も活発で、今後もどんどん使いやすくなっていくと思います。

なので、
みなさん是非使ってみてください！そして情報交換しましょう！
![](https://img.gifmagazine.net/gifmagazine/images/128800/original.gif)


# 参考
- [OpenZeppelin SDK](https://docs.openzeppelin.com/sdk/2.5/)
- [Truffle](https://www.trufflesuite.com/docs/truffle/overview)
- [2018年のEthereum開発者が知るべきツールのリスト](https://qiita.com/sot528/items/6ff13ebfc846aa313307)