日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

polygon NFT开发教程

發布時間:2023/12/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 polygon NFT开发教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

polygon NFT開發教程

  • 1、初始化hardhat項目
  • 2、設置Polygon環境
  • 3、編寫NFT智能合約
  • 4、測試NFT合約
  • 5、mint nft通證

以太坊的手續費費目前還是天文數字,因此第2層解決方案得到了蓬勃發展。以太坊最著名和最常用的第2層解決方案之一是Polygon(以前的Matic)。在這篇文章中,我們將創建一個基于IPFS去中心化存儲并運行在Polygon二層網絡上的的NFT通證。Polygon具有出色的性能和成本優勢,可實現智能合約部署和交易。當需要在以太坊主鏈與二層之間轉移資產時,Polygon使此操作變得容易。

1、初始化hardhat項目

我們使用Hardhat來處理項目配置和部署任務。Hardhat與Truffle一樣提供了一套可以簡化以太坊開發的工具。由于Polygon是與Etherem EVM兼容的第2層,因此我們可以采用與以太坊幾乎相同的方式將Hardhat與Polygon結合使用。

在計算機上打開一個終端,然后創建一個新的項目文件夾polygon-nfts:

mkdir polygon-nfts

進入該目錄運行以下命令初始化一個新的Hardhat示例項目以開始我們的工作:

npm install --save-dev hardhat npx hardhat

第二個命令將引導你完成一些配置工作。選擇示例項目選項,然后接受之后顯示的所有默認選項。完成該過程后,項目文件夾中將包含一些新文件。在代碼編輯器中打開整個項目文件夾,讓我們看一下目錄內容:

polygon-nfts |- contracts|- Greeter.sol |- scripts|- sample-script.js |- test|- sample-test.js |- .gitignore |- hardhat.config.js |- package-lock.json |- package.json

因為我們創建的是示例項目,所以項目目錄下有三個文件夾:

  • contracts
  • scripts
  • test

contracts文件夾包含一個示例合約Greeter.sol。scripts文件夾包含一個簡單的腳本文件,該腳本可讀取代碼并進行部署。test目錄下的測試文件可以部署并調用我們的合同。很簡單的東西,但是這是一個很好的起點,接下來讓我們看看如何把Polygon加進去。

2、設置Polygon環境

在繼續下面操作之前,我們獲取一些MATIC通證。因此,第一步是確保你有一個以太坊錢包。只需訪問Metamask的網站,安裝擴展程序,然后按照創建新錢包的過程進行即可。當然,如果你已經有了錢包,則可以跳過此步驟。

創建錢包后,我們需要獲取錢包的私鑰。該密鑰對于部署NFT合同并與第2層鏈進行交互是必不可少的。在Metamask擴展中,可以通過單擊錢包帳戶旁邊的三點菜單圖標來導出私鑰:

選擇 帳戶詳細信息 / Account Details,然后就可以導出私鑰了。擁有私鑰后,還需要做兩件事:

  • 在polygon-nft項目的根目錄下創建一個名為.env的文件,加入PRIVATE_KEY=YOUR_EXPORTED_PRIVATE_KEY。 注意替換YOUR_EXPORTED_PRIVATE_KEY為你的實際私鑰。
  • 在項目的.gitignore文件中,添加一行.env,這將確保你不會意外地將.env文件提交給源代碼管理 并泄露你的密鑰。

由于使用了環境變量文件,因此我們需要在項目中安裝另一個依賴項,以使其更易于使用這些變量。從項目目錄的根目錄運行以下命令:

npm i dotenv

現在讓我們去測試網Faucet中獲取一些MATIC通證。你可以把錢包地址粘貼到提供的字段中,選擇MATIC通證,然后選擇Mumbai網絡:

提交后,系統會要求你進行確認。這樣你地錢包很快就會收到MATIC通證了。

現在讓我們更新hardhat.config.js文件,以便告知hardhat我們正在使用Polygon網絡。在第一條require語句上方的文件頂部,添加:

require('dotenv').config(); const PRIVATE_KEY = process.env.PRIVATE_KEY;

上面的代碼標明我們將使用該dotenv程序包提取環境變量。第二行是創建一個變量,該變量引用在.env文件中為私鑰存儲的環境變量的值。

接下來,我們需要在文件中找到module.exports對象。它可能僅包含Solidity版本的定義。讓我們用以下代碼替換之前的module.exports:

module.exports = { defaultNetwork: "matic", networks: {hardhat: {},matic: {url: "https://rpc-mumbai.maticvigil.com",accounts: [PRIVATE_KEY]}},solidity: {version: "0.7.3",settings: {optimizer: {enabled: true,runs: 200}}},paths: {sources: "./contracts",tests: "./test",cache: "./cache",artifacts: "./artifacts"},mocha: {timeout: 20000} }

看起來內容很多,不過實際上沒那么復雜。上面的代碼告訴hardhat我們在使用Polygon網絡、RPC地址以及私鑰。除此之外,就是一些容易理解的配置信息了。

在我們繼續之前,最好測試下配置。讓我們運行以下命令將Greeter.sol合約部署到Polygon測試網:

npx hardhat run scripts/sample-script.js --network matic

上面的命令聲明了要運行的hardhat腳本以及要連接的網絡,matic網絡是我們在hardhat.config.js文件中定義的。稍等片刻就可以在終端看到如下輸出:

Compiling 2 files with 0.7.3 Compilation finished successfullyGreeter deployed to:0x790a1c9a212A13Fce5C1cfA4904f18bD3540E1e8

你的合約地址應該和我的不一樣,只要你看到的和上面類似,就意味著配置文件是正常的。

我們沒有運行測試,因為接下來要整個換掉合約文件,因此在這一步我們只需要測試下hardhat.config.js是否正常即可。

好了。

3、編寫NFT智能合約

我們將使用OpenZeppelin來編寫智能合約,該合約是基于ERC-721實現。因此我們需要安裝OpenZeppelin的智能合約庫。在項目根目錄執行如下命令:

npm install @openzeppelin/contracts

安裝好openZeppelin后,我們就可以開始編寫智能合約了。打開contracts文件夾并創建一個新的文件NFT.sol,該合約文件非常簡單,讓我們看一下具體內容:

pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract MyNFT is ERC721, Ownable {using Counters for Counters.Counter;using Strings for uint256;Counters.Counter private _tokenIds;mapping (uint256 => string) private _tokenURIs; constructor() ERC721("MyNFT", "MNFT") {} function _setTokenURI(uint256 tokenId, string memory _tokenURI)internalvirtual{_tokenURIs[tokenId] = _tokenURI;} function tokenURI(uint256 tokenId) public view virtual override returns (string memory){require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");string memory _tokenURI = _tokenURIs[tokenId];return _tokenURI;} function mint(address recipient, string memory uri)public returns (uint256){_tokenIds.increment();uint256 newItemId = _tokenIds.current();_mint(recipient, newItemId);_setTokenURI(newItemId, uri);return newItemId;} }

由于我們使用了OpenZeppelin的ERC721合約,因此只需要很少的代碼。

第一行定義了我們使用的solidiy的版本。

接下來的三行代碼引入所需的OpenZeppelin合約,其中ERC-721合約是最重要的。 有了這些合約,我們編寫智能合約的效率就大大提高了。

接下來我們定義contract名為MyNFT,它繼承自OpenZeppeline提供的ERC721和Ownable合約。

然偶定義一些變量。Counters和Strings用來幫助計數以及將數據轉換為字符串,然后我們定義一個變量來保存下一個token的ID。最后,我們定義一個從通證ID到通證URI的映射表。

引入聲明和變量定義完成后,我們可以開始實質性的代碼了。構造函數實際上就是定義下通證名稱和符號。

在最近的OpenZeppelin更新中,其ERC-721合約不再內置setTokenURI函數。這一選擇 的初衷可能是減少用戶部署合約的gas成本,不過我們還需要這個函數。

沒關系,我們可以自己實現。這就是第一個函數的功能。函數_setTokenURI傳入參數通證ID 和通證URI,然后將其添加到映射表中。

通過上述操作,我們現在可以使用tokenURI方法返回通證URI的值。這一點很重要,因為這個URI指向了NFT的全部元數據,例如名稱、屬性以及資產自身。我們必須確保URI保存下來并能夠返回給任何對此感興趣的人。

最后,我們需要一個mint方法,傳入一個錢包地址和通證URI作為參數,新的通證將發送到接收地址。

好了,很簡單的合約,對嗎。

4、測試NFT合約

在第一個測試中,我們使用Polygon Mumbai測試網來測試hardhat配置文件是否正確,不過現在我們要使用hardhat的內存鏈來測試NFT合約。

為此,我們回到hardhat.config.js文件,暫時將defaultNetwork從matic修改為hardhat。 你也需要將config中的如下部分注釋掉:

matic: {url: "https://rpc-mumbai.maticvigil.com",accounts: [PRIVATE_KEY]}

保存修改。

接下來有兩件事要做。首先找到項目根目錄下的artifacts文件夾并刪除其中的contracts目錄。然后找出項目根目錄下的contracts目錄并刪除其中的Greeter.sol文件。

現在就只剩下NFT.sol合約了。我們還需要更新測試文件,在test目錄中,打開sample-test.js文件,更新為如下內容:

const { expect } = require("chai"); describe("NFT", function() {it("It should deploy the contract, mint a token, and resolve to the right URI", async function() {const NFT = await ethers.getContractFactory("MyNFT");const nft = await NFT.deploy();const URI = "ipfs://QmWJBNeQAm9Rh4YaW8GFRnSgwa4dN889VKm9poc2DQPBkv";await nft.deployed();await nft.mint("0xd72203a26D887b60Af3a11178eF4A48BE8DecbA6", URI)expect(await nft.tokenURI(1)).to.equal(URI)});});

在上面的測試中,我們讀取合約并部署,然后mint一些通證到一個假想的以太坊地址和一個通證URI。注意URI的格式。我們希望利用IPFS和Pinata來提供元數據,并希望可以利用任何IPFS網關解析該元數據,而不局限于Pinata。將URI按此格式化有助于驗證元數據的解析。

上面的URI是偽造的,不過很快我們將創建一個真正的URI并使用它在Polygon網絡上mint一個NFT通證。在終端輸入以下命令測試合約:

npx hardhat test

我們可以編寫很多像這樣的測試,不過這留給你來完成了。

現在我們準備好在Polygon Mumbai測試網上mint一個通證了。

5、mint nft通證

在我們實際mint一個NFT通證之前,需要首先創建一個資產并將其pin到IPFS。 我們使用下面這個圖像:

我們將利用Pinata將此文件pin到IPFS網絡。點擊這里 注冊并登錄,然后前往Pin Manager上傳文件,上傳完成后,就可以在Pin Manager 表中看到文件的IPFS CID,拷貝這個CID,例如QmQRDYPTprDPknn3zE2ZSpc8DjnUKfYztyaeMBYdR8GDdw,后面會用到。

我們已經上傳了資產,接下來還需要上傳NFT對應的元數據的JSON文件。這聽起來很困難,但實際上很簡單。用文本編輯器創建一個文件,內容如下:

{name: "My NFT", description: "This is my NFT", image: "ipfs://QmQRDYPTprDPknn3zE2ZSpc8DjnUKfYztyaeMBYdR8GDdw"}

你可以將NFT隨意命名,可以提供任何描述文本。不過image屬性一定要指向前面得到的CID。由于我們希望Pinata之外的IPFS網關也可以解析URI,因此使用格式:ipfs://YOUR_CID。

上述操作完成后,將文件保存為metadata.json,同樣利用Pinata Pin Manager上傳該文件并記錄得到的IPFS CID。

接下來我們從命令行來部署NFT合約并mint一個NFT通證。讓我們來修改下sample-script.js文件,首先更名為deploy-script.js,內容替換為:

const hre = require("hardhat"); async function main() {const NFT = await hre.ethers.getContractFactory("MyNFT"); const nft = await NFT.deploy(); await nft.deployed(); console.log("NFT deployed to:", nft.address); } main().then(() => process.exit(0)) .catch(error => {console.error(error);process.exit(1); });

要部署到Mumbai測試網,我們需要更新hardhat.config.js文件。將默認網絡改回matic, 取消matic部分的注釋。

在終端執行如下命令:

npx hardhat run scripts/deploy-script.js --network matic

一切順利的話,NFT合約將成功mint,終端的輸出將包含合約地址,拷貝下來,因為后面 需要此地址來mint我們的第一個NFT通證。

為此,讓我們創建一個新的腳本文件mint-script.js,并在文件中添加如下內容:

const hre = require("hardhat"); async function main() {const NFT = await hre.ethers.getContractFactory("MyNFT");const URI = "ipfs://YOUR_METADATA_CID"const WALLET_ADDRESS = "YOUR_WALLET_ADDRESS"const CONTRACT_ADDRESS = "YOUR NFT CONTRACT ADDRESS"const contract = NFT.attach(CONTRACT_ADDRESS);await contract.mint(WALLET_ADDRESS, URI);console.log("NFT minted:", contract); } main().then(() => process.exit(0)).catch(error => {console.error(error);process.exit(1); });

腳本很簡單,需要的參數是我們上傳到Pinata的元數據的URI、以太坊錢包地址和部署的NFT合約的地址。

保存文件并在終端運行如下命令:

npx hardhat run scripts/mint-script.js --network matic

假設沒有錯誤,我們就成功的mint了之前創建的資產的NFT通證,它已經在你的錢包中了。為證明這一點,我們創建一個新的腳本文件get-token-script.js,添加如下內容:

const hre = require("hardhat"); async function main() {const NFT = await hre.ethers.getContractFactory("MyNFT"); const CONTRACT_ADDRESS = "YOUR_CONTRACT_ADDRESS" const contract = NFT.attach(CONTRACT_ADDRESS); const owner = await contract.ownerOf(1); console.log("Owner:", owner); const uri = await contract.tokenURI(1); console.log("URI: ", uri); } main().then(() => process.exit(0)) .catch(error => {console.error(error);process.exit(1);});

上面的腳本查詢第一個通證的持有者,同時提取通證的URI。在終端運行如下命令:

npx hardhat run scripts/get-token-script.js --network matic

輸出結果類似下面這樣:

Owner: 0xd7220ab26a887a60Af3a11178eF4A48BE8DncbA6 URI: ipfs://QmZu6UUMHo2bHLiRMZCoQf7hiSmnFVVzWqnEAyF9SJwxhx

總結

以上是生活随笔為你收集整理的polygon NFT开发教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。