部署合约
本章学习如何使用 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
就是在配置文件中的设置的网络名称。