关于区块链:如何使用Alchemy开发NFT智能合约ERC721

1次阅读

共计 9090 个字符,预计需要花费 23 分钟才能阅读完成。

<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 多平台公布

正文完
 0