<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: 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);
}
}
是时候将咱们的代码复制并带到 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 多平台公布