使用Hardhat Tasks创建智能合约开发工作流
如何实现智能合约部署脚本的自动化
翻译:团长(https://twitter.com/quentangle_)
智能合约开发除了测试和部署之外,还可能涉及到一些任务。也许你想在部署后立即与合约互动,或者更新文件中的已部署合约地址列表。
一般情况下可以为每个任务编写脚本并单独运行它们,但当每次都要运行多个脚本时,这就变得很麻烦。
Hardhat任务是一种为智能合约开发工作流程添加自动化的方式。它提供了一种更加结构化的方式来创建脚本。它还允许将多个脚本合并为一个。Hardhat任务也使解析参数更容易,因为它提供了参数类型验证。
在这篇文章中,我们将使用hardhat任务创建一个工作流。我们将创建并部署一个NFT智能合约到Goerli测试网,在Etherscan上验证地址,并空投一些代币。
设置Hardhat项目
本教程将使用 node js 第 16 版。如果你还没有 NodeJS,我建议安装 node 版本管理器(nvm)。之后运行以下命令:$ nvm install 16
$ nvm use 16
安装node,创建项目目录。进入该目录,运行npx hardhat
生成hardhat 样板文件。$ mkdir hardhat-tasks
$ cd hardhat-tasks
$ npx hardhat
Hardhat会提示你选择要使用的项目类型。在本例中我们使用TypeScript。
选择了项目的类型后,回答所有的提示,回答 “y”来安装项目的依赖,然后等待hardhat生成模板。
完成后,你的项目目录长这样:
环境变量和Hardhat配置
在.env.example
文件中添加你的合约部署器私钥、Etherscan API密钥和Alchemy密钥。在本教程中使用Goerli Ethereum测试网络。
在添加完密钥后,将.env.example
重命名为.env
.
如果你在合约部署中需要eth,你可以得到一些。对于Etherscan的API密钥,你可以在这里注册。要获得Alchemy密钥,你可以在这里注册。
你的 env 文件现在应该看起来像这样:
看一下hardhat.config.ts
。这是一个设置使用哪种网络和私钥的文件,以及其他配置事项。配置文件从.env
文件中读取必要的环境变量。
你需要在配置变量的networks
属性中设置Goerli
网络配置。
.eslintrc.js (可选)
将这些添加到.eslintrc.js文件中,以删除VSCode中的警告。这一步是可选的,因为没有这些配置,项目仍应运行。
智能合约
本教程将使用Open Zeppelin的标准ERC721创建一个NFT合约。要做到这一点,你必须安装Open Zeppelin。$ npm i -S @openzeppelin/contracts
创建一个名为NFT.sol
的新文件。我们的合约将继承Open Zeppelin的ERC721合约以获得标准的ERC721功能。
任务
现在已经准备好了你的智能合约,要创建的第一个任务是部署任务。创建一个名为tasks
的目录,并创建名为compile.ts
、deploy.ts
和index.ts
的文件。
部署任务
在deploy.ts
中创建部署任务,在目录./tasks/deploy.ts
中进行编译,并将我们的合约部署到测试网络中。
在./tasks.index.ts
中添加导出任务// tasks/index.ts
export * from "./deploy";
然后将tasks目录添加到tsconfig.json
文件中,使TypeScript包含tasks文件夹。
验证任务
现在创建验证任务,它将验证在Etherscan上部署的合约。创建文件 ./tasks/verify-etherscan.ts
。
该任务希望有一个字符串参数,你可以插入contractAddress
。不要忘记在./tasks/index.ts
中添加导出文件。
然后用这段代码在./tasks/index.ts
中添加导出。// tasks/index.ts
export * from "./deploy";
export * from "./verify-etherscan";
空投任务
现在是最后一项任务,你将向几个钱包地址空投代币。用以下代码创建文件./tasks/airdrop.ts
。
在./tasks/index.ts中添加导出的内容// tasks/index.ts export * from "./deploy";export * from "./verify-etherscan";export * from "./airdrop";
合并任务
现在,对于最后一项任务,把创建的所有任务合并为一个单一的任务。让我们用下面的代码创建./tasks/deploy-verify-airdrop.ts
。
同样,不要忘记在./tasks/index.ts
中添加导出。// tasks/index.ts
export * from "./deploy";
export * from "./verify-etherscan";
export * from "./airdrop";
export * from "./deploy-verify-airdrop";
运行任务
现在已经创建了任务,可以通过运行npx hardhat
看看所有可用的任务。
现在让我们通过以下命令来运行 deploy-verify-airdrop
任务:npx hardhat deploy-verify-airdrop --network goerli --airdrop-address 0x42D57aAA086Ee6575Ddd3b502af1b07aEa91E495
我在这里使用我生成的一个钱包地址作为空投地址,你可以把它改为你喜欢的任何钱包地址。
从日志的输出中,你可以看到部署的NFT合约地址,可以在Etherscan上看到部署的合约链接,以及成功空投到指定的地址。
总结
恭喜你,你已经成功地部署了一个智能合约,在Etherscan上验证了部署,并在一个单一的命令中与它进行了互动。你所写的脚本保持了小规模和模块化。此外,你创建的任务列表可以通过npx hardhat
模块轻松查看。
Hardhat任务是任何智能合约开发者和你应该利用的最有用的工具之一,因为它通过保持代码库更有条理来提高你的生产力。