使用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);
}
}