Quai之家
中文资讯网

在 Quai Network 上部署简单的单链智能合约的指南。

介绍

本文展示了如何使用 Hardhat 在 Quai Network 的任何链上部署 Solidity 智能合约。

先决条件

要在 Quai 上部署单链智能合约,我们需要一些工具包和依赖项。以下是我们将使用的所有依赖项的概述:

NodeJS 的 Javascript 运行时环境。使用 LTS 版本。
hardhat 示例 一个 Hardhat 项目,其中包含 Quai Network 的示例合同和部署脚本。
Quais.js 用于与 Quai Network 交互的 JavaScript 库。

环境设置

安装示例存储库

首先克隆存储库,导航到我们将用于本教程的目录,然后通过 .hardhat-exampleSoliditynpm

git clone https://github.com/dominant-strategies/hardhat-example.git
cd hardhat-example/Solidity
npm install

智能合约

该目录附带 2 个示例 contracts:和目录内。这两个协定都是从 Open Zeppelin 库派生的实现。Solidity/ERC20.solERC721.solcontracts/

在本教程中,我们将使用示例协定,但您也可以添加自己的协定或使用其他库中的协定。ERC20.sol

Quai Network EVM 支持最高 0.8.20 的 Solidity 版本。使用较新版本的 Solidity 可能会导致在部署智能时出现错误 合同。

环境变量

我们在存储库的根目录中包含一个示例环境文件 , file ,用于以安全的方式管理令牌详细信息、私钥和 RPC URL。.env.disthardhat-example

该文件是模板文件,不应按原样使用。您应该将文件复制到新文件。.env.dist.env.dist.env

此文件位于存储库的根目录中,用作 和 目录的配置文件。hardhat-exampleSolidity/SolidityX/

使用以下命令将根目录中的文件复制到存储库根目录中的新文件:.env.dist.env

cp ../.env.dist ../.env

打开文件并添加您要部署的合约的私钥、RPC URL 和令牌参数。该文件应如下所示:.env.env

.env
# Unique Privkey for each deployment address
CYPRUS1_PK="0x3700000000000000000000000000000000000000000000000000000000000000" # pubkey starting with 0x00
CYPRUS2_PK="0x9400000000000000000000000000000000000000000000000000000000000000" # pubkey starting with 0x01
...more priv keys

# Chain ID (local: 1337, testnet and devnet: 9000)
CHAIN_ID="9000"

# RPC endpoint
RPC_URL="https://rpc.quai.network"

# Token Arguments
...more token args

这些值必须全部用于唯一地址,并且与区域名称相对应,即 your 应该是 Cyprus1 地址。PKCYPRUS1_PK

有关 RPC 端点的更多信息,请参阅本地节点的本地网络规范部分和远程节点的 devnet 规范部分。

存储库使用 Quais SDK 仅使用单个 RPC URL 配置网络连接。要了解有关 SDK 如何配置网络提供商的更多信息,请访问 SDK 提供商示例部分。hardhat-example

填写您的私钥 RPC URL 后,我们现在就可以在 .hardhat.config.js

Hardhat 配置

Hardhat 使用文件来配置智能合同部署。配置文件允许您定义部署网络、任务、编译器等。hardhat.config.js

hardhat-example包含一个预构建文件,其中包含用于在网络中的任何分片上部署和验证智能合约的配置。hardhat.config.js

示例 hardhat 配置文件

在部署或验证合约时,将从文件中提取您的私钥和 RPC URL,并使用它们来部署和验证您的合约。您还可以在对象中指定 Solidity 版本和编译器设置。hardhat.config.js.envsolidity

部署和交互

1

使用 Hardhat 编译

使用 Hardhat 进行智能合约编译很简单,可以在 CLI 中使用来完成。npx

使用以下命令编译目录内的所有合约:contracts/

npx hardhat compile

它应该输出:

Downloading compiler 0.8.20

Compiled 2 Solidity files successfully
2

配置部署脚本

在该目录中,您将找到 ERC20 和 ERC721 合约的部署脚本:和 .在本教程中,我们将部署 ERC20 合约。scripts/deployERC20.jsdeployERC721.js

该脚本从存储库根目录中的文件中提取您的网络配置和令牌参数,并使用它们来部署您的合约。deployERC20.jshardhat.config.js.env

令牌参数通过数组使用:tokenArgs

const tokenArgs = [process.env.ERC20_NAME, process.env.ERC20_SYMBOL, quais.parseUnits(process.env.ERC20_INITIALSUPPLY)]

您指定的网络配置和部署帐户将在 and 变量中与编译的合约 ABI 和字节码一起使用,以创建新的合约实例:providerwallet

const provider = new quais.JsonRpcProvider(hre.network.config.url, undefined, { usePathing: true })
const wallet = new quais.Wallet(hre.network.config.accounts[0], provider)
const ERC20 = new quais.ContractFactory(ERC20Json.abi, ERC20Json.bytecode, wallet)

我们将使用这些思路来适当修改 token args 和 network specification,以便在下一步中部署我们的合约。

该脚本以类似的方式运行,但具有不同的合约参数和不同的合约 ABI 和 字节码。您可以为要部署的任何合约复制此配置。deployERC721.js

3

部署您的合同

deploy 脚本采用一个标志来指定要部署到的网络(可用选项可在此处找到)。在本教程中,我们将部署到 .--networkcyprus1

npx hardhat run scripts/deployERC20.js --network cyprus1

它应该输出:

Transaction broadcasted: 0x235fdeb85db5b6cee8da9780e2246907e8342751849f5ce3514847a5dffd916f
Contract deployed to:  0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cC

恭喜,您现在已经将 ERC20 代币部署到 Quai Network!

和 sample contracts 是每个代币的基本实现,例如。强烈推荐 修改这些合同以适应您的特定使用案例,然后再将其部署用于任何生产用途。ERC20.solERC721.sol

4

与合约交互

Hardhat 控制台目前不支持与 Quai Network 上的智能合约进行交互。

要与合约交互,您可以使用 Quais SDK 配置一个简单的脚本。下面的脚本为我们部署到的 ERC20 代币配置了一个 Contract 实例,以获取代币的名称、符号和总供应量。0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cC

getContractDetails.js
const quais = require('quais')
const ERC20Json = require('../artifacts/contracts/ERC20.sol/TestERC20.json')

async function getContractDetails() {
  // Config provider, wallet, and contract factory
  const provider = new quais.JsonRpcProvider(hre.network.config.url, undefined, { usePathing: true })
  const wallet = new quais.Wallet(hre.network.config.accounts[0], provider)
  const ERC20 = new quais.Contract("0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cC", ERC20Json.abi, wallet)

  const tokenName = await ERC20.name()
  const tokenSymbol = await ERC20.symbol()
  const tokenDecimals = await ERC20.decimals()
  const tokenTotalSupply = await ERC20.totalSupply()
}

getContractDetails()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error)
    process.exit(1)
  })

总结

现在,您拥有创建简单的 Hardhat 项目、部署自己的智能合约并与之交互所需的所有工具。

赞(0)
未经允许不得转载:Quai中文社区 » 在 Quai Network 上部署简单的单链智能合约的指南。