在本指南中,我们将介绍使用Hardhat创建脚本的步骤,有关Hardhat的概述,请参阅入门指南
你可以使用Hardhat所有功能编写自定义脚本,一个经典的使用场景是为智能合约编写一个部署脚本。
有两种方法可以编写访问Hardhat 运行时环境的脚本。
TIP
Hardhat脚本对于处理简单的不需要用户参数的事情很有用,而对于与外部工具集成(比如Node.js调试器),这些工具并不适合Hardhat CLI。
如果你想自动完成更复杂的事情,并接收用户参数,你可以在这里学习如何创建自己的任务。
你可以编写访问Hardhat 运行时环境属性(作为全局变量)的脚本。
这些脚本必须通过Hardhat运行: npx hardhat run script.js
。
这使得它可以很容易地移植为其他工具开发的脚本,将变量注入到全局状态中。
第二种方案利用Hardhat的架构,使其更具灵活性。 Hardhat被设计为一个库,允许你发挥创造力,构建独立的CLI工具去访问你的开发环境。你只需要简单引入它:
const hre = require("hardhat");
你可以访问所有的任务和插件,只需通过node就可以运行这些脚本,如: node script.js
。
我们来看一个全新的Hardhat项目,运行 npx hardhat
并依照指引步骤创建一个示例项目。 当创建完成后,你的项目目录应该是这样的:
$ ls -l
total 400
-rw-r--r-- 1 fzeoli staff 195 Jul 30 15:27 hardhat.config.js
drwxr-xr-x 3 fzeoli staff 96 Jul 30 15:27 contracts
drwxr-xr-x 502 fzeoli staff 16064 Jul 30 15:31 node_modules
-rw-r--r-- 1 fzeoli staff 194953 Jul 30 15:31 package-lock.json
-rw-r--r-- 1 fzeoli staff 365 Jul 30 15:31 package.json
drwxr-xr-x 3 fzeoli staff 96 Jul 30 15:27 scripts
drwxr-xr-x 3 fzeoli staff 96 Jul 30 15:27 test
在 scripts/
里面,你会发现 sample-script.js
. 通过阅读其注释,可以更好地了解它的作用。
// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// When running the script with `hardhat run <script>` you'll find the Hardhat
// Runtime Environment's members available in the global scope.
const hre = require("hardhat");
async function main() {
// Hardhat always runs the compile task when running scripts with its command
// line interface.
//
// If this script is run directly using `node` you may want to call compile
// manually to make sure everything is compiled
// await hre.run('compile');
// We get the contract to deploy
const Greeter = await hre.ethers.getContractFactory("Greeter");
const greeter = await Greeter.deploy("Hello, Hardhat!");
await greeter.deployed();
console.log("Greeter deployed to:", greeter.address);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
读完了吗? 在用node
运行脚本之前,你需要声明ethers
。 这是需要的,因为Hardhat不会像调用run
任务时那样在全局范围内注入它。
const hre = require("hardhat");
const ethers = hre.ethers;
async function main() {
//...
}
现在你已经准备好运行这个脚本了:
$ node scripts/sample-script.js
Greeter address: 0x5FbDB2315678afecb367f032d93F642f64180aa3
通过顶部的Hardhat 运行时环境 , 可以以独立的方式运行脚本。当通过Hardhat运行脚本时,Hardhat总是运行编译任务。 但在独立模式下,你可能想手动调用编译,以确保所有的东西都被编译。 这是可以通过调用hre.run('compile')
来实现。 把下面这行注释,然后用node
重新运行脚本:
await hre.run("compile");
$ node scripts/sample-script.js
Greeter address: 0x5FbDB2315678afecb367f032d93F642f64180aa3
当你将Hardhat作为一个库使用时,你仍然可以将参数传递给它。 这是通过设置环境变量来进行的,这些变量有:
HARDHAT_NETWORK
: 设置要连接的网络。
HARDHAT_SHOW_STACK_TRACES
: 启用预期错误的JavaScript堆栈跟踪。
HARDHAT_VERBOSE
: 启用Hardhat verbose日志记录。
HARDHAT_MAX_MEMORY
: 设置Hardhat可以使用的最大内存量。