HashlipsでジェネラティブNFT開発(実践編)
こんにちは、ミナズミと申します
この記事では
「誰でもできる!ジェネラティブnft開発」
「仕事でつかえるジェネラティブnft構築」 を修了後、
実際のジェネラティブNFT開発を行った際に 調べたこと や 困ったこと をまとめます
この記事の大まかな項目はこちらです
- プロジェクト概要
- リビールってどうやるの?
- 運営保有分のmintってどうやるの?
- その他・あとがき
それでは早速スタートです
プロジェクト概要
まずはプロジェクトの概要です
- 枚数:3000枚弱
- 規格:ERC-721A
- リビール:あり
- WL:なし
経緯とかは省略です
特別なギミックの要望はありませんでした
コントラクトは某プロジェクトを参考にさせていただきました
リビールってどうやるの?
さて、ここからは実際に調べたこと、困りごとについて書いていきます
まずはじめは「リビール」についてです
リビールについては「baseURIをリビール前→リビール後に書き換えるんだよな~」
くらいの認識しかありませんでしたが、ここでわからなかったのが
リビール前画像とメタデータの準備の仕方でした
リビール前画像は依頼主からいただいた1枚絵なので良しとして
どのようなメタデータを作ればよいかがわかりませんでした
結論としては「1枚絵を参照するメタデータを作る」これです
メタデータはそれぞれのNFTがもつ様々な要素が記載されています
例えば、
- 名前は○○だよ
- 番号は何番だよ
- Descriptionは「○○○○」だよ
という情報が含まれていて、この中には
- 画像のアドレスは「○○○○○○○…」だよ
というのもあるんですが、通常
「1番のNFTは1番目の画像」「2番のNFTは2番目の画像」…
としていくところを
「1番のNFTは1番目の画像」「2番のNFTも1番目の画像」…
というように、全て同じ画像を参照するようにすることで
全て同じ画像を参照・表示するNFTが出来ます
仕組みを知ってしまえばなんてことないことなんですよね
ただ今回ジェネラティブ画像の生成に使用したHashlipsでは
全てのmetadataで画像の参照先を同じようにする機能はありません
ですのでHashlips art engineのソースを修正して対応することにしました
main.jsのmetadataを作る処理を…
const addMetadata = (_dna, _edition) => {
let dateTime = Date.now();
let tempMetadata = {
name: `${namePrefix} #${_edition}`,
description: description,
// image: `${baseUri}/${_edition}.png`, // 変更前
image: `${baseUri}/1.png`, // 1.pngで固定
dna: sha1(_dna),
edition: _edition,
date: dateTime,
...extraMetadata,
// attributes: attributesList, // attributesもコメントアウト
// compiler: "HashLips Art Engine",
};
このように書き換えて
強制的に全てのメタデータでimageを「baseUri/1.png」とするようにしました
ついでにattributesをコメントアウトしてmetadataに挿入しないようにしましょう
これをやっておかないと、画像だけは1枚絵ですがOpenSea等で見た時に
Propertiesが丸見え状態になってしまいます
これでnode index.jsを実行すれば
全てのmetadataが同じ画像を参照し、attributesの記載がないmetadata
を作ることが出来ます
あとは作成されたmetadataをIPFSにアップロードし、
metadataのCIDをbaseURIに指定してあげればOKです
リビールするときは通常通り生成した画像・metadataをアップロードして
setBaseURIでリビール後のmetadataのCIDに書き換えてあげましょう
※「ipfs://......../」の形式で入れることをお忘れなく
(ちなみにこの方法に気づいたのは終わってからで、実際にはmetadataを直接エディタで書き換えて何とかしましたw)
運営保有分のmintってどうやるの?
今回はconstructorにてERC-721Aの「_safemint()」を叩くことで運営保有分のmintを行いました
(けいすけさんアドバイス)
constructorはコントラクトがデプロイされた時に一度だけ自動的に処理されます
_safemint()は対象アドレスに指定枚数分のNFTをmintするfunctionです
constructorに以下の記述を追加します
constructor(
) ERC721A('*コレクション名*', '*コレクションシンボル*') {
setBaseURI('ipfs://............................../');
_safeMint(*mint先アドレス*,*mint枚数*);
}
これでコントラクトのデプロイと同時に指定アドレスに対して指定枚数mintされます
デプロイ後はetherscanのRead ContractからtotalSupplyでmintされた枚数を
確認したりしましょう
デプロイするとOpenSeaにもコレクションページが作成されるので
そちらで見てもいいかもしれません
その他・あとがき
技術的なことで「誰ジェネ」「しごネジェ」ではわからなかったことは以上です。たぶん
ここからは完全に個人的な感想です
さてさてさて、今回は(けいすけさんのサポートがあったとは言え)はじめて個人として依頼を受けさせていただいたわけですが、普段会社員としてフツーーーーのシステム開発をしている人間からすると、いろんなことがもう新鮮で新鮮でした
「これってこうやって進めてもいいの?」から「これ言い回しあってるのかな?」とか、そりゃもういろいろな迷いがありました。スケジュール管理とか、どうやって相手の要望を引き出すか?とか、どうやって仕様上の制約を伝えるかとかとか…。ですがなんとか乗り切れたのは完全にサポートに入っていただいたけいすけさんのおかげです
またプロジェクト的にも特別なギミックの注文もなかったので、ほぼほぼ「誰ジェネ」「しごジェネ」の範囲内で進めることが出来ました。教材をつくっていただいたむなかたさん、けいすけさんには感謝しかありません。ほんとうにありがとうございました。
Discussion