見出し画像

呪われたNFT

Solidity勉強中はなまるです。今回は呪われたNFTを作ってみました。

前回はシンプルなはじめてのNFTでしたが、シンプルと言ってもメタデータや画像を外部のウェブサーバなどに置くのが面倒といえば面倒でした。ぐぐっていると、SVGファイルという画像形式を使えば、外部に置かずにブロックチェーン上に全部保存する方法(フルオンチェーン)もあるらしく、今回はそのやり方を試してみました。

あとtransferメソッド中にrequireを入れることでtransferできない(人にあげれない、売れない、捨てれない)呪われたNFTという設定にしてみました。

Openseaのページ

コントラクトアドレス(Polygon)  https://polygonscan.com/address/0x85175994cabfb8634081387c0ec369cdac40d076

Polygonに接続してmint()メソッドを呼び出すと、実際にこのNFTがゲットできます(もらったが最後、捨てれなませんが)。今回はUI(HTML+ethers.js)は作ってません。

ソースコード https://gist.github.com/himawari2021/80f9526abe843694912c89bd78b55aa1

今回新たにやってみたこと、気づいたこと

SVGを使ったフルオンチェーンNFT

以下の記事を参考にしました。

SVGやtokenURIの出力がちゃんとできているかの確認をどうしたものかと思いましたが・・・

SVGの表示確認


Remix上でローカルのJavaScriptVMにデプロイした後、SVGはgetSVGメソッドを呼び出した結果をテキストファイルに保存してブラウザで確認できました。確認しながら値をいじって調整。

テキストに日本語が含まれると(Windowsの場合、デフォの)Shift_JISだと"XML パースエラー: 整形式になっていません"というエラーになるのでエンコードをUTF-8(指定しなかった場合のXML標準)で保存します。

メタデータ(tokenURIの結果)の確認

tokenURIメソッドを呼び出してstring: の後のdata:~の部分をコピーしてブラウザのURL欄に張り付けると、ブラウザ上でjson(xml?)を表示してくれます。

ここでカッコやクォーテーションがおかしいなどの文法エラーはチェックできます。

ちゃんとした?ツールを使えば、このへんをもっとササっと動作確認できるものだろう思いますが、とりあえずRemix + ブラウザ だけでもこれぐらいの動作確認はできました。

文字列

Solidityにstring型はありますが、プログラム言語レベルで文字列操作をサポートしてません。他の一般的なプログラム言語ではよくある + で連結とかいう記述もできません。
文字列を連結するには
abi.encodePacked(文字列1, 文字列2, …) という風に連結します。
また、uint→stringも言語レベルでサクッとできないんで、importしたStringsライブラリを使って、
Strings.toString(数字)
を呼び出しています。

あと '~'の中に"(ダブルクォテーション)が書けます。これは何か他の言語でもこういう書き方があったような。

本番環境デプロイ

Ropsten環境はデプロイしてもOpenseaに反映されるのに時間がかかることが多いような気がします。何かもどかしかったので、途中からRopstenなどテストチェーンは飛ばしてPolygonに直接デプロイすることにしました。
同じ名前(コントラクト名?)で何度もデプロイしてると、V2、V3と何かバージョンみたいなのがふられていくようです・・・

ゴミみたいなテスト中のコントラクトをPolygonに何個もデプロイしてしまいました。まぁ多分問題ないんじゃないかな・・・


以上、僕でもできたフルオンチェーンNFT!でした。
実際プログラムを見たり書いたりしてるとNFTの仕組みがより理解しやすいかもですね。
"売買されるためびにアーティストにフィーが入る"のは素敵!みたいな話をよく聞きますが、その機能は別にNFT(ERC721)に入っているわけではなく、オープンシーなどのコントラクトでその機能が追加されているんですね。

あとNFTとは何かをプログラム的に言うと、トークンのIDとユーザーのアドレスが紐づけされているだけだと↓(OpenZeppelinの実装だとこのidとaddressのマップがNFTユーザー名簿)

// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;

この単純な紐づけをもとに、いろんなユースケースが作られてる感じ。

この記事が気に入ったらサポートをしてみませんか?