部署合约
本章学习如何使用 Hardhat 部署智能合约。
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 key,private key 是自己的私钥。
如果使用 infura 的节点服务,只需要修改一下 url,使其指向 infura 的以太坊节点。
同样的,如果要将合约部署到以太坊主网,只需要更换 url 的链接就可以了。
配置完成后,运行部署合约脚本的命令:
npx hardhat run scripts/deploy.js --network goerli
其中 --network goerli 中的 goerli 就是在配置文件中的设置的网络名称。