本教程翻譯自官網(wǎng):[https://docs.alchemy.com/docs](https://docs.alchemy.com/docs)。
對(duì)部分內(nèi)容進(jìn)行了修改。教程中所有實(shí)例經(jīng)過(guò)本人實(shí)踐,代碼可見:https://github.com/ChuXiaoYi/web3Study
使用Solidity開發(fā)智能合約并在區(qū)塊鏈上部署可能一開始聽起來(lái)有些嚇人:Solidity、安全性、gas優(yōu)化、開發(fā)環(huán)境和gas費(fèi)用,這些只是你需要了解的一些事情,才能讓你的代碼托管在區(qū)塊鏈上。不用擔(dān)心,我們來(lái)幫你梳理一下。
不過(guò),幸運(yùn)的是,在過(guò)去幾個(gè)月中,已經(jīng)發(fā)布了許多工具,讓開發(fā)人員可以更輕松地進(jìn)行智能合約開發(fā)工作。
像OpenZeppelin Wizard這樣的工具,為開發(fā)人員提供了點(diǎn)擊和編寫功能,可以在短時(shí)間內(nèi)創(chuàng)建可組合和安全的智能合約,再加上Web3開發(fā)人員工具Alchemy的支持,讓編寫和部署區(qū)塊鏈上的代碼的體驗(yàn)變得比以往任何時(shí)候都更容易、更快速、更可靠。
在本教程中,您將學(xué)習(xí)如何使用Alchemy、OpenZeppelin、Remix和Ethereum Goerli開發(fā)和部署ERC721(NFT)智能合約。
更具體地說(shuō),您將學(xué)習(xí):
如何使用OpenZeppelin和Remix編寫和修改智能合約 使用 https://goerlifaucet.com/獲取免費(fèi)的Goerli ETH 將其部署在Ethereum Goerli測(cè)試網(wǎng)絡(luò)區(qū)塊鏈上以節(jié)省gas費(fèi)用 使用Filebase在IPFS上托管NFT令牌元數(shù)據(jù)。 鑄造NFT并在OpenSea上可視化。
您也可以跟隨視頻教程:
讓我們開始創(chuàng)建智能合約。
如前所述,在本教程中,您將使用OpenZeppelin向?qū)?chuàng)建智能合約,有兩個(gè)主要原因:
它是安全的。 它提供標(biāo)準(zhǔn)的智能合約。
當(dāng)涉及編寫智能合約時(shí),安全性至關(guān)重要。有許多智能合約漏洞的例子,由于安全性不佳而導(dǎo)致惡意行為者竊取了數(shù)億美元。
你不想在部署到區(qū)塊鏈上后有人竊取你所有寶貴的加密貨幣或NFT吧?
OpenZeppelin服務(wù)于此目的,是最大的智能合約標(biāo)準(zhǔn)維護(hù)者之一(ERC20、ERC721等),允許開發(fā)人員使用經(jīng)過(guò)全面審核的代碼來(lái)開發(fā)可靠的合約。
要開發(fā)我們的ERC721 NFT智能合約,您需要做的第一件事是進(jìn)入Open Zeppelin智能合約向?qū)ы?yè)面。
進(jìn)入頁(yè)面后,您將看到以下編輯器:
點(diǎn)擊左上角的ERC721按鈕,選擇要使用的ERC標(biāo)準(zhǔn)類型和要編寫的合約類型:
現(xiàn)在您已經(jīng)選擇了合約標(biāo)準(zhǔn),在左側(cè)菜單中應(yīng)該會(huì)看到一些選項(xiàng):
讓我們從選擇代幣的名稱和符號(hào)開始。單擊文本框中的“MyToken”,給它命名,然后用同樣的方式設(shè)置符號(hào),并將基礎(chǔ)URI字段留空(代幣名稱將被OpenSea和Rarible用作集合名稱)。
現(xiàn)在您需要選擇要集成到我們的智能合約中的功能,在“設(shè)置”部分之后,您將找到“功能”部分,在那里您將能夠選擇要包括在您的智能合約中的不同模塊。
在這種情況下,您將選擇以下集成:
Mintable將創(chuàng)建一個(gè)僅特權(quán)賬戶可調(diào)用的鑄造功能 Auto Increment IDs將自動(dòng)為您的NFT分配遞增的ID Enumerable將為您提供訪問(wèn)鏈上代幣枚舉和“totalSupply”等函數(shù)的功能,這些功能在默認(rèn)的ERC721集成URI存儲(chǔ)中不存在,以將元數(shù)據(jù)和圖像與您的每個(gè)NFT相關(guān)聯(lián) URI Storage以能夠?qū)RI與我們的NFT相關(guān)聯(lián)
為了本教程的目的,我們建議您不要勾選以下模塊,以確保我們的NFT不受到任何類型的Tokenomic影響:
可銷毀的 - 用于銷毀代幣 可暫停的 - 用于暫停代幣轉(zhuǎn)移、銷售等 投票 - 提供類似于代表和投票的治理功能
如果您想了解更多關(guān)于這些模塊的信息,請(qǐng)查看官方OpenZeppelin ERC721標(biāo)準(zhǔn)文檔。
現(xiàn)在,您已經(jīng)選擇了所需的功能,OpenZeppelin向?qū)⑻畛渲悄芎霞s的代碼,它應(yīng)該如下所示:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable { constructor() ERC721("Alchemy", "ALC") {} function safeMint(address to, uint256 tokenId, string memory uri) public onlyOwner { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
是時(shí)候?qū)⑽覀兊拇a復(fù)制并帶到 Remix IDE 上進(jìn)行修改,并在區(qū)塊鏈上部署它了。
現(xiàn)在您已經(jīng)擁有了ERC721智能合約,讓我們?cè)贕oerli Testnet上修改并部署它。為此,您將使用Remix IDE,這是一個(gè)專門為Solidity智能合約開發(fā)而設(shè)計(jì)的免費(fèi)Web集成開發(fā)環(huán)境。
首先,正如您可能已經(jīng)注意到的那樣,在OpenZeppelin Wizard編輯器的頂部,有一個(gè)“在Remix中打開”的按鈕:
點(diǎn)擊它將在瀏覽器的新標(biāo)簽頁(yè)中打開 REMIX IDE。
從合同的頂部開始,有一個(gè)“SPDX-License-Identifier”,它指定了您的代碼將發(fā)布的許可證類型 - 在Web3應(yīng)用程序中保持代碼開源是一個(gè)好習(xí)慣,因?yàn)樗鼘⒋_??尚哦?。
// SPDX-License-Identifier: MIT
然后有 pragma - 編譯器的版本,您將使用它來(lái)編譯智能合約代碼。小的 “^” 符號(hào)告訴編譯器,0.8.0 到 0.8.9 之間的每個(gè)版本都適合編譯我們的代碼。
pragma solidity ^0.8.4;
然后我們導(dǎo)入一堆庫(kù)并初始化智能合約。
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol";
然后我們初始化合約,繼承我們從OpenZeppelin代碼庫(kù)中導(dǎo)入的所有標(biāo)準(zhǔn):
contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {...}
正如您所注意到的,onlyOwner
修飾符。
function safeMint(address to, string memory uri) public { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); }
你也可以從合約聲明 "Ownable" 和庫(kù)導(dǎo)入中刪除它
import "@openzeppelin/contracts/access/Ownable.sol";
現(xiàn)在每個(gè)人都可以鑄造我們的NFT,你需要避免其他人鑄造的NFT數(shù)量超過(guò)我們收藏中的最大數(shù)量。為此,讓我們指定可鑄造的NFT的最大數(shù)量。
假設(shè)用戶想要鑄造總共10,000個(gè)NFT。為此,讓我們創(chuàng)建一個(gè)新的uint256變量,稱其為MAX_SUPPLY,并將其賦值為10,000。
Counters.Counter private _tokenIdCounter; uint256 MAX_SUPPLY = 100000; constructor() ERC721("Alchemy", "ALCH") {}
接下來(lái),讓我們進(jìn)入safeMint
函數(shù)并在第18行添加一個(gè)require語(yǔ)句:
require(_tokenIdCounter.current() <= MAX_SUPPLY, "I'm sorry we reached the cap");
讓我們花點(diǎn)時(shí)間更好地了解Solidity中的“require”語(yǔ)句。
您可以在官方文檔中閱讀有關(guān)Solidity “require”語(yǔ)句的更多信息。
現(xiàn)在,您已經(jīng)限制了NFT的最大供應(yīng)量,是時(shí)候在Goerli測(cè)試網(wǎng)絡(luò)上編譯智能合約并部署它了。為此,您需要在Alchemy.com上創(chuàng)建一個(gè)免費(fèi)帳戶,將其添加為Metamask的節(jié)點(diǎn)提供程序,并獲取一些免費(fèi)的Goerli ETH。
首先,讓我們導(dǎo)航到alchemy.com,單擊“登錄”并創(chuàng)建一個(gè)新帳戶:
選擇以太坊生態(tài)系統(tǒng):
給您的應(yīng)用程序和團(tuán)隊(duì)取一個(gè)名稱,選擇Goerli網(wǎng)絡(luò),然后點(diǎn)擊創(chuàng)建應(yīng)用程序:
Create App
完成流程后,我們將被重定向到儀表板頁(yè)面。點(diǎn)擊您選擇的應(yīng)用程序名稱,“test”在這種情況下,點(diǎn)擊右上角的“查看密鑰”按鈕,然后復(fù)制HTTP URL:
Your Application Details
接下來(lái),您需要將Alchemy添加到Metamask作為Goerli RPC提供程序。如果您尚未安裝Metamask,請(qǐng)確保按照此指南將其添加到您的瀏覽器并創(chuàng)建一個(gè)新錢包。
一旦安裝Metamask,點(diǎn)擊網(wǎng)絡(luò)下拉菜單,然后點(diǎn)擊“添加網(wǎng)絡(luò)”!
您將被重定向到以下頁(yè)面,在該頁(yè)面上您需要填寫Goerli網(wǎng)絡(luò)和RPC URL信息。
Fill in the Goerli Network and RPC Url
在表格中添加以下信息:
Network name:Alchemy Goerli New RPC URL: Goerli Alchemy應(yīng)用程序的HTTP URL Chain ID:5 Currency Symbol:GoerliETH Block Explorer: https://goerli.etherscan.io
太棒了,你使用Alchemy將Goerli添加到了Metamask!??
現(xiàn)在是時(shí)候在Goerli上部署我們的智能合約了,但首先,你需要獲得一些Goerli測(cè)試ETH。
獲取Goerli測(cè)試ETH非常簡(jiǎn)單,只需前往 goerlifaucet.com,將錢包地址復(fù)制到文本欄中,然后點(diǎn)擊“發(fā)送ETH給我”:
在10-20秒后,您將在Metamask錢包中看到Goerli ETH。
您每24小時(shí)可以無(wú)需登錄獲得高達(dá)0.1 ETH,或者使用Alchemy賬戶可獲得0.5 ETH。
現(xiàn)在您已經(jīng)獲得了測(cè)試ETH,是時(shí)候在區(qū)塊鏈上編譯和部署我們的NFT智能合約了。
回到Remix,讓我們點(diǎn)擊頁(yè)面左側(cè)的編譯器菜單,然后點(diǎn)擊藍(lán)色的“編譯”按鈕:
然后點(diǎn)擊“部署和運(yùn)行交易”菜單,點(diǎn)擊環(huán)境下拉菜單,并選擇“注入Web3”:
確保Metamask錢包在Alchemy Goerli網(wǎng)絡(luò)上,從合同下拉菜單中選擇NFT智能合約,然后點(diǎn)擊部署。
一個(gè) Metamask 彈出窗口將出現(xiàn),點(diǎn)擊 "sign",然后繼續(xù)支付燃?xì)赓M(fèi)。
如果一切按預(yù)期工作,10 秒后你應(yīng)該可以在 "已部署的合約" 下看到合約列表:
現(xiàn)在智能合約已經(jīng)部署到Goerli測(cè)試網(wǎng),是時(shí)候鑄造我們的NFT了,但首先需要在IPFS上創(chuàng)建并上傳元數(shù)據(jù),讓我們了解一下“元數(shù)據(jù)”這個(gè)術(shù)語(yǔ)的含義。
為了使OpenSea拉取ERC721代幣的離線元數(shù)據(jù),合約需要返回指向托管元數(shù)據(jù)的URI。為了找到這個(gè)URI,OpenSea、Rarible和其他流行的市場(chǎng)將使用ERC721Uristorage標(biāo)準(zhǔn)中包含的tokenURI方法。
ERC721中的tokenURI函數(shù)應(yīng)返回HTTP或IPFS URL,例如ipfs://bafkreig4rdq3nvyg2yra5x363gdo4xtbcfjlhshw63we7vtlldyyvwagbq。當(dāng)查詢時(shí),此URL應(yīng)返回包含代幣元數(shù)據(jù)的JSON blob數(shù)據(jù)。
您可以在官方OpenSea文檔中閱讀有關(guān)元數(shù)據(jù)標(biāo)準(zhǔn)的更多信息。
根據(jù)OpenSea文檔,NFT元數(shù)據(jù)應(yīng)存儲(chǔ)在.json文件中,并按以下結(jié)構(gòu)進(jìn)行組織:
{ "description": "YOUR DESCRIPTION", "external_url": "YOUR URL", "image": "IMAGE URL", "name": "TITLE", "attributes": [ { "trait_type": "Base", "value": "Starfish" }, { "trait_type": "Eyes", "value": "Big" }, { "trait_type": "Mouth", "value": "Surprised" }, { "trait_type": "Level", "value": 5 }, { "trait_type": "Stamina", "value": 1.4 }, { "trait_type": "Personality", "value": "Sad" }, { "display_type": "boost_number", "trait_type": "Aqua Power", "value": 40 }, { "display_type": "boost_percentage", "trait_type": "Stamina Increase", "value": 10 }, { "display_type": "number", "trait_type": "Generation", "value": 2 }] }
這里是每個(gè)屬性存儲(chǔ)的簡(jiǎn)要說(shuō)明:
屬性 | 說(shuō)明 |
---|---|
image | 該物品圖片的 URL??梢允侨魏晤愋偷膱D片(包括 SVG,OpenSea 會(huì)將其緩存為 PNG),可以是 IPFS URL 或路徑。建議使用 350 x 350 的圖片。 |
image_data | 如果您想要?jiǎng)討B(tài)生成圖片,則可以使用原始的 SVG 圖片數(shù)據(jù)(不建議使用)。只有在不包含 image 參數(shù)時(shí)才使用此選項(xiàng)。 |
external_url | 該鏈接將出現(xiàn)在 OpenSea 網(wǎng)站上該資產(chǎn)圖片下方,用戶可以通過(guò)該鏈接離開 OpenSea,在您的網(wǎng)站上查看該資產(chǎn)。 |
description | 該物品的人類可讀描述。支持 Markdown。 |
name | 該物品的名稱。 |
attributes | 這些是該物品的屬性,將出現(xiàn)在 OpenSea 網(wǎng)站上對(duì)該物品的頁(yè)面上。(見下文) |
background_color | 該物品在 OpenSea 上的背景顏色。必須是六位數(shù)的十六進(jìn)制碼,不帶前導(dǎo)符號(hào)。 |
animation_url | 一個(gè)指向該物品多媒體附件的 URL。支持的文件擴(kuò)展名有 GLTF、GLB、WEBM、MP4、M4V、OGV、OGG 和僅音頻的擴(kuò)展名 MP3、WAV、OGA。animation_url 還支持 HTML 頁(yè)面,允許我們使用 JavaScript 畫布、WebGL 等構(gòu)建豐富的體驗(yàn)和交互式 NFT?,F(xiàn)在支持 HTML 頁(yè)面內(nèi)的腳本和相對(duì)路徑。但是,不支持瀏覽器擴(kuò)展訪問(wèn)。 |
youtube_url | 一個(gè)指向 YouTube 視頻的 URL。 |
現(xiàn)在我們已經(jīng)簡(jiǎn)要了解了令牌元數(shù)據(jù)中將包含什么內(nèi)容,讓我們學(xué)習(xí)如何創(chuàng)建它并將其存儲(chǔ)在IPFS上。
首先,前往 [filebase.com
](https://filebase.com/) 并創(chuàng)建一個(gè)新賬戶。
登錄后,點(diǎn)擊左側(cè)菜單中的桶按鈕,然后創(chuàng)建一個(gè)新桶:
進(jìn)入存儲(chǔ)桶,點(diǎn)擊 上傳按鈕,上傳你想用于 NFT 的圖片,我會(huì)使用以下圖片。
上傳后,點(diǎn)擊它并復(fù)制 IPFS 網(wǎng)關(guān) URL:
使用任何文本編輯器,粘貼以下JSON代碼:
{ "description": "This NFT proves I've created and deployed my first ERC20 smart contract on Goerli with Alchemy Road to Web3", "external_url": "Alchemy.com/?a=roadtoweb3weekone", "image": "https://ipfs.filebase.io/ipfs/bafybeihyvhgbcov2nmvbnveunoodokme5eb42uekrqowxdennt2qyeculm", "name": "A cool NFT", "attributes": [ { "trait_type": "Base", "value": "Starfish" }, { "trait_type": "Eyes", "value": "Big" }, { "trait_type": "Mouth", "value": "Surprised" }, { "trait_type": "Level", "value": 5 }, { "trait_type": "Stamina", "value": 1.4 }, { "trait_type": "Personality", "value": "Sad" }, { "display_type": "boost_number", "trait_type": "Aqua Power", "value": 40 }, { "display_type": "boost_percentage", "trait_type": "Stamina Increase", "value": 10 }, { "display_type": "number", "trait_type": "Generation", "value": 2 }] }
并將文件另存為“metadata.json”。返回Filebase,將“metadata.json”文件上傳到與我們上傳圖片相同的存儲(chǔ)桶中。
最后,點(diǎn)擊CID并復(fù)制它,在下一部分中我們需要它來(lái)構(gòu)建令牌URI以便鑄造NFT:


回到Remix,在“Deploy & Run Transactions”菜單下,進(jìn)入“deployed contracts”,然后點(diǎn)擊剛剛部署的合約,在打開的列表中,你會(huì)看到智能合約中包含的所有方法:


藍(lán)色方法是從區(qū)塊鏈中學(xué)習(xí)的方法。
單擊safeMint方法下拉圖標(biāo),粘貼您的地址和以下字符串到uri字段中:
ipfs://\\<your\\_metadata\\_cid>
單擊轉(zhuǎn)賬將創(chuàng)建一個(gè)Metamask彈出窗口,提示您支付燃?xì)赓M(fèi)用。
點(diǎn)擊“簽名”并繼續(xù)鑄造您的第一個(gè)NFT!
等待幾秒鐘,為確保鑄造成功,請(qǐng)將您的地址復(fù)制并粘貼到balanceOf方法輸入中,并運(yùn)行它 - 它應(yīng)該顯示您擁有1個(gè)NFT。
對(duì)于tokenUri方法,請(qǐng)使用“0”作為id參數(shù)進(jìn)行相同操作,它應(yīng)該顯示您的tokenURI。
太棒了!您剛剛鑄造了您的第一個(gè)NFT!??
現(xiàn)在是時(shí)候轉(zhuǎn)移到OpenSea,檢查元數(shù)據(jù)是否開始讀取了。
前往 testnets.opensea.io,使用您的Metamask錢包登錄。然后點(diǎn)擊您的個(gè)人資料圖片,您應(yīng)該會(huì)看到您新鑄造的NFT。如果圖片還沒有顯示出來(lái),請(qǐng)點(diǎn)擊它,然后點(diǎn)擊“刷新元數(shù)據(jù)”按鈕。
有時(shí)候OpenSea很難識(shí)別測(cè)試網(wǎng)的元數(shù)據(jù) - 可能需要長(zhǎng)達(dá)6個(gè)小時(shí)才能看到。一段時(shí)間后,您的NFT應(yīng)該會(huì)像這樣顯示:(https://testnets.opensea.io/assets/mumbai/0x5a411430964664412e69cff1134759f6bb57c5d7/1)。
恭喜你成功地創(chuàng)建、修改并部署了你的第一個(gè)智能合約。鑄造了你的第一個(gè)NFT并將你的圖像發(fā)布到了IPFS上!??
下一步呢?為什么不修改你的智能合約,讓用戶只能鑄造一定數(shù)量的NFT呢?每個(gè)用戶只能鑄造5個(gè)就足夠了,否則有人可能會(huì)開始鑄造成千上萬(wàn)的NFT!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-455487.html
為了做到這一點(diǎn),請(qǐng)看一下映射類型,這里有一個(gè)神奇的指南,可以幫助你完成。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-455487.html
到了這里,關(guān)于如何使用Alchemy開發(fā)NFT智能合約(ERC721)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!