まいにちDapps14日目はDynamic NFTを作っていきます。Dynamic NFTの定義は人それぞれかと思いますが、ここでは広く「メタデータが切り替わるNFT」としておきます。
Chainlink Automationを使う
まずこちらのチュートリアルをやってみます。
How To Create Dynamic NFTs Using Chainlink Automation | Chainlink Engineering Tutorials
こちらにコードがあるのでコピーしてRemixでデプロイします。
https://github.com/smartcontractkit/smart-contract-examples/blob/main/dynamic-nft/2_complete.sol
上記のコードではIPFSに3段階の成長する花のメタデータを格納しておき、growFlower()という関数でTokenURIを更新するというものです。
function growFlower(uint256 _tokenId) public {
if (flowerStage(_tokenId) >= 2) {
return;
}
// Get the current stage of the flower and add 1
uint256 newVal = flowerStage(_tokenId) + 1;
// store the new URI
string memory newUri = IpfsUri[newVal];
// Update the URI
_setTokenURI(_tokenId, newUri);
}
そしてChainlinkのAutomationを使う際に必要な関数を実装しておきます。checkUpkeepは定められた更新の間隔(interval)が前回の更新から経過していないか、つまり更新の必要があるかをbooleanで返却する関数です。
performUpKeepで実際に必要な更新の関数を実行します。ここではgrowFlowerを実行しています。
uint256 lastTimeStamp;
uint256 interval;
constructor(uint256 _interval) ERC721("dNFTs", "dNFT") {
interval = _interval;
lastTimeStamp = block.timestamp;
}
function checkUpkeep(
bytes calldata /* checkData */
)
external
view
returns (
bool upkeepNeeded,
bytes memory /* performData */
)
{
upkeepNeeded = (block.timestamp - lastTimeStamp) > interval;
// We don't use the checkData in this example. The checkData is defined when the Upkeep was registered.
}
function performUpkeep(
bytes calldata /* performData */
) external {
//We highly recommend revalidating the upkeep in the performUpkeep function
if ((block.timestamp - lastTimeStamp) > interval) {
lastTimeStamp = block.timestamp;
growFlower(0);
}
// We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function
}
コントラクトをデプロイしました。NFTのmintもしておきます。
![Image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fffc9239243ae452f058315d9b19e53a715f5d49c-658x730.png%3Fw%3D658%26auto%3Dformat&w=3840&q=75)
ChainlinkにUpkeepを登録していきます。
https://automation.chain.link/mumbai/new
![Image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F3835e25c0519087bf048927819f74ce399ec8f3c-2940x5828.png%3Frect%3D0%2C0%2C2940%2C4202%26w%3D2000%26auto%3Dformat&w=3840&q=75)
設定できて5分ごとに実行されることが確認されました(そのようにCRONで設定したからです)。
![Image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fe21aff5d0f2e7207cdcba4e68aabd79673f1c0f7-2940x5006.png%3Frect%3D0%2C0%2C2940%2C3386%26w%3D2000%26auto%3Dformat&w=3840&q=75)
メタデータも切り替わりました。
![Image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2F7aa3957f4dde5e9720f0c8b8975d735f4c937de2-2832x1516.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)
![Image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffrqcsxz2%2Fproduction%2Fc0e941d23ea20b5e1018a8c189af8601ad31a5fa-2940x1444.png%3Fw%3D2000%26auto%3Dformat&w=3840&q=75)
もう1つ、ChainlinkのPriceDataFeedも組み合わせて、BullとBearで画像を切り替えるNFTというサンプルがあるのでこちらも掲載しておきます。
Chainlinkを利用して実装できるその他のアイデアがまとまっているページも一度見てみてください。
77+ Smart Contract Use Cases Enabled By Chainlink
まとめ
ChainlinkのAutomationを使ってDynamic NFTのメタデータを更新する方法について解説しました。
Dynamic NFTの実装方法には以下の方法があると思います。
- メタデータを動的なサーバー管理にしてサーバー側でDynamicに切り替える
- メタデータをIPFS等分散型DBに静的に管理にして、Updateする関数で切り替える
- 定期実行を自分で行う
- 定期実行をChainlinkに任せる←今回の方法
- メタデータをフルオンチェーンで管理してオンチェーンのロジックで切り替える
他の方法についてもどこかで解説できればと考えています。
弊社Pontechはweb3に関わる開発を得意とするテック企業です。サービス開発に関するご相談はこちらのフォームからお願いいたします。
また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください!