同質化收藏證(NFT)是區塊鏈上的數字通證,每一個都代表著獨特的東西,例如數字收藏品、特殊的非遊戲物品、稀有的交易卡品或任何其他特殊的數字貨幣NFT與同質化通證完全不同:都是一個獨一無二的。 NFT持有者們他們持有的是哪一個,而不是數量。
在本技術教程中,你將學習如何開發NFT 作品並將其部署到OpenSea。你的NFT 將是具有不同背景顏色的表情符號。我們將使用Chainlink VRF可以隨時生成每個NFT 的符號和背景顏色的組合。
開始吧。
複製代碼倉庫
第一步是複制Chainlink 智能合約示例存儲庫完成此操作後,前往隨機安裝SVG NFT 目錄和所需的依賴項。
git clone https://github.com/smartcontractkit/smart-contract-examples.git cd smart-contract-examples/random-svg-nft yarn
然後,使用代碼編輯器中打開項目。按照項目“Readme”文件中的說明設置所需的環境變量(需要註冊一個免費的)煉金術帳戶和一個免費的Etherscan API密鑰)。在本教程中,我們將在以太坊上使用Rinkeby 測試網。
ETHERSCAN_API_KEY=<YOUR ETHERSCAN API> RINKEBY_URL=https://eth-rinkeby.alchemyapi.io/v2/<YOUR ALCHEMY KEY> PRIVATE_KEY=<YOUR PRIVATE KEY>
NFT 元數據
它連接到NFT 的元數據提供描述性信息,這樣就可以在哪裡顯示該NFT 的應用程序的第一個顯示智能。 (鏈上中心)通過各種方式在並IPFS或者說Filecoin去化解決方案上(鏈下)在鏈上等本教程中,我們的元數據存儲在鏈上等,正在基於鏈上的各種數據生成,,將這些值的SVG 表示存儲在智能合約中。
開發NFT 智能合約
創建一個新的NFT.solep 名為的Solidity 文件。我們將在新的智能OpenZepelin 庫繼承繼承協議中,使用Chainlink VRF。
初始化存儲變量的表情符號並使用你最喜歡的表情符號,比如在你最近的手機上使用的十個符號。
//SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol"; import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; contract EmojiNFT is ERC721URIStorage, VRFConsumerBaseV2 { using Counters for Counters.Counter; Counters.Counter private tokenIds; string[] private emojis = [ unicode"😁", unicode"😂", unicode"😍", unicode"😭", unicode"😴", unicode"😎", unicode"🤑", unicode"🥳", unicode"😱", unicode"🙄" ]; VRFCoordinatorV2Interface internal immutable vrfCoordinator; bytes32 internal immutable keyHash; uint64 internal immutable subscriptionId; uint32 internal immutable callbackGasLimit; uint32 internal immutable numWords; uint16 internal immutable requestConfirmations; mapping(uint256 => address) requestToSender; event RandomnessRequested(uint256 indexed requestId);
為了確保智能合約能夠部署這些值,我們添加了一個構造函數,並使用“EmojiNFT”作為NFT 系列名稱,使用“EMOJI”作為符號。可自由更改並正確使用你的任何名字來命名NFT 系列。
constructor( address _vrfCoordinator, bytes32 _keyHash, uint64 _subscriptionId, uint32 _callbackGasLimit, uint16 _requestConfirmations ) VRFConsumerBaseV2(_vrfCoordinator) ERC721("EmojiNFT", "EMOJI") { vrfCoordinator = VRFCoordinatorV2Interface(_vrfCoordinator); keyHash = _keyHash; subscriptionId = _subscriptionId; callbackGasLimit = _callbackGasLimit; numWords = 4; requestConfirmations = _requestConfirmations; }
我們現在添加一個新的方法,根據我們的新方法,在鏈接VRF 請求中添加隨機值,函數中的第一個值,從列表中的每個符號中,其他任何時間生成的值顏色,生成鏈上文件,創建一個OpenSea SVG 使用通證的URL,然後構建一個新的NFT。看來Chainlink VRF 是同步的,我們將請求發送方將所有Chainlink VRF 請求映射到通證的製造者。
function mint() public returns (uint256 requestId) { requestId = vrfCoordinator.requestRandomWords( keyHash, subscriptionId, requestConfirmations, callbackGasLimit, numWords ); requestToSender[requestId] = msg.sender; emit RandomnessRequested(requestId); } function fulfillRandomWords(uint256 requestId, uint256[] memory randomNumbers) internal override { uint256 tokenId = tokenIds.current(); uint256 emojiIndex = (randomNumbers[0] % emojis.length) + 1; string memory emoji = emojis[emojiIndex]; string memory color = pickRandomColor(randomNumbers[1], randomNumbers[2], randomNumbers[3]); string memory svg = createOnChainSvg(emoji, color); string memory tokenUri = createTokenUri(emoji, svg); _safeMint(requestToSender[requestId], tokenId); _setTokenURI(tokenId, tokenUri); tokenIds.increment(); } }
最後是為代碼的挑選ChainRandomColor、一步createOnSvg和createTokenUri函數添加。
我們將使用Chainlink VRF通過請求三種不同的顏色隨時為NFT藝術生成我們顏色的每種顏色,產生RGB格式的每種顏色值。計算機顏色科學以及電視、RGB常用和顯示中。
紅色、藍色和藍色將其強度定義為例如參數顏色0和25之間的設置。 rgb(0,0,255)被渲染為藍色,因為藍色為為參數值(255) 和其他設置為0。類似地,rgb(255, 0, 0) 看起來為紅色。
VRF 提供的值可能遠大於255,因此我們需要取模來計算r、g 和b 。
function pickRandomColor(uint256 firstRandomNumber, uint256 secondRandomNumber, uint256 thirdRandomNumber) internal pure returns (string memory) { uint256 r = firstRandomNumber % 256; uint256 g = secondRandomNumber % 256; uint256 b = thirdRandomNumber % 256; return string( abi.encodePacked( "rgb(", Strings.toString(r), ", ", Strings.toString(g), ", ", Strings.toString(b), ");" ) ); }
SVG(Scalable Vectors)是一種基於XML的標記語言,描述基於二維的向量形式。簡單來說,SVG是一種圖像,但它是一個用代碼製造的圖像。示例下這以格式打印,將在調整大小時不會損失任何質量。 ——我們的SVG可以通證的元數據中生成,不適合從外部。
function createOnChainSvg(string memory emoji, string memory color) internal pure returns(string memory svg) { string memory baseSvg = "<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio='xMinYMin meet' viewBox='0 0 350 350'><style>.base { font-size: 100px; }</style><rect width="100%" height="100%" style="fill:"; string memory afterColorSvg = "" /><text x='50%' y='50%' class="base" dominant-baseline="middle" text-anchor="middle">"; svg = string(abi.encodePacked(baseSvg, color, afterColorSvg, emoji, "</text></svg>")); }
通證是通證示例數據中我們的“URL”中的鏈接。包含“描述”的“名稱”和看起來的JSON,下面是這樣的:
{"name": "😍", "description": "Random Emoji NFT Collection Powered by Chainlink VRF", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHByZXNlcnZlQXNwZWN0UmF0aW89J3hNaW5ZTWluIG1lZXQnIHZpZXdCb3g9JzAgMCAzNTAgMzUwJz48c3R5bGU+LmJhc2UgeyBmb250LXNpemU6IDEwMHB4OyB9PC9zdHlsZT48cmVjdCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBzdHlsZT0nZmlsbDpyZ2IoNDcsIDIyNCwgNzYpOycgLz48dGV4dCB4PSc1MCUnIHk9JzUwJScgY2xhc3M9J2Jhc2UnIGRvbWluYW50LWJhc2VsaW5lPSdtaWRkbGUnIHRleHQtYW5jaG9yPSdtaWRkbGUnPvCfmI08L3RleHQ+PC9zdmc+"} Notice that the SVG image representation is Base64 encoded to match OpenSea’s requirements.
function createTokenUri(string memory emoji, string memory svg) internal pure returns(string memory tokenUri) { string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "', emoji, '", "description": "Random Emoji NFT Collection Powered by Chainlink VRF", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}' ) ) ) ); tokenUri = string( abi.encodePacked("data:application/json;base64,", json) ); }
VRF v2
為了向區塊鏈實時更新,我們使用最新發布的Chainlink VRF v2。
首先,導航到 VRF 訂閱頁面,Rinkeby 網絡,連接部署你的環境,點擊“創建訂閱”。然後,將訂閱ID 保存為SUBSCRIPTION_ID。然後選擇下面的輸入中的內部表情符號NFT 智能合約:
yarn deploy
或者
SUBSCRIPTION_ID=<your_subscription_id> yarn deploy
部署後,返回VRF 訂閱頁面,導航到你的訂閱,點擊“添加消費者”按鈕,並粘貼最近部署的合同地址。
,給你的訂閱充一些Rinkeby 測試值網最後鏈接。
鑄造你的通證並在OpenSea 上進行交易
現在,你可以將你的錢包連接並點擊“創建”函數,或者通過你的智能合約UI 來創建一個dApp UI。Rinkeby 上的OpenSea 並蒐索你的NFT 收藏或錢包地址。
總結
在本文中,我們學習瞭如何編寫NFT 合約、鏈上和鏈下NFT 元數據之間的區別、如何使用Chainlink VRF,以及如何在Solidity 中生成SVG 圖像並在OpenSeaNFT 等市場上正確顯示它們。要了解更多信息,可前往 Chainlink 智能合約示例存儲庫並開始這個和其他示例項目試驗。
帖子 如何創建NFT 首先出現在 Chainlink 博客.