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


はじめに

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

OpenZeppelin SDKとは

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

なぜOpenZeppelin SDKを使うのか

理由は複数ありますが、今回はこの1点を推したいと思います。

CLIが圧倒的に使いやすい

この記事を書くきっかけにもなったのですが、ZeppelinOS (現OpenZeppelin SDK) は、v2.4.0へのアップデート(2019/06/25)によって、以前まで密接な依存関係にあったTruffleへの依存を大きく減らし、StandaloneなCLIとなりました。
これがとんでもなく使いやすく、「コードを1行も書かずに3分でERC721を発行する」ことが可能になったのです。

一例として、コントラクトのcallを紹介します。

入力は ❯ openzeppelin call だけです。
あとは、インタラクティブなCLIに従って、
- ネットワーク
- そのネットワークにデプロイされているコントラクト
- 実行したい関数
を順に選ぶだけで実行できます。

このように、OpenZeppelin SDKは、インタラクティブなCLIがとんでもなく使いやすいです。
truffle developtruffle 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分で発行します

準備

Toolのインストール

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

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

ganache-cliを起動する

❯ ganache-cli

ERC721を発行する

ディレクトリを作成してnpmを初期化

mkdir openzeppelin-sdk-test # 開発ディレクトリ作成cd openzeppelin-sdk-test # 開発ディレクトリに移動
❯ npm init -y # npmを初期化

OpenZeppelin SDKの初期化

❯ openzeppelin init

OpenZeppelinのコントラクトをプロジェクトにリンク

❯ openzeppelin link @openzeppelin/contracts-ethereum-package

ERC721コントラクトのデプロイ

❯ openzeppelin create

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

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

コードを書いてないのにデプロイできたのは、
❯ openzeppelin link @openzeppelin/contracts-ethereum-package
の段階で、デプロイ済みのロジックコントラクトの情報が入ってきているため、ProxyコントラクトをデプロイするだけでOKだったからです。この辺の技術的な理解については以前こちらに記事を書いたので、興味がある方は是非ご覧ください。
(正確には、ローカル環境の場合は、zos create時にロジックコントラクトもデプロイしている。)

ERC721トークンを発行

❯ zos send-tx


インタラクティブなCLIでは、入力として、
- ネットワーク -> development
- コントラクト -> さっきデプロイしたERC721
- 実行したい関数 -> mintWithTokenURI
- 引数
 - to
 - tokenId
 - tokenURI
を指定しています。

DONE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

終わりに

OpenZeppelin SDK (旧ZeppelinOS) を使って、コードを1行も書かずに3分でERC721トークンを発行してみました。
このインタラクティブなCLIだけでも、「TruffleじゃなくてOpenZeppelin SDKを使おうかな」と思った人も多いのではないでしょうか。

一方で、このフレームワークは「アップグレード可能なコントラクト」を作成するためのフレームワークとして始まった側面もあります。(ZeppelinOS)
リンク先の記事を書いた1年前には、本当にそのためだけのツールで、正直使い勝手もあまりよくなかったのですが、それからどんどん開発が進み、今ではアップグレード可能なコントラクト簡単に作れる、総合的なフレームワークとなりました。
githubの更新も活発で、今後もどんどん使いやすくなっていくと思います。

なので、
みなさん是非使ってみてください!そして情報交換しましょう!

参考