介绍
本文展示如何使用 Hardhat 在 Quai Network 的任何链上部署 Solidity 智能合约。前提条件
要在 Quai 上部署单链智能合约,我们需要一些工具包和依赖项。以下是我们将使用的所有依赖项概述:NodeJS | Javascript 运行时环境。请使用 LTS 版本。 |
hardhat-example | 包含 Quai Network 示例合约和部署脚本的 Hardhat 项目。 |
Quais.js | 用于与 Quai Network 交互的 JavaScript 库。 |
环境设置
安装示例仓库
首先克隆hardhat-example
仓库,导航到本教程将使用的 Solidity
目录,并通过 npm
安装依赖项。
智能合约
Solidity/
目录包含 2 个示例合约:contracts/
目录中的 ERC20.sol
和 ERC721.sol
。这两个合约都是从 Open Zeppelin 库 派生的实现。
本教程将使用 ERC20.sol
示例合约,但您也可以添加自己的合约或使用其他库的合约。
Quai Network EVM 支持 Solidity 版本最高到 0.8.20。使用更新版本的 Solidity 可能会在部署智能合约时导致错误。
环境变量
我们在hardhat-example
仓库的根目录中包含了一个示例环境文件 .env.dist
,用于安全地管理代币详情、私钥和 RPC URL。
.env.dist
文件是一个模板文件,不应直接使用。您应该将 .env.dist
文件复制到新的 .env
文件。此文件位于 hardhat-example
仓库的根目录,作为 Solidity/
目录的配置文件。.env.dist
文件复制到仓库根目录的新 .env
文件:
.env
文件并添加您的私钥、RPC URL 和要部署的合约的代币参数。.env
文件应如下所示:
.env
PK
值必须都是唯一地址的私钥,并对应于区域名称,即您的 CYPRUS1_PK
应该是您的 Cyprus1 地址的私钥。hardhat-example
仓库使用 Quais SDK 仅使用一个 RPC URL 配置网络连接。要了解有关 SDK 如何配置网络提供者的更多信息,请访问 SDK 提供者示例部分。
填写私钥和 RPC URL 后,我们现在可以在 hardhat.config.js
中安全地使用它们了。
Hardhat 配置
Hardhat 使用hardhat.config.js
文件来配置智能合约部署。配置文件允许您定义部署网络、任务、编译器等。
hardhat-example
包含一个预构建的 hardhat.config.js
文件,其中包含用于在网络中的任何分片上部署和验证智能合约的配置。
示例 hardhat 配置文件
示例 hardhat 配置文件
此示例配置文件作为 在配置文件中,您可以找到以下部署和验证定义:
hardhat-example
仓库的一部分提供。hardhat.config.js
Golden Age 开发网目前支持 Cyprus 1 和 2。当前网络配置中所有其他分片都未运行。
cyprus1
cyprus2
cyprus3
paxos1
paxos2
paxos3
hydra1
hydra2
hydra3
hardhat.config.js
将从 .env
文件中提取您的私钥和 RPC URL,并使用它们来部署和验证您的合约。您还可以在 solidity
对象中指定 Solidity 版本和编译器设置。
部署和交互
1
使用 Hardhat 编译
使用 Hardhat 进行智能合约编译很简单,可以在 CLI 中使用 应该输出:
npx
完成。使用以下命令编译 contracts/
目录中的所有合约:2
配置部署脚本
在 您指定的网络配置和部署账户在 我们将在下一步中使用这些概念来正确修改代币参数和网络规范以部署我们的合约。
scripts/
目录中,您会找到 ERC20 和 ERC721 合约的部署脚本:deployERC20.js
和 deployERC721.js
。在本教程中,我们将部署一个 ERC20 合约。deployERC20.js
脚本从 hardhat.config.js
中提取您的网络配置,从仓库根目录的 .env
文件中提取您的代币参数,并使用它们来部署您的合约。代币参数通过 tokenArgs
数组使用:provider
和 wallet
变量中与编译的合约 ABI 和字节码结合使用,以创建新的合约实例:deployERC721.js
脚本以类似的方式运行,但具有不同的合约参数和不同的合约 ABI 和字节码。您可以为要部署的任何合约复制此配置。3
部署您的合约
部署脚本接受一个 应该输出:恭喜,您现在已经在 Quai Network 上部署了一个 ERC20 代币!
--network
标志来指定您要部署到的网络(可用选项可以在这里找到)。在本教程中,我们将部署到 cyprus1
。ERC20.sol
和 ERC721.sol
示例合约是每种代币的基本实现,仅供示例使用。强烈建议在将这些合约用于任何生产用途之前,根据您的具体用例进行修改。