<aside>
本教程翻译自官网:https://docs.alchemy.com/docs。对局部内容进行了批改。教程中所有实例通过自己实际,代码可见:https://github.com/ChuXiaoYi/web3Study
</aside>
应用Solidity开发智能合约并在区块链上部署可能一开始听起来有些吓人:Solidity、安全性、gas优化、开发环境和gas费用,这些只是你须要理解的一些事件,能力让你的代码托管在区块链上。不必放心,咱们来帮你梳理一下。
不过,侥幸的是,在过来几个月中,曾经公布了许多工具,让开发人员能够更轻松地进行智能合约开发工作。
像OpenZeppelin Wizard这样的工具,为开发人员提供了点击和编写性能,能够在短时间内创立可组合和平安的智能合约,再加上Web3开发人员工具Alchemy的反对,让编写和部署区块链上的代码的体验变得比以往任何时候都更容易、更疾速、更牢靠。
在本教程中,您将学习如何应用Alchemy、OpenZeppelin、Remix和Ethereum Goerli开发和部署ERC721(NFT)智能合约。
更具体地说,您将学习:
- 如何应用OpenZeppelin和Remix编写和批改智能合约
- 应用https://goerlifaucet.com/获取收费的Goerli ETH
- 将其部署在Ethereum Goerli测试网络区块链上以节俭gas费用
- 应用Filebase在IPFS上托管NFT令牌元数据。
- 铸造NFT并在OpenSea上可视化。
您也能够追随视频教程:
让咱们开始创立智能合约。
应用OpenZeppelin合约向导开发ERC721智能合约。
如前所述,在本教程中,您将应用OpenZeppelin向导创立智能合约,有两个次要起因:
- 它是平安的。
- 它提供规范的智能合约。
当波及编写智能合约时,安全性至关重要。有许多智能合约破绽的例子,因为安全性不佳而导致歹意行为者窃取了数亿美元。
你不想在部署到区块链上后有人窃取你所有贵重的加密货币或NFT吧?
OpenZeppelin服务于此目标,是最大的智能合约规范维护者之一(ERC20、ERC721等),容许开发人员应用通过全面审核的代码来开发牢靠的合约。
要开发咱们的ERC721 NFT智能合约,您须要做的第一件事是进入Open Zeppelin智能合约向导页面。
进入页面后,您将看到以下编辑器:
点击左上角的ERC721按钮,抉择要应用的ERC规范类型和要编写的合约类型:
当初您曾经抉择了合约规范,在左侧菜单中应该会看到一些选项:
让咱们从抉择代币的名称和符号开始。单击文本框中的“MyToken”,给它命名,而后用同样的形式设置符号,并将根底URI字段留空(代币名称将被OpenSea和Rarible用作汇合名称)。
抉择NFT(ERC721)代币性能
当初您须要抉择要集成到咱们的智能合约中的性能,在“设置”局部之后,您将找到“性能”局部,在那里您将可能抉择要包含在您的智能合约中的不同模块。
在这种状况下,您将抉择以下集成:
- Mintable将创立一个仅特权账户可调用的铸造性能
- Auto Increment IDs将主动为您的NFT调配递增的ID
- Enumerable将为您提供拜访链上代币枚举和“totalSupply”等函数的性能,这些性能在默认的ERC721集成URI存储中不存在,以将元数据和图像与您的每个NFT相关联
- URI Storage以可能将URI与咱们的NFT相关联
为了本教程的目标,咱们建议您不要勾选以下模块,以确保咱们的NFT不受到任何类型的Tokenomic影响:
- 可销毁的 - 用于销毁代币
- 可暂停的 - 用于暂停代币转移、销售等
- 投票 - 提供相似于代表和投票的治理性能
如果您想理解更多对于这些模块的信息,请查看官网OpenZeppelin ERC721规范文档。
当初,您曾经抉择了所需的性能,OpenZeppelin向导将填充智能合约的代码,它应该如下所示:
// SPDX-License-Identifier: MITpragma 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); }}
是时候将咱们的代码复制并带到 Remix IDE 上进行批改,并在区块链上部署它了。
应用REMIX IDE批改和部署您的ERC721合约
当初您曾经领有了ERC721智能合约,让咱们在Goerli Testnet上批改并部署它。为此,您将应用Remix IDE,这是一个专门为Solidity智能合约开发而设计的收费Web集成开发环境。
首先,正如您可能曾经留神到的那样,在OpenZeppelin Wizard编辑器的顶部,有一个“在Remix中关上”的按钮:
点击它将在浏览器的新标签页中关上 REMIX IDE。
应用Remix批改NFT智能合约
从合同的顶部开始,有一个“SPDX-License-Identifier”,它指定了您的代码将公布的许可证类型 - 在Web3应用程序中放弃代码开源是一个好习惯,因为它将确保可信度。
// SPDX-License-Identifier: MIT
而后有 pragma - 编译器的版本,您将应用它来编译智能合约代码。小的 “^” 符号通知编译器,0.8.0 到 0.8.9 之间的每个版本都适宜编译咱们的代码。
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";import "@openzeppelin/contracts/utils/Counters.sol";
而后咱们初始化合约,继承咱们从OpenZeppelin代码库中导入的所有规范:
contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {...}
正如您所留神到的,safeMint
函数具备“onlyOwner
”修饰符 - 这将仅容许智能合约的所有者(部署智能合约的钱包地址)铸造NFT。您可能心愿任何人都能够铸造NFT,为此,您须要从Mint函数中删除onlyOwner
修饰符。
function safeMint(address to, string memory uri) public { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); }
你也能够从合约申明 "Ownable" 和库导入中删除它
import "@openzeppelin/contracts/access/Ownable.sol";
当初每个人都能够铸造咱们的NFT,你须要防止其他人铸造的NFT数量超过咱们珍藏中的最大数量。为此,让咱们指定可铸造的NFT的最大数量。
假如用户想要铸造总共10,000个NFT。为此,让咱们创立一个新的uint256变量,称其为MAX_SUPPLY,并将其赋值为10,000。
Counters.Counter private _tokenIdCounter; uint256 MAX_SUPPLY = 100000; constructor() ERC721("Alchemy", "ALCH") {}
接下来,让咱们进入safeMint
函数并在第18行增加一个require语句:
require(_tokenIdCounter.current() <= MAX_SUPPLY, "I'm sorry we reached the cap");
让咱们花点工夫更好地理解Solidity中的“require”语句。
您能够在官网文档中浏览无关Solidity “require”语句的更多信息。
当初,您曾经限度了NFT的最大供应量,是时候在Goerli测试网络上编译智能合约并部署它了。为此,您须要在Alchemy.com上创立一个收费帐户,将其增加为Metamask的节点提供程序,并获取一些收费的Goerli ETH。
创立收费的Alchemy帐户
首先,让咱们导航到alchemy.com,单击“登录”并创立一个新帐户:
抉择以太坊生态系统:
给您的应用程序和团队取一个名称,抉择Goerli网络,而后点击创立应用程序:
Create App
实现流程后,咱们将被重定向到仪表板页面。点击您抉择的应用程序名称,“test”在这种状况下,点击右上角的“查看密钥”按钮,而后复制HTTP URL:
Your Application Details
接下来,您须要将Alchemy增加到Metamask作为Goerli RPC提供程序。如果您尚未装置Metamask,请确保依照此指南将其增加到您的浏览器并创立一个新钱包。
将Alchemy Goerli增加到您的Metamask钱包
一旦装置Metamask,点击网络下拉菜单,而后点击“增加网络”!
您将被重定向到以下页面,在该页面上您须要填写Goerli网络和RPC URL信息。
Fill in the Goerli Network and RPC Url
在表格中增加以下信息:
- Network name:Alchemy Goerli
- New RPC URL: Goerli Alchemy应用程序的HTTP URL
- Chain ID:5
- Currency Symbol:GoerliETH
- Block Explorer:https://goerli.etherscan.io
太棒了,你应用Alchemy将Goerli增加到了Metamask!
当初是时候在Goerli上部署咱们的智能合约了,但首先,你须要取得一些Goerli测试ETH。
获取收费Goerli测试ETH
获取Goerli测试ETH非常简单,只需返回 goerlifaucet.com,将钱包地址复制到文本栏中,而后点击“发送ETH给我”:
在10-20秒后,您将在Metamask钱包中看到Goerli ETH。
您每24小时能够无需登录取得高达0.1 ETH,或者应用Alchemy账户可取得0.5 ETH。
当初您曾经取得了测试ETH,是时候在区块链上编译和部署咱们的NFT智能合约了。
在Goerli测试网络上编译和部署NFT智能合约
回到Remix,让咱们点击页面左侧的编译器菜单,而后点击蓝色的“编译”按钮:
而后点击“部署和运行交易”菜单,点击环境下拉菜单,并抉择“注入Web3”:
确保Metamask钱包在Alchemy Goerli网络上,从合同下拉菜单中抉择NFT智能合约,而后点击部署。
一个 Metamask 弹出窗口将呈现,点击 "sign",而后持续领取燃气费。
如果所有按预期工作,10 秒后你应该能够在 "已部署的合约" 下看到合约列表:
当初智能合约曾经部署到Goerli测试网,是时候铸造咱们的NFT了,但首先须要在IPFS上创立并上传元数据,让咱们理解一下“元数据”这个术语的含意。
什么是NFT元数据?
为了使OpenSea拉取ERC721代币的离线元数据,合约须要返回指向托管元数据的URI。为了找到这个URI,OpenSea、Rarible和其余风行的市场将应用ERC721Uristorage规范中蕴含的tokenURI办法。
ERC721中的tokenURI函数应返回HTTP或IPFS URL,例如ipfs://bafkreig4rdq3nvyg2yra5x363gdo4xtbcfjlhshw63we7vtlldyyvwagbq。当查问时,此URL应返回蕴含代币元数据的JSON blob数据。
您能够在官网OpenSea文档中浏览无关元数据规范的更多信息。
如何格式化您的NFT元数据
依据OpenSea文档,NFT元数据应存储在.json文件中,并按以下构造进行组织:
{ "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 }] }
这里是每个属性存储的简要阐明:
属性 | 阐明 |
---|---|
image | 该物品图片的 URL。能够是任何类型的图片(包含 SVG,OpenSea 会将其缓存为 PNG),能够是 IPFS URL 或门路。倡议应用 350 x 350 的图片。 |
image_data | 如果您想要动静生成图片,则能够应用原始的 SVG 图片数据(不倡议应用)。只有在不蕴含 image 参数时才应用此选项。 |
external_url | 该链接将呈现在 OpenSea 网站上该资产图片下方,用户能够通过该链接来到 OpenSea,在您的网站上查看该资产。 |
description | 该物品的人类可读形容。反对 Markdown。 |
name | 该物品的名称。 |
attributes | 这些是该物品的属性,将呈现在 OpenSea 网站上对该物品的页面上。(见下文) |
background_color | 该物品在 OpenSea 上的背景色彩。必须是六位数的十六进制码,不带前导符号。 |
animation_url | 一个指向该物品多媒体附件的 URL。反对的文件扩展名有 GLTF、GLB、WEBM、MP4、M4V、OGV、OGG 和仅音频的扩展名 MP3、WAV、OGA。animation_url 还反对 HTML 页面,容许咱们应用 JavaScript 画布、WebGL 等构建丰盛的体验和交互式 NFT。当初反对 HTML 页面内的脚本和相对路径。然而,不反对浏览器扩大拜访。 |
youtube_url | 一个指向 YouTube 视频的 URL。 |
当初咱们曾经简要理解了令牌元数据中将蕴含什么内容,让咱们学习如何创立它并将其存储在IPFS上。
创立并上传IPFS上的元数据
首先,返回 [filebase.com
](https://filebase.com/) 并创立一个新账户。
登录后,点击左侧菜单中的桶按钮,而后创立一个新桶:
进入存储桶,点击 上传按钮,上传你想用于 NFT 的图片,我会应用以下图片。
上传后,点击它并复制 IPFS 网关 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”文件上传到与咱们上传图片雷同的存储桶中。
最初,点击CID并复制它,在下一部分中咱们须要它来构建令牌URI以便铸造NFT:
铸造你的Goerli NFT
回到Remix,在“Deploy & Run Transactions”菜单下,进入“deployed contracts”,而后点击刚刚部署的合约,在关上的列表中,你会看到智能合约中蕴含的所有办法:
橙色办法是理论写入区块链的办法,而蓝色办法是从区块链中学习的办法。
单击safeMint办法下拉图标,粘贴您的地址和以下字符串到uri字段中:
ipfs://\\<your\\_metadata\\_cid>
单击转账将创立一个Metamask弹出窗口,提醒您领取燃气费用。
点击“签名”并持续铸造您的第一个NFT!
期待几秒钟,为确保铸造胜利,请将您的地址复制并粘贴到balanceOf办法输出中,并运行它 - 它应该显示您领有1个NFT。
对于tokenUri办法,请应用“0”作为id参数进行雷同操作,它应该显示您的tokenURI。
太棒了!您刚刚铸造了您的第一个NFT!
当初是时候转移到OpenSea,查看元数据是否开始读取了。
在OpenSea上可视化您的NFT
返回 testnets.opensea.io,应用您的Metamask钱包登录。而后点击您的个人资料图片,您应该会看到您新铸造的NFT。如果图片还没有显示进去,请点击它,而后点击“刷新元数据”按钮。
有时候OpenSea很难辨认测试网的元数据 - 可能须要长达6个小时能力看到。一段时间后,您的NFT应该会像这样显示:(https://testnets.opensea.io/assets/mumbai/0x5a411430964664412e69cff1134759f6bb57c5d7/1)。
祝贺你胜利地创立、批改并部署了你的第一个智能合约。铸造了你的第一个NFT并将你的图像公布到了IPFS上!
下一步呢?为什么不批改你的智能合约,让用户只能铸造肯定数量的NFT呢?每个用户只能铸造5个就足够了,否则有人可能会开始铸造成千上万的NFT!
为了做到这一点,请看一下映射类型,这里有一个神奇的指南,能够帮忙你实现。
本文由mdnice多平台公布