如何通过 Hardhat 来验证智能合约

news2025/1/18 20:19:26

在很大程度上,由于部署到通用区块链的智能合约的不变性,安全始终是用户和企业的首要任务。因此,在以太坊上开发智能合约的关键步骤之一是初始部署后的 Etherscan 验证。Etherscan 使任何人,从用户到经验丰富的开发人员和 bug hunter,都可以检查代码的有效性、正确性和安全性。

在之前的文章中,我们学习了如何阅读 Etherscan 上的智能合约以及如何使用 Remix IDE 验证 Etherscan 上的智能合约。在本教程中,我们的目标是了解如何使用最常用的智能合约开发框架之一——Hardhat 来完成验证。

让我们开始吧。

创建一个 Hardhat 项目

让我们先创建一个新的 Hardhat 项目。首先,我们要检查我们机器上安装的 npm 版本。打开你的终端并输入:

npm -v

如果你没有安装 npm,请按照这个指南进行操作。然后,输入以下命令安装 Hardhat:

npm install --save-dev hardhat

如果你使用的是 yarn 而非 npm,请输入:

yarn add --dev hardhat

如果你使用的是 Windows,强烈建议使用 WSL 2。

要创建示例项目,请在项目文件夹中运行以下命令,然后选择“创建 TypeScript 项目”:

npx hardhat

在这里插入图片描述

开发一个智能合约

如果前面的步骤工作正常,你现在应该能够看到三个主要的 Hardhat 文件夹:“contracts”、“test”和“scripts”。转到“contracts”文件夹,创建一个新的 Solidity 文件,并将其命名为“PriceFeedConsumer.sol”。然后,复制以下来自 Chainlink 官方文档的源代码。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {

    AggregatorV3Interface internal priceFeed;

    /**
     * Network: Goerli
     * Aggregator: ETH/USD
     * Address: 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
     */
    constructor(address priceFeedAddress) {
        priceFeed = AggregatorV3Interface(priceFeedAddress);
    }

    /**
     * Returns the latest price
     */
    function getLatestPrice() public view returns (int) {
        (
            /*uint80 roundID*/,
            int price,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = priceFeed.latestRoundData();
        return price;
    }
}

现在通过以下命令安装 @chainlink/contracts 依赖包:

npm install --save-dev @chainlink/contracts

然后,通过运行以下命令编译合约

npx hardhat compile

选项 1:在部署脚本中使用 hardhat-etherscan 插件验证你的合约

使用 Hardhat,你可以使用 hardhat-etherscan 插件在 Etherscan 上验证你的智能合约。

首先,你需要一个 Etherscan API 密钥。要获得一个,请访问 Etherscan 网站,免费创建一个新帐户并登录。之后,单击“API 密钥”选项卡。最后,单击“添加”按钮生成新的 API 密钥。

我们将把我们的智能合约部署到 Goerli 测试网络。如果你以前从未做过,你可能需要知道,为了从 Hardhat 部署智能合约,你必须提供私钥和 JSON RPC URL。你可以免费注册 Alchemy 以获得密钥。

你还需要一些测试用的 ETH,你可以从 Chainlink Faucet 轻松获得。

导航回你的 Hardhat 项目。修改“hardhat.config.ts”文件:

export default {
  // rest of the config
  networks: {
    hardhat: {},
    goerli: {
      url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,
      accounts: [GOERLI_PRIVATE_KEY],
    },
  },
  etherscan: {
    apiKey: "ABCDE12345ABCDE12345ABCDE123456789", // Your Etherscan API key
  },
};

在“scripts”文件夹中创建新文件,并将其命名为“deployPriceFeedConsumer.ts”。该脚本将部署 PriceFeedConsumer.sol 智能合约,出于安全原因,等待几个区块,并尝试在 Etherscan 上对其进行验证。

import { ethers, network, run } from "hardhat";

async function main() {
  const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”;

  const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”);
  const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress);

  const WAIT_BLOCK_CONFIRMATIONS = 6;
  await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS);

  console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`);

  console.log(`Verifying contract on Etherscan...`);

  await run(`verify:verify`, {
    address: priceFeedConsumer.address,
    constructorArguments: [priceFeedAddress],
  });
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

保存文件并从终端运行下一个命令:

npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli

你的合约现在应该部署到 Goerli 测试网并在 Etherscan 浏览器上进行验证。

选项 2:从你的 CLI 使用 hardhat-etherscan 插件验证合约

我们将再次使用 hardhat-etherscan 插件来验证我们的智能合约。

首先,前往 Etherscan 并注册一个帐户。在您的帐户设置下,找到“API 密钥”部分。使用免费计划生成一个 API 密钥。

我们将再次将我们的智能合约部署到 Goerli 测试网。如果你需要测试通证,请访问 Chainlink Faucet。

修改“hardhat.config.ts”文件

export default {
  // rest of the config
  networks: {
    hardhat: {},
    goerli: {
      url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,
      accounts: [GOERLI_PRIVATE_KEY],
    },
  },
  etherscan: {
    apiKey: "ABCDE12345ABCDE12345ABCDE123456789", // Your Etherscan API key
  },
};

在“scripts”文件夹中创建新文件,并将其命名为“deployPriceFeedConsumer.ts”。这将部署 PriceFeedConsumer.sol 智能合约并等待几个区块。

import { ethers, network } from "hardhat";

async function main() {
  const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”;

  const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”);
  const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress);

  const WAIT_BLOCK_CONFIRMATIONS = 6;
  await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS);

  console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

使用以下命令部署你的智能合约:

npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli

我们现在将使用 Hardhat 的“验证”任务从 CLI 在 Etherscan 上验证这个智能合约。此命令的一般语法如下所示:

npx hardhat verify --network <network> <contract address> <constructor parameters>

我们将通过以下方式对其进行调整:

npx hardhat verify --network goerli <contract address> 
0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e

你应该能够在 Etherscan 上看到我们合约的公开验证源代码的链接。如果你收到一条错误消息说地址没有字节码,这可能意味着 Etherscan 还没有为你的合约建立索引。在这种情况下,请稍等片刻,然后重试。

选项 3:使用 hardhat flatten 任务验证你的合约

使用 Hardhat 进行 Etherscan 验证的第三个选项类似于通过 Remix IDE 进行的验证过程,这在我们之前的一篇文章中有所描述。

我们再次部署到 Goerli 测试网络,如果你需要测试通证,请导航至 Chainlink Faucet。为此,你不需要 Etherscan API 密钥。

你的“hardhat.config.ts”文件应如下所示:

export default {
  // rest of the config
  solidity: "0.8.9",
  networks: {
    hardhat: {},
    goerli: {
      url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,
      accounts: [GOERLI_PRIVATE_KEY],
    },
  }
};

我们将再次使用上一章的部署脚本:

import { ethers, network } from "hardhat";

async function main() {
  const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”;

  const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”);
  const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress);

  const WAIT_BLOCK_CONFIRMATIONS = 6;
  await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS);

  console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

运行部署脚本:

npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli

如果你在 Etherscan 上搜索你的合约地址,单击 Contract 选项卡时你只会看到合约的字节码。
在这里插入图片描述

要开始验证过程,请单击“Verify and Publish”链接。将显示以下页面。

在这里插入图片描述

如果没有自动弹出,请在第一个输入字段中输入你的合约地址。

然后,从“Compiler Type”下拉列表中,选择“Solidity(单个文件)”。

之后,将显示“Compiler Version”下拉列表。在这里你需要选择你在部署之前用于编译这个智能合约的同一个 Solidity 编译器版本。如果你回顾一下“hardhat.config.ts”文件,你会发现在我们的例子中,编译器的版本是 0.8.9。

最后,从“Open Source License Type”下拉列表中,在 Solidity 文件开头选择 License 许可,指定为“SPDX-License-Identifier”,在本例中为 MIT。点击“继续”进入下一页。

在下一页上,你应该粘贴智能合约的源代码。不幸的是,如果你像我们一样导入了其他合约或接口,则不能只在此处复制粘贴。 Etherscan 还需要知道这些导入合约的源代码。为此,你需要通过键入以下命令来“flatten”你所有的智能合约:

npx hardhat flatten

你的智能合约“flatten”版本将在终端中打印出来。或者,你可能希望将其保存在单独的文件中,你可以通过输入以下内容来完成:

npx hardhat flatten contracts/PriceFeedConsumer.sol > cotracts/PriceFeedConsumer_flat.sol

现在你可以将合约的源代码粘贴到“Enter the Solidity Contract Code below”输入框中。然后,解决验证码并单击蓝色的“Verify and Publish”按钮。你应该能够在 Contract 选项卡上看到绿色复选标记。这意味着你已成功验证你的合约。

总结

在本文中,我们介绍了如何使用三种不同的方法从 Hardhat 验证 Etherscan 上的智能合约。智能合约验证是部署过程中的关键步骤之一,因为它允许社区在使用之前检查源代码。

欢迎关注 Chainlink 预言机并且私信加入开发者社区,有大量关于智能合约的学习资料以及关于区块链的话题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理课程设计(1)

指令设计 计算机组成原理课程设计 1、完成以下9条指令的设计&#xff1a; LDI Rd,#data&#xff0c;LDA Rd,adr&#xff0c;STA adr,Rs&#xff0c;LDR Rd,Rs&#xff0c;ADD Rd,Rs&#xff0c;XOR Rd,Rs&#xff0c;JMP adr&#xff0c;JZ adr&#xff0c;HALT 2.指令设计 …

全球著名漫画家蔡志忠创作的“EIS元宇宙之门”数字艺术品限量发售!11.29正式开售

开启宇宙之门 2022年12月3日&#xff0c;EIS我们将一起迎接一个新的爆发机会——品牌将正式接轨元宇宙一个全新的营销时代即将来临&#xff01;首次集结千位元宇宙领域品牌营销头号玩家&#xff0c;找到通往元宇宙智慧的不二法门&#xff01; 品牌营销领域一次全新的风向标&am…

SPARK数据分析

有了 DataFrame 之后&#xff0c;我们该如何在 DataFrame 之上做数据探索、数据分析&#xff0c;以及各式各样的数据转换呢&#xff1f;在数据处理完毕之后&#xff0c;我们又该如何做数据展示与数据持久化呢&#xff1f;今天这一讲&#xff0c;我们就来解答这些疑问。 为了给开…

[附源码]计算机毕业设计springboot创新创业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

操作系统01_进程管理_---软考高级系统架构师006

操作系统的考点;可以看到这里有进程管理 2.存储管理 3.设备管理 4.文件管理 其中比较重要的是进程管理&#xff0c;进程管理中的进程三态图,前趋图,同步与互斥,PV操作,死锁,线程,这个地方考的比较多 ---------------------- 进程的组成: 进程控制块PCB,是进程的唯一标志 T…

阿里云服务器公网带宽计费模式:固定带宽和按使用流量详解

阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算&#xff1f;按固定带宽计费1M带宽一个月23元&#xff0c;按使用流量计费1GB流量0.8元&#xff0c;如果云服务器带宽使用率低于10%&#xff0c;那么首选按使用流量计费&#xff0c;如果带宽实际利用率较高的话&…

自学软件测试必备的英文单词【1500道加语法】

电脑专业英语1500词《电脑专业英语》 1. file n.文件&#xff1b;v.保存文件 2. command n.命令&#xff0c;指令 3. use v.使用&#xff0c;用途 4. program n.程序 5. line n. (数据&#xff0c;程序)行&#xff0c;线路 6. if conj.如果 7. display vt.显示&#xff…

5. 虚拟化特性介绍

5.1 通用虚拟化特性 虚拟化集群特性&#xff08;1&#xff09; 集群&#xff08;cluster&#xff09;&#xff1a;单纯地从集群的角度或用途来说&#xff0c;集群属于网格计算。大家把各自的资源&#xff08;如&#xff1a;服务器提供了自己的计算资源、网络资源、存储资源&am…

BUUCTF Misc 来首歌吧 荷兰宽带数据泄露 面具下的flag 九连环

来首歌吧 下载文件 使用Audacity打开 可以发现框出来的一串,放大查看 有长有短有空格&#xff0c;大概率是摩斯密码 ...../-.../-.-./----./..---/...../-..../....-/----./-.-./-.../-----/.----/---../---../..-./...../..---/./-..../.----/--.../-../--.../-----/----./.…

unity资源管理之Addressable

unity自带了AssetsBundle的机制&#xff0c;Addressable是在AssetsBundle的机制上封装了一下。 主要做了以下封装&#xff1a; 1.编辑器&#xff1a;根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包的策略; 2.可以自主加载和释放资源&#xff1a;根据项目的需求,…

【MySQL】数据库服务器硬件优化与实战详解(调优篇)(实战篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

[附源码]计算机毕业设计springboot-菜篮子系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

D-017 SWD硬件电路设计

SWD硬件电路设计1 简介2 JTAG和SWD的区别2 设计要点3 电路实战1 简介 SWD(SERIAL WIRE DEBUG)是一种串行线调试,是ARM设计的协议&#xff0c;主要功能是对微控制器进行编程和调试。 相关引脚说明&#xff1a; PIN脚描述SWDIO串行数据线&#xff0c;用于数据的读出和写入。SW…

Nodejs -- CORS的介绍及使用CORS解决Express请求跨域的问题

文章目录CORS 跨域资源共享1 接口的跨域问题2 使用cors中间件解决跨域问题3 什么是CORS4 CORS的注意事项5 CORS响应头部 - Access-Control-Allow-Origin6 CORS响应头部 - Access-Control-Allow-Headers7 CORS响应头部 - Access-Control-Allow-Methods8 CORS请求的分类9 简单请求…

R语言隐马尔可夫模型HMM识别股市变化分析报告

了解不同的市场状况如何影响您的策略表现可能会对您的收益产生巨大的影响。最近我们被客户要求撰写关于HMM的研究报告&#xff0c;包括一些图形和统计输出。 某些策略在波动剧烈的市场中表现良好&#xff0c;而其他策略则需要强劲而平稳的趋势&#xff0c;否则将面临长时间的下…

使用Spark的foreach算子及UDTF函数实现MySQL数据的一对多【Java】

使用Spark的foreach算子及UDTF函数实现MySQL数据的一对多【Java】 背景 我们的数仓项目中遇到了这样一种场景&#xff0c;脱敏后内容大致如下&#xff1a; col1col2time1time2a1b12022-01-01 00:00:002022-01-05 00:00:00a2b22022-01-28 00:00:002022-02-03 00:00:00a3b3202…

53-54 - 被遗弃的多重继承

---- 整理自狄泰软件唐佐林老师课程 1. 问题 C是否允许一个类继承自多个父类&#xff1f; 1.1 C中的 多重继承 C支持编写多重继承的代码 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承所有父类的成员函数子类对象可以当作任意父类对象使用 1.2 多重继承的语…

PC_非连续内存分配方式@分页存储管理@地址变换机构@快表

文章目录非连续内存分配方式&#x1f388;分页存储管理基本分页存储管理页面和页面大小分块和碎片逻辑地址结构页表页表项结构页表项和地址比较&#x1f388;页表项地址地址变换机构基本地址变换机构结构图映射过程Note:页表长度页表项长度页表大小例小结ref具有快表的地址变换…

Django学习第一天

学习建议 先从看视频学习开始&#xff0c;网上学习Django的视频有很多&#xff0c;然后跟着视频多多练习并且做一些小项目来加深印象和理解。 注意&#xff1a; 要学习Django前&#xff0c;必须先学习python基础&#xff0c;因为Django是基于python这门语言而开发的&#xff0…

openEuler快速入门-Navicat远程链接openGauss数据库

文章目录前言一、环境准备二、openGauss服务设置步骤2.1 切换至用户openGauss2.2添加放行IP2.3 修改加密方式3.4 重启openGauss服务3.5 创建远程连接角色备注总结前言 最近这段时间再整理openGauss数据库相关内容&#xff0c;在这里总结记录并分享一些基础的操作以及遇到的一些…