{"author":{"address":"0x2f63c75aF66aEA13f76B9e0cbd02091c0C502F2C","user":"https://learnblockchain.cn/people/5473"},"content":{"body":"## 写在前面\r\n\r\n笔者目前正在学习智能合约开发，正好将日常积累的整理出来，以供后续朋友一起进步、学习，欢迎一起探讨。\r\n\r\n在开始安装 hardhat 之前，需要有 node、yarn 环境，笔者使用的 nvm 工具管理多个 node 版本。\r\n\r\n## 初始化项目\r\n\r\n1、新建文件夹“hardhat-demo”，并使用 vs code 打开，如图：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/g7dzDOdJ66a7613f34551.png)\r\n\r\n2、在 vs code 中新建终端，或如图操作\r\nPS：请检查当前终端所在目录，是否在上述创建的文件夹中。\r\n\r\n![image-2.png](https://img.learnblockchain.cn/attachments/2024/07/iSz1b8De66a7614f2acdf.png)\r\n\r\n3、检查 node 版本是否为 v20 以上\r\n\r\n```shell\r\n(base) antony@AntonydeMini hardhat-demo % nvm list\r\n-\u003e     v16.14.2\r\n       v18.16.0\r\n       v20.11.1\r\n         system\r\ndefault -\u003e 16.14.2 (-\u003e v16.14.2)\r\niojs -\u003e N/A (default)\r\nunstable -\u003e N/A (default)\r\nnode -\u003e stable (-\u003e v20.11.1) (default)\r\nstable -\u003e 20.11 (-\u003e v20.11.1) (default)\r\nnvmlts/* -\u003e lts/iron (-\u003e v20.11.1)\r\nlts/argon -\u003e v4.9.1 (-\u003e N/A)\r\nlts/boron -\u003e v6.17.1 (-\u003e N/A)\r\nlts/carbon -\u003e v8.17.0 (-\u003e N/A)\r\nlts/dubnium -\u003e v10.24.1 (-\u003e N/A)\r\nlts/erbium -\u003e v12.22.12 (-\u003e N/A)\r\nlts/fermium -\u003e v14.21.3 (-\u003e N/A)\r\nlts/gallium -\u003e v16.20.2 (-\u003e N/A)\r\nlts/hydrogen -\u003e v18.19.1 (-\u003e N/A)\r\nlts/iron -\u003e v20.11.1\r\n(base) antony@AntonydeMini hardhat-demo % nvm use v20.11.1\r\nNow using node v20.11.1 (npm v10.2.4)\r\n(base) antony@AntonydeMini hardhat-demo %\r\n```\r\n\r\n4、使用 yarn 命令，添加 hardhat 依赖到工程中。\r\n\r\n```bash\r\n(base) antony@AntonydeMini hardhat-demo % yarn add --dev hardhat\r\n```\r\n\r\n完成后项目文件夹中会多出几个文件，如图所示：\r\n\r\n![image-4.png](https://img.learnblockchain.cn/attachments/2024/07/munT2aaZ66a761626cf1b.png)\r\n\r\n5、初始化 hardhat 项目\r\n\r\n```bash\r\n(base) antony@AntonydeMini hardhat-demo % yarn hardhat init\r\n```\r\n\r\n输入命令后，选择“Create a JavaScript project”，然后一路回车\r\n\r\n![image-5.png](https://img.learnblockchain.cn/attachments/2024/07/zItyGESv66a7616700f55.png)\r\n\r\n6、初始化成功后，会有默认文件出现，如图所示：\r\n\r\n![image-6.png](https://img.learnblockchain.cn/attachments/2024/07/PWOFyCDi66a7616aa01b3.png)\r\n\r\n## 项目文件介绍\r\n\r\n1、目录结构\r\n\r\n```bash\r\nhardhat-demo\r\n├── README.md # 描述文件\r\n├── contracts # 合约文件夹，用于存放合约\r\n│   └── Lock.sol # 示例合约\r\n├── hardhat.config.js # hardhat的配置文件\r\n├── ignition # 脚本模块，主要用于封装各种部署脚本\r\n│   └── modules\r\n│       └── Lock.js\r\n├── package.json # 依赖描述文件\r\n├── test # 测试模块，主要用于封装各种测试脚本\r\n│   └── Lock.js\r\n└── yarn.lock\r\n```\r\n\r\n## 部署示例项目\r\n\r\n1、输入部署命令，示例工程中已经编写好了部署脚本\r\n\r\n```code\r\nyarn hardhat ignition deploy ignition/modules/Lock.js\r\n```\r\n\r\n执行结果\r\n\r\n```bash\r\n(base) antony@AntonydeMini hardhat_lesson % yarn hardhat ignition deploy ignition/modules/Lock.js\r\nyarn run v1.22.19\r\nwarning package.json: No license field\r\n$ /Users/antony/workspace/vscodeProjects/hardhat_lesson/node_modules/.bin/hardhat ignition deploy ignition/modules/Lock.js\r\nYou are running Hardhat Ignition against an in-process instance of Hardhat Network.\r\nThis will execute the deployment, but the results will be lost.\r\nYou can use --network \u003cnetwork-name\u003e to deploy to a different network.\r\n\r\nHardhat Ignition 🚀\r\n\r\nDeploying [ LockModule ]\r\n\r\nBatch #1\r\n  Executed LockModule#Lock\r\n\r\n[ LockModule ] successfully deployed 🚀\r\n\r\nDeployed Addresses\r\n\r\nLockModule#Lock - 0x5FbDB2315678afecb367f032d93F642f64180aa3\r\n✨  Done in 2.00s.\r\n```\r\n\r\n上述的“0x5FbDB2315678afecb367f032d93F642f64180aa3”便是部署合约的地址，当然这仅仅是在本地的虚拟环境中\r\n\r\n## 执行测试脚本\r\n\r\n1、输入测试命令，示例工程中已经编写好了测试脚本\r\n\r\n```bash\r\nyarn hardhat test\r\n```\r\n\r\n执行结果\r\n\r\n```bash\r\n(base) antony@AntonydeMini hardhat_lesson % yarn hardhat test\r\nyarn run v1.22.19\r\nwarning package.json: No license field\r\n$ /Users/antony/workspace/vscodeProjects/hardhat_lesson/node_modules/.bin/hardhat test\r\n\r\n\r\n  Lock\r\n    Deployment\r\n      ✔ Should set the right unlockTime (401ms)\r\n      ✔ Should set the right owner\r\n      ✔ Should receive and store the funds to lock\r\n      ✔ Should fail if the unlockTime is not in the future\r\n    Withdrawals\r\n      Validations\r\n        ✔ Should revert with the right error if called too soon\r\n        ✔ Should revert with the right error if called from another account\r\n        ✔ Shouldn't fail if the unlockTime has arrived and the owner calls it\r\n      Events\r\n        ✔ Should emit an event on withdrawals\r\n      Transfers\r\n        ✔ Should transfer the funds to the owner\r\n\r\n\r\n  9 passing (431ms)\r\n\r\n✨  Done in 1.69s.\r\n```\r\n\r\n## 结尾\r\n以上就是hardhat初始项目的体验全过程，后续将逐步为大家拆解\"contracts/Lock.sol\"、“ignition/modules/Lock.js”、“test/Lock.js”这三个文件，以便更好的理解，使用hardhat编写、编译、测试、部署合约的整个过程。\r\n\r\n若过程有错误，还望海涵，请多指教。","title":"Hardhat 入门（一）"},"history":null,"timestamp":1722245545,"version":1}