前言
從去年開始,NFT這個詞如火如荼地邁向全世界,相關的科技應用也令它成為了一個企業間炙手可熱的話題。不同於傳統的NFT,動態NFT作為近期更受關注的一個分支,它包含的互動性和可變化元素,為它帶來了更多的創新和價值應用。
首先,動態NFT的最大優勢就如其名 — 高度的變化性和延展性。它可以呈現出比靜態NFT更多的元素,比如動畫、聲音、互動式圖像等,而且能隨著時間或條件產生元數據(Metadata)的變動。舉例來說,一個動態NFT的藝術品可以在不同的時間點呈現不同的風格或表現出不同的情感;一個動態NFT的遊戲道具可以隨著遊戲進程升級,提高了遊戲的互動性和可玩性。
這主要功虧於其對數據的接受性,您可以透過「鏈上數據」或「鏈下數據」來更改您NFT的屬性。其中鏈上數據可以通過智能合約直接訪問,鏈下數據則需透過預言機(Oracle)進行網上數據抓取後,再添加到區塊鏈中。
寫動態NFT需要具備一定的技術知識和專業技能,因此下文將針對基礎的建構步驟協助您籌備項目。
首先,你需要確定您的NFT設計。請注意,這邊不單單只你的NFT圖像,而是涵蓋這個項目的所有計畫(白皮書、路線圖等等),因為這會直接影響未來dNFT的變化形式以及智能合約的撰寫。舉例來說,你的dNFT可以是藝術品、遊戲道具、音樂作品或是實體資產綁定等等。你需要考慮元素的可變化性和互動性,以及它們如何為持有者提供更多的價值和體驗。
接下來,您需要選擇你欲發佈的公鏈。像是以太坊、幣安鏈、Polygon等等,這些平台都支援動態NFT的創建和發行。但請注意,你選擇的鏈會直接影響撰寫智能合約時所使用的程式語言。
編寫智能合約是創建動態NFT的關鍵步驟。你需要使用Solidity或其他支持NFT創建的程式語言(e.g. Rust 、 Vyper 和 Move)來創建智能合約,這個合約會結合metadata來定義NFT的屬性、圖像。在創建動態NFT時,你需要確定動態元素的變化方式和變化頻率,以及它們發布後如何與智能合約互動。
讓我們看看其中一種簡單的 dNFT 代碼:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract DynamicNFT is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("DynamicNFT", "DNFT") {}
struct NftMetadata {
string name;
string description;
string image;
uint256 price;
uint256[] dynamicAttributes;
}
mapping(uint256 => NftMetadata) private _nftMetadata;
function createNft(
address recipient,
string memory tokenURI,
string memory name,
string memory description,
string memory image,
uint256 price,
uint256[] memory dynamicAttributes
) public {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
_nftMetadata[newItemId] = NftMetadata(
name,
description,
image,
price,
dynamicAttributes
);
emit NftCreated(
newItemId,
recipient,
tokenURI,
name,
description,
image,
price,
dynamicAttributes
);
}
function getNftMetadata(uint256 tokenId)
public
view
returns (NftMetadata memory)
{
require(
_exists(tokenId),
"DynamicNFT: metadata query for nonexistent token"
);
return _nftMetadata[tokenId];
}
function updateDynamicAttribute(
uint256 tokenId,
uint256 attributeIndex,
uint256 newValue
) public {
require(
_exists(tokenId),
"DynamicNFT: attribute update for nonexistent token"
);
NftMetadata storage metadata = _nftMetadata[tokenId];
require(
attributeIndex < metadata.dynamicAttributes.length,
"DynamicNFT: invalid attribute index"
);
uint256 oldValue = metadata.dynamicAttributes[attributeIndex];
metadata.dynamicAttributes[attributeIndex] = newValue;
emit NftAttributeUpdated(tokenId, attributeIndex, oldValue, newValue);
}
event NftCreated(
uint256 newItemId,
address recipient,
string tokenURI,
string name,
string description,
string image,
uint256 price,
uint256[] dynamicAttributes
);
event NftAttributeUpdated(
uint256 tokenId,
uint256 attributeIndex,
uint256 oldValue,
uint256 newValue
);
}
//This code is for educational purposes only, please do not invest in any assets.
一旦你的智能合約編寫完成,你需要編寫前端界面(一個能連結錢包的Dapp),讓使用者可以與NFT互動。你可以使用Web3.js等框架來編寫前端界面,這些框架可以與以太坊等區塊鏈進行互動,實現NFT的銷售、轉移和觸發變動條件等功能。
最後,你需要針對動態NFT進行測試,確保其功能正常,並在區塊鏈上發行它。你可以選擇在自己的平台上進行一級發售(步驟四所建立的平台),或是直接將NFT上傳到現有的二級市場,如OpenSea、Rarible等,進行出售或拍賣。
dNFT是一個相對較新的NFT類型,它可以提供更豐富的體驗和更多的應用場景。要創建dNFT,您需要編寫專門的智能合約來定義動態屬性並更新它們。此外,我們相信dNFT將在未來變得越來越受歡迎,並為藝術家、遊戲開發人員和收藏家等創造更多的機會。
如果你在尋找專業的dNFT開發人員,歡迎聯繫我們的區塊鏈專家。