まいにちDapps#14 Chainlinkを使ってDynamic NFTを作る

ponta

ponta

· 3 min read
Thumbnail

まいにち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

ChainlinkにUpkeepを登録していきます。

https://automation.chain.link/mumbai/new

Image

設定できて5分ごとに実行されることが確認されました(そのようにCRONで設定したからです)。

Image

メタデータも切り替わりました。

ImageImage

もう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に関わる開発を得意とするテック企業です。サービス開発に関するご相談はこちらのフォームからお願いいたします。

また、受託開発案件に共に取り組むメンバーを募集しています!ご興味のある方はぜひお話させてください!

ponta

About ponta

2019年からEthereumを中心にDapp開発に従事。スキーとNBAとTWICEが好き。

Copyright © 2024 Pontech.Inc