【保存版】通常進化・レア進化するNFTの作り方
注)2/15に「evolute」の部分を修正しました。(第2章の1)
こんにちは、CryptoGamesの高橋です。
クリスペの会社です。
また、CryptoMaidsのアンバサダーもさせていただいております。
本日は、進化を行うことができるNFTについて説明していきます。
なお、今回は進化の部分について絞って説明をしていきます。
より細かい説明については下の記事にありますので、よかったらご参考ください。
また、今回作ったテストコントラクトは最後尾に入れております。
では、やっていきましょう。
1 必要情報について
1ー1 画像について
画像は次の3種類を用意します。
① 進化前の画像
② 通常進化後の画像
③ レア進化後の画像
トークンIDごとに画像を変える場合は配列を用意する、もしくはメタデータでの設定になるかと思います。
1ー2 進化判定について
進化判定として、次の2つを用意します。
① 進化済みかの判定
② レア進化をしたかの判定
特に進化済みかの判定は何度も進化ボタンを押せないようにするためにも大事になってきます。
2 進化関数について
2ー1 進化済みのNFTが再度進化ボタンを押せないように(2/15に微修正しました。)
一度進化ボタンを押したらもう押せないように設定します。
require(evoluted_[_tokenId] == false, "evaluate was made once");
evoluted_[_tokenId] = true;
進化判定(evoluted_[_tokenId]) が falseの時だけこの関数を実行できます。
そして、一度実行されると、進化判定はtrueになります。
2/15 追記
上のコードを見ていて、あ、onlyOwnerだと作った人が全部進化させられちゃうし、もらった人が進化できないと思いました(汗)
下のように、「ownerOf()」を使うのが良さそうだなと思いました。
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を入れることとなります。
3 イメージを取得する
以上で、トークンIDは次の3パターンに分かれます。
① 進化していて、かつレアである
② 進化していて、かつレアではない
③ 進化していない
あとは上のように場合に応じてイメージ画像を取得します。
以上となります。
おそらく思ったより簡単だったのではないでしょうか。
下が今回テストで作ったコントラクトです。よかったらご参考にどうぞ。
注)2/15に「evolute」の修正が必要だと思います。(第2章の1)
https://testnets.opensea.io/collection/full-onchain-test-zo34aokjlh
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊