部署合约

本章学习如何使用 Hardhat 部署智能合约。

推特@Hita_DAO    DiscordHitaDAO

1. 编写部署脚本

我们需要编写一个 JavaScript 脚本,用来将智能合约部署到指定区块链网络。

部署合约的脚本文件,通常存放在 scripts 目录下,名称为 deploy.js,您也可以按照自己的实际情况加以修改。

 

脚本文件的代码如下:

// 定义一个异步函数 main,用于部署智能合约
async function main() {
  // 获取部署者(deployer)的以太坊帐户信息
  const [deployer] = await ethers.getSigners();
  // 打印部署者的以太坊地址
  console.log(`Deploying contract address: ${deployer.address}`);
  
  // 获取智能合约工厂
  const Calculator = await ethers.getContractFactory("Calculator");
  // 部署智能合约
  const calculator = await Calculator.deploy();
  // 打印合约地址
  console.log(`Calculator deployed to: ${calculator.address}`);
}

// 执行 main 函数,并在完成后退出程序
main().then(() => process.exit(0))
  .catch((error) => {
    // 打印错误信息
    console.error(error); 
    // 出现错误时退出程序并返回错误代码
    process.exit(1); 
  });

ethers.getContractFactory("Calculator") 中的 Calculator 就是我们在 contracts 目录中编写的合约。

如果配置文件没有特别指明使用何种区块链,那么合约部署者默认是 Hardhat Network 中自动生成的第一个账户 deployer

2. 执行部署脚本

vscode 终端或者在命令行中,执行部署合约脚本:

npx hardhat run scripts/deploy.js

合约部署成功后会输出:

Deploying contract address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Calculator deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3

合约 Calculator 的部署者为 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,合约地址为 0x5FbDB2315678afecb367f032d93F642f64180aa3

合约被部署在本地区块链 Hardhat Network 上。

 

3. 部署到特定网络

我们编写的智能合约最终会被部署到特定以太坊网络上,比如以太坊主网、goerli 测试网。

如果部署到特定网络,就需要在运行部署合约脚本的时候,使用 --network 指定特定网络。

运行部署合约脚本的命令如下:

npx hardhat run scripts/deploy.js --network <network-name>

其中,<network-name> 是特定区块链网络的名称。比如 goerli 测试网,或者 mainnet 主网。

<network-name> 需要在配置文件 hardhat.config.js 中进行相应的配置。

比如:使用 goerli 测试网的配置文件:

require("@nomicfoundation/hardhat-toolbox");

const ALCHEMY_API_KEY = "YOUR API KEY";
const PRIVATE_KEY = "YOUR PRIVATE KEY";

module.exports = {
  solidity: "0.8.19",
  networks: {
    goerli: {
      url: `https://eth-goerli.alchemyapi.io/v2/NULL`,
      accounts: [PRIVATE_KEY]
    }
  }
};

配置文件中使用了以太坊节点服务商 alchemy 的接入服务,  url 指向以太坊节点。

ALCHEMY_API_KEY 是在 alchemy 注册申请的 api keyprivate key 是自己的私钥。

如果使用 infura 的节点服务,只需要修改一下 url,使其指向 infura 的以太坊节点。

同样的,如果要将合约部署到以太坊主网,只需要更换 url  的链接就可以了。

配置完成后,运行部署合约脚本的命令:

npx hardhat run scripts/deploy.js --network goerli

其中 --network goerli 中的 goerli 就是在配置文件中的设置的网络名称。