【保存版】シークレット フルオンチェーンNFTの作り方(入門編)

こんにちは、CryptoGamesの高橋です。

「TCGVerse」の会社です。

またCryptoMaidsのアンバサダーもやらせていただいております。

本日は、SVGデータEtherscanから渡してNFTを作成する方法やシークレットフルオンチェーンNFTの作り方を紹介していきます。

では、やっていきましょう。

1 Remixからデプロイを行う

まずはコントラクトのデプロイを行いましょう。

こちらのRemixから行っていきます。

新しいワークスペースを「+」で作り、テストとして用意されてあるコントラクトを「Delete All」で削除しましょう。

スクリーンショット 2022-02-14 6.47.30

削除したら、「FullOnchain11.sol」「Base64.sol」というファイルを「contracts」フォルダに作り、次のコードをコピペしましょう。

スクリーンショット 2022-02-14 6.49.46

コードは下になります。

https://rinkeby.etherscan.io/address/0x74c191013bead56ec23cd1a19847405798ea60bf#code

スクリーンショット 2022-02-14 6.54.02

ポイント
コード内容を何も変えずに、コピペを行うと、Etherscanの「verify」という処理が不要になるため、楽だと思います。

コンパイル・デプロイについては、下の記事の16章・17章をご確認ください。

なお、今回は「コンストラクタ」に渡す引数はなく、「deploy」後に特に何か行う必要はありません。

デプロイが完了しましたら、「view on etherscan」から「etherscan」に行ってみましょう。

スクリーンショット 2022-02-14 7.06.16

<コードを変えた場合は?>

コードを変更した場合にはEtherscanでverify(検証)が必要となります。

こちらの記事をご参照ください。

2 Etherscanから設定を行う

2ー1 ウォレット接続する

下のように、「Connect to Web3」でウォレット接続します。

「Rinkeby」のネットワークになっていることを確認してください。

スクリーンショット 2022-02-13 18.29.56

2ー2 基本設定をする。

「Write contract」から色々と設定を行いましょう。

①Name

下のように任意のNFTの名前を設定しましょう。

スクリーンショット 2022-02-13 18.34.16

②Description

下のように、任意のDescriptionを設定しましょう。

スクリーンショット 2022-02-13 18.34.16

2ー3 SVG画像を設定する

① シークレット画像を設定する

シークレット画像にするSVGを右クリックしてコードを表示しましょう。

スクリーンショット 2022-02-13 18.35.24

コードが表示されればエディタは特に問いません。

ちなみに画像はこちらから持ってきました。

<svg> ~ ...</svg>までを全てコピーします。

スクリーンショット 2022-02-13 18.35.49

下の「setUnRevealedImage」にそのまま貼り付けて、更新しましょう。

スクリーンショット 2022-02-13 18.36.42

これでシークレット画像の設定は完了しました。

② トークンIDごとの画像を設定する

今回はトークンID:1のSVG画像を設定しましょう。

①と同様に設定する画像のSVGのコードを取得します。

スクリーンショット 2022-02-13 18.37.31

ちなみに、今回はこの画像を使いました。

先ほどと同様にコピーして

スクリーンショット 2022-02-13 18.37.51

「setImages」に設定します。

今回は「どのトークンIDにどの画像を設定するか」というものなのでトークンIDも下のように設定します。

スクリーンショット 2022-02-13 18.38.27

これで設定が完了しました。

他にも設定したい場合は同様に設定してみてください。(トークンID:1〜10で設定ができます。)

2ー4 ミントを行う

下のようにミントを行いましょう。

「_to」にはミント先のウォレットアドレスを指定します。

スクリーンショット 2022-02-13 18.38.55

2ー5 表示を確認する

では、実際の表示を確認してみましょう。OpenSeaのテストネットで確認します。

https://testnets.opensea.io/

下のようにnameやdescription、画像が設定されています。

スクリーンショット 2022-02-13 18.40.36

画像はシークレット画像として設定した画像が表示されています。

2ー6 シークレット画像を解除する

下のように「setReveal」を実行します。

これでシークレット画像が解除されたはずです。

スクリーンショット 2022-02-13 18.41.02

やや待ってから、「Refresh metadata」を押してからリロードすると。。

スクリーンショット 2022-02-13 18.41.19

このように画像が変わりました!

これで成功です。

スクリーンショット 2022-02-13 18.41.50


3 コードを見てみよう

では、実際内部的に何が行われていたのかをコードを見てみましょう。

3ー1 SetName、SetDescription

① 設定部分

下のようになっていました。その名の通り、nameやdescriptionをセットしていました。

スクリーンショット 2022-02-13 19.21.28

「public」とすることで、外部のEtherscanからも見えるようにし、「onlyOwner」で「owner」しか実行できないようにします。

また、require文を設定することで値が入っていない時だけ実行するようにします。

これにより、値の書き換えを不可としています。

② 表示部分

①で設定した値は、tokenURI()で使われます。

スクリーンショット 2022-02-13 19.30.21

このように「name」の値として、①で設定した値が利用されます。

3ー2 シークレット画像について

① 設定部分

では、シークレット画像を設定するために用いたこちらも見てみましょう。

よくみると3ー1と全く同じことをやっていますね。

スクリーンショット 2022-02-13 19.34.43

② 取得部分

取得は下のgetImage()で行っています。引数としてトークンIDを渡していますね。

スクリーンショット 2022-02-13 19.37.48

もし、「unRvealed」が「true」なら先ほど設定した「unRevealedImage」が返されます。

そのため、トークンIDが1であろうと10であろうと、同じ画像(unRevealedImage)が返ってきます。

そのため、全てのトークンIDで同じシークレット画像が表示されることとなります。

一方「false」であればトークンIDに応じた「svgImages[]」が返されます。

③ 表示部分

tokenURI()を見てみましょう。

「Base64.encode(bytes())」で囲まれています。

スクリーンショット 2022-02-13 19.47.20

これにより、Base64形式に符号化されます。そして、この暗号化されたものをさらにBase64形式に符号化されています。

これにより、getImage()は二重で符号化されています。

3ー3 トークンID画像ごとに異なる実際の画像

① 設定部分

「どのトークンIDに」どの画像を設定するかという設定なのでトークンIDも引数に渡しています。

スクリーンショット 2022-02-13 19.53.26

また、上のようにトークンID1と11で同じ画像に設定しているのは画像の容量の問題からです。

ランダムで設定するなど他にも方法はあると思います。

② 取得部分

シークレット画像と同じgetImage()メソッドで取得しています。

スクリーンショット 2022-02-13 20.01.26

トークンIDに応じた画像を取得しています。

③ 表示部分

表示部分はシークレット画像と完全に同じですので、ここでは省略いたします。

3ー4 シークレット画像の解除について

シークレット画像の解除はとても簡単な仕組みです。

関数を実行すると、下のように「unRevealed」「false」になります。

スクリーンショット 2022-02-13 20.06.08

元々は初期値がtrueとして設定してあります。

スクリーンショット 2022-02-13 20.06.23

これが効力を発揮するのはgetImage()です。

下のように、trueの時はシークレット画像が表示され、解除されれば普通の画像が表示されるようになります。

スクリーンショット 2022-02-13 20.06.31


今回は以上です。

ちなみに、後日noteで記事化予定ですが、SVG毎に色を設定したコントラクトはこちらになります。

https://rinkeby.etherscan.io/address/0xbb8ba57e300af658dcbaa023c26e66004cc73374#code

よかったらご参考にどうぞ。」

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊