【保存版】通常進化・レア進化するNFTの作り方

注)2/15に「evolute」の部分を修正しました。(第2章の1)

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

クリスペの会社です。

また、CryptoMaidsアンバサダーもさせていただいております。

本日は、進化を行うことができるNFTについて説明していきます。

なお、今回は進化の部分について絞って説明をしていきます。

より細かい説明については下の記事にありますので、よかったらご参考ください。

また、今回作ったテストコントラクトは最後尾に入れております。

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

1 必要情報について

1ー1 画像について

画像は次の3種類を用意します。

① 進化前の画像
② 通常進化後の画像
③ レア進化後の画像

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

トークンIDごとに画像を変える場合は配列を用意する、もしくはメタデータでの設定になるかと思います。

1ー2 進化判定について

進化判定として、次の2つを用意します。

① 進化済みかの判定
② レア進化をしたかの判定

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

特に進化済みかの判定何度も進化ボタンを押せないようにするためにも大事になってきます。

2 進化関数について

2ー1 進化済みのNFTが再度進化ボタンを押せないように(2/15に微修正しました。)

一度進化ボタンを押したらもう押せないように設定します。

require(evoluted_[_tokenId] == false, "evaluate was made once");
evoluted_[_tokenId] = true;

進化判定(evoluted_[_tokenId]) が falseの時だけこの関数を実行できます。

そして、一度実行されると、進化判定trueになります。

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

2/15 追記
上のコードを見ていて、あ、onlyOwnerだと作った人が全部進化させられちゃうし、もらった人が進化できないと思いました(汗)
下のように、「ownerOf()」を使うのが良さそうだなと思いました。

スクリーンショット 2022-02-15 8.21.03


2ー2 疑似乱数を作る

ここは私自身、まだ不勉強なので後日修正するかもしれません。そのため、参考程度でお願いします。

uint256 rand = uint256(blockhash(block.number-1)) % 3;
if (rand == 0) {
    rareEvoluted_[_tokenId] = true;
} else {
    rareEvoluted_[_tokenId] = false;
}

直前のブロックのハッシュ値を3で割った余り0かそれ以外かで分岐を行っています。

0であればレア判定(rareEvoluted_[_tokenId])trueとして、0でなければレア判定falseとします。

なお、実際に設定するときは、こんな感じで、進化させたいトークンIDを入れることとなります。

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

3 イメージを取得する

以上で、トークンIDは次の3パターンに分かれます。

① 進化していて、かつレアである
② 進化していて、かつレアではない
③ 進化していない

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

あとは上のように場合に応じてイメージ画像を取得します。


以上となります。

おそらく思ったより簡単だったのではないでしょうか。

下が今回テストで作ったコントラクトです。よかったらご参考にどうぞ。

注)2/15に「evolute」の修正が必要だと思います。(第2章の1)

https://testnets.opensea.io/collection/full-onchain-test-zo34aokjlh



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