# 编程日记：Hardhat远程部署（2022-08-29）

By [Corror](https://paragraph.com/@corror) · 2022-08-29

---

编程学习
----

### 行动指南

#### 阶段OKR

*   Object:
    
    *   阶段目标：搭建最小Hardhat项目。
        
*   Key Result:
    
    *   功能一：部署合约
        
        *   \[x\] 本地部署
            
        *   \[x\] 远程部署
            
    *   功能二：验证合约
        
    *   功能二：测试合约
        
    *   功能三：创建并引用库
        

#### 行动框架

1.  合约部署
    
    1.  配置网络
        
    2.  隐藏敏感信息
        
    3.  部署合约
        
2.  合约验证
    
    1.  `verify()` 函数
        
        1.  数据准备
            
            1.  `@nomiclabs/hardhat-etherscan` 包
                
            2.  `ETHERSCAN_API_KEY`
                
        2.  **_td_** 更改 etherscan apiKey 的配置，方便应用能同时使用 Georli 和 Rinkeby URL
            
        3.  **_td_** 了解 Hardhat run 组件
            
    2.  `verify()` 函数调用
        

### 做了什么？

1.  成功完成了合约的远程部署。
    
2.  成功纵览了一遍合约验证的逻辑，需要通过写代码来践行一遍。
    
3.  成功使用 Alchemy RPC URL 在 Goerli 测试链上部署合约。
    

### 收获了什么知识？

#### 部署合约的步骤

1️⃣ 配置网络

1.  进入 `hardhat.contract.js` 配置文件
    
2.  修改默认网络：`defaultNetworks: "<network_name>"`
    
3.  添加网络信息：
    
    *   身份 (Who)：`chainId`
        
    *   位置 (Where): `url: RPC_URL`
        
    *   使用方式 (How)：: `accounts: PRIVATE_KEY`
        

2️⃣ 隐藏敏感信息

*   `.env` 文件
    
    1.  添加 `PRIVATE_KEY` 和 `RPC_URL` 的具体内容
        
*   `hardhat.contract.js` 文件
    
    1.  安装 `dotenv` 包：`yarn add --dev dotenv`
        
    2.  引入 `dotenv` 模块：`require("dotenv").config()`
        
        *   **_cm_** 为什么需要调用 `require()` 的 `.config()` 方法? Patrick 解释的 "to enable the config" 是什么意思？
            
    3.  隐藏敏感信息：
        
        1.  隐藏私钥：`const PRIVATE_KEY = process.env.PRIVATE_KEY`
            
        2.  隐藏网址：`const RPC_URL = process.env.RPC_URL`
            
        
        *   **_cm_** `process` 的作用是什么？为什么可以接 `.env`? 可以谷歌搜索 "what is process.env.PRIVATE\_KEY" 或者 "dotenv process"
            

3️⃣ 部署合约

1.  创建工厂：`const Factory = ethers.getContractFactory()`
    
2.  部署合约：`const contract = await Factory.deploy()`
    
3.  确认合约：`await contract.deployed()`
    
    *   **_cm_** 为什么在 Hardhat 当中，确认合约是 `.deployed()` 而非 ethers.js 中的 `wait()`? 两者有什么区别？
        
4.  显示合约地址：`console.log(contract.address)`
    

### 收获了什么资源？

今天探索到了一批优秀的 Web3 开发者，重点提及两位：

1.  郭宇，一位优秀的程序员，有很棒的编程功底，同时认知半径广阔，虽说对新领域的预测可能会被李笑来吐槽，但是作为看家本领的编程还是很牛逼的。关注：[Twitter](https://twitter.com/turingou)，[Mirror](https://guoyu.mirror.xyz/), 代表作：[Web3 DApp 最佳编程实践指南](https://guoyu.mirror.xyz/RD-xkpoxasAU7x5MIJmiCX4gll3Cs0pAd5iM258S1Ek)
    
2.  shep, NextDAO 的技术创始人，他为我打开了一片新的程序员大门。推荐关注：[link3](https://link3.to/shep_eth), [Twitter](https://mobile.twitter.com/shep_eth), 以及 NextDAO 中的 [web3-develp](https://discord.com/channels/877464959053881364/926760795428249600) 频道

---

*Originally published on [Corror](https://paragraph.com/@corror/hardhat-2022-08-29)*
