FLOCスマートコントラクト開発科では、受講生の皆さんと一緒に、RinkebyにERC721トークンを発行し、OpenSeaで売却する、というワークショップをやっています。
ERC721には「TokenURI」という設定項目があり、設定したURL先にjsonファイルを置く事で、OpenSeaが自動的に Non Fungible Taken の情報を読み込んで画像や商品名、ステータスを表示してくれる、という機能があります。
「TokenURI」設定が、無いとき~。
「TokenURI」設定が、あるとき~。
上の2枚の画像を比較してみても分かる様に、
OpenSeaで「いしおの」を高値で売りたいなら、TokenURIは絶対設定しておいた方がいいと思います。
ちなみに今回使用しているJSONデータはこんな感じです。
でも、わざわざコレだけの為にサーバーを立てるのって、面倒ですよね?
Herokuを使ってJSONサーバーを気軽に立てよう
というわけで今回は、Herokuの軽量コンテナ(Dyno)を使って、簡単に「JSONサーバー」を立ち上げてみます。
Herokuは、小規模利用ならずっと無料で使える便利なホスティング・サービスです。
暫くアクセスしないとスリープモードに入ってしまう欠点はありますが(無料ですし)アクセスすると20~30秒位で復旧するし(中にはHerokuでWordPress運用までしてしまう猛者も居る様です。)、今回の様なちょこっと利用にはうってつけです。
まず、Herokuに登録しアカウントを作成して下さい。
次に、Getting Started on Herokuを開いて左上の「node.js」をクリックして下さい。
すると次の画面で「"ローカル環境にnode.jsの準備が出来ていると仮定します"」と英語で表示されます。
後で「npm install」を使いますので、もしインストールしていない人はサクっと入れて下さい。
準備が出来たら、「I'm ready to start」をクリックしましょう。
次の画面「Set up」では、ローカル環境にherokuコマンドの準備が出来ているかを問われます。
Windows、Mac、Ubuntu(Linxu)でのインストール方法が紹介されているので、うまくインストールして下さい。
準備できたら、一番下までスクロールして、「I have install the Heroku CLI」をクリックして下さい。
ここからが本題
さて、Herokuの準備が出来ている事が確認できたので、次のステップに進みます。
画面は以下の様に表示されていると思います。
画像にマルで囲んでいるコマンドを使って、Heroku上でnode.jsを動かす為の各種ファイル群をダウンロード(clone)します。さっそく実行してみましょう。
git clone https://github.com/heroku/node-js-getting-started.git
gitクローンが終わり、フォルダ「node-js-getting-started」が生成されているので、パス移動しましょう。
cd node-js-getting-started
そして、「I cloned the app source code」をクリックして次のステップに進みます。
herokuに登録する
次の画面は、gitからローカルにダウンロード(clone)したファイル群を、herokuにアップロードする手順です。
heroku create
すると以下の様な画面になります。
今回は「sleepy-gorge-86016」という名前が割り振られました(毎回変わります)。
json-serverをインストール
さて、今回の目的は、「TokenURI」の為の「JSONサーバー」を立てる事ですので、
Herokuの手順書を見ながら進めるのはここまでです。
今回は「JSONサーバー」として、パッケージ「json-server」を使います。
以下のコマンドでインストールしましょう(「--save」は最近不要になったみたいです)。
npm install json-server
「+json-server@0.14.2」の様な表示になれば完了です。
さて、パッケージをインストールすると、「package.json」が自動的に書き換えられます。
:
"dependencies": {
"ejs": "^2.5.6",
"express": "^4.15.2"
},
:
これが、 ↓↓↓
:
"dependencies": {
"ejs": "^2.5.6",
"express": "^4.15.2",
"json-server": "^0.14.2"
},
:
この様に、「json-server」の行が追加されている事が分かります。
Herokuは、この「package.json」ファイルをgit経由でアップロードすると、この中に含まれるパッケージを自動的にHeroku内で追加インストールしてくれます。
最初はとっつきにくいかもしれませんが、馴れるととても便利です。
index.jsを書き換える
Heroku上では、「package.json」の「main」設定に従い、自動的にnode.jsが実行され(てしまい)ます。
:
"main": "index.js",
:
今回はTokenURI用にHerokuを使う為に、「index.js」を改造して「json-server」を使いましょう。
「index.js」の中身を丸ごと削除し、以下に置き換えて下さい。
const jsonServer = require('json-server');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();
server.use(middlewares);
server.use(router);
server.listen(process.env.PORT || 5000, () => { console.log('JSON Server is running 5000'); });
3行目の「db.json」は、今回は以下の様な設定にしました。
{
"cbquest0" : {"name":"ishinoono","description":"CBQuest Asset #0","image":"https://ipfs.io/ipfs/QmScp12jmbqkDcXzZxBd5bWqFfd5xSsxPXu4nwVv2UYP9g"},
"cbquest1" : {"name":"tetsunoken","description":"CBQuest Asset #1","image":"https://ipfs.io/ipfs/QmTZEY1WRiaP7B53ak8AzvHJ9d4d5YC4oXs8rHqA9w2Ya5"},
"cbquest2" : {"name":"yari","description":"CBQuest Asset #2","image":"https://ipfs.io/ipfs/QmUuuosmkYd19eimrRwuBatt93RsLmpUUcKE6tcBLTBjCR"},
"cbquest3" : {"name":"yuushanoken","description":"CBQuest Asset #3","image":"https://ipfs.io/ipfs/QmUzpyYzM5FKbdpgpuiamPMLuSpjHi1DQjUkjTdAPTg4ix"},
"cbquest4" : {"name":"meriken","description":"CBQuest Asset #4","image":"https://ipfs.io/ipfs/QmRgW8L5Dmj4Ui9VPDY2r5CMAGqvd4yR7z7fRbXsC8KysN"}
}
今回の例では「sleepy-gorge-86016」という名前が割り振られたので、以下にアクセスすればJSONを返す筈です。
いしのおの https://sleepy-gorge-86016.herokuapp.com/cbquest0
てつのけん https://sleepy-gorge-86016.herokuapp.com/cbquest1
やり https://sleepy-gorge-86016.herokuapp.com/cbquest2
ゆうしゃのけん https://sleepy-gorge-86016.herokuapp.com/cbquest3
メリケンサック https://sleepy-gorge-86016.herokuapp.com/cbquest4
このファイル「db.json」を、「index.js」と同じフォルダに置けば、ファイル準備は完了です。
ローカルで修正した内容をHerokuにアップロードする
Herokuへのアップロードは全てgit経由で行う事になっています。
gitには手順があって、addコマンドでステージングする、commitコマンドでコミットする、そしてpushコマンドでHeroku側に変更を反映させる、という順に行います。
まずは「git add」です。「.」は、カレント・ディレクトリ以下のファイル変更を検知してステージングする、つまり変更があったファイルを全て反映させるという意味です。
git add .
すると、何事もなかった様に実行完了します。
ちゃんとステージングできたかチェックしてみましょう。
git status
ローカルgitに反映を確定させる為、コミットを行いましょう。「-m」は、コミットメッセージ(どんな変更を行ったのかコメントを残す)を指定するオプションです。
git commit -m "create json-server API"
最後に、Heroku側に変更を反映させましょう。pushコマンドを使います。
git push heroku master
これで、Heroku上で、無料で使えるjson-serverが立ち上がりました。
暫くアクセスが無いとスリープモードに入りますが、その後アクセスすると、数十秒で自動回復します。
では、それぞれアクセスできるか、試してみましょう。
いしのおの https://sleepy-gorge-86016.herokuapp.com/cbquest0
てつのけん https://sleepy-gorge-86016.herokuapp.com/cbquest1
やり https://sleepy-gorge-86016.herokuapp.com/cbquest2
ゆうしゃのけん https://sleepy-gorge-86016.herokuapp.com/cbquest3
メリケンサック https://sleepy-gorge-86016.herokuapp.com/cbquest4
あとは、ERC721トークン生成時の「TokenURI」に、このアドレスを入れてやれば、
そのトークンをOpenSeaで売買する際、画像等が表示される様になります。
OpenSea
OpenSeaのドキュメントには、jsonの書き方が掲載されています。
jsonファイルを工夫すれば、ERC721トークンに「プロパティ」を与えOpenSea上で表示させる事が出来ます。
また、OpenSeaは、プロパティのサンプルとして「OpenSea Creature」を提供しています。
いろんなクリーチャーを見ながら、プロパティの作り方を勉強できて便利ですね。
最後に
今回は、FLOCブロックチェーン大学校の授業では説明しきれなかったHerokuについて触れました。
ブロックチェーン開発にはサーバー構築がつきものですが、Herokuの様なツールを使う事でサーバー周りの面倒ごとから解放され、よりERC721やOpenSeaの理解に集中出来ると思います。是非トライしてみて下さい。