區塊鏈之以太坊Hardhat開發框架——部署在windows為例

Hardhat 提供了一個靈活且易于使用的開發環境,可以輕松地編寫、測試和部署智能合約。Hardhat還內置了Hardhat 網絡(Hardhat Node),它是為開發而設計的本地以太坊網絡。

下面是hardhat的官方文檔

https://hardhat.org/hardhat-runner/docs/getting-started

一、創建及配置Hardhat項目

Hardhat 構建在 Node.js 之上, 使用 Hardhat 要求我們在電腦先安裝好Node.js (>= 16.0),創建hardhat-tutorial文件夾。

1、初始化Node項目

2、安裝Hardhat?

?3、運行hardhat

用鍵盤選擇create a JavaScript project

生成project后的項目目錄?

二、編寫合約?

合約開發推薦使用 VSCode 編輯器 +?solidity 插件,在VSCode下添加solidity插件

contracts?文件夾下新建一個合約文件?Counter.sol

Counter.js代碼如下:?

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Counter {uint counter;constructor() {counter = 0;}function count() public {counter = counter + 1;}function get() public view returns (uint) {return counter;}
}

?在編寫合約時,盡量不要重復造輪子,基于優質開源的第三方庫,不僅可以提高效率,還可以讓我們的合約代碼更安全,例如要開發一個 Token,可以用npm 安裝OpenZepplin 庫:

npm install @openzeppelin/contracts --save-dev

然后在合約中?import?相應庫中的合約文件及可。

pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract Token is ERC20 {constructor(uint256 initialSupply) ERC20("Token Name", "Token Symbol") {_mint(msg.sender, initialSupply);}
}

?三、編譯合約

hardhat.config.js?有默認的Solidity 編譯器配置,因此我們直接編譯合約即可,在終端中運行?npx hardhat compile。

成功編譯后,會在?artifacts/contracts/?目錄下生成Counter.json?和 build-info,?Counter.json包含了智能合約的 ABI 、字節碼(Bytecode)等

智能合約的ABI信息,包括了合約的函數、事件等接口信息。這個文件通常會與其他合約交互時使用,因為它可以被其他合約和DApp使用。

Bytecode是部署合約所需的字節碼,部署合約時候就是把該字節碼作為交易的輸入數據發送鏈上。

?四、編寫測試用例

為智能合約編寫自動化測試至關重要,因為事關用戶資金。

使用 Harhdat 內置的網絡,使用ethers.js與前面的合約進行交互,并使用?Mocha?作為測試運行器。在test文件夾下創建Counter.js文件代碼如下:

// 引入 Hardhat 提供的 ethers 庫,用于部署和交互智能合約
const { ethers } = require("hardhat");// 引入 chai 的斷言函數 expect,用于編寫測試判斷條件
const { expect } = require("chai");// 定義一個全局變量,用于存儲部署后的合約實例
let counter;// 定義測試套件,描述被測試的合約模塊為 "Counter"
describe("Counter", function () {// 初始化函數:部署 Counter 合約并獲取實例async function init() {// 獲取測試賬戶數組,其中 owner 是部署者,otherAccount 可用于后續擴展測試權限等const [owner, otherAccount] = await ethers.getSigners();// 獲取 Counter 合約工廠(ContractFactory),可以用來部署合約const Counter = await ethers.getContractFactory("Counter");// 部署合約并返回實例(此時合約已經部署完成,不需要調用 .deployed())counter = await Counter.deploy();// 打印部署后合約的地址(ethers v6 中使用 .target 屬性獲取地址)console.log("counter:" + counter.target);}// 所有測試用例運行前執行一次初始化操作(部署合約)before(async function () {await init();});// 第一個測試用例:測試合約初始值是否為 0it("init equal 0", async function () {// 調用 counter 合約的 get() 方法,斷言返回值為 0expect(await counter.get()).to.equal(0);});// 第二個測試用例:調用 count() 函數自增,驗證是否變為 1it("add 1 equal 1", async function () {// 調用 count() 方法進行加 1 操作let tx = await counter.count();// 等待交易被打包確認await tx.wait();// 調用 get() 方法獲取當前計數值,斷言為 1expect(await counter.get()).to.equal(1);});
});

運行npx hardhat test之后輸出全部通過,證明測試通過。?

還可以在Solidity代碼中調用console.log()打印日志信息和合約變量,可以方便我們調試代碼。

在合約代碼中導入Hardhat?console.log就可以使用它。

?五、部署合約

部署合約我們需要編寫一個部署腳本。

在項目下新建scripts文件夾,新建一個deploy.js?用來寫部署腳本,代碼如下

const { ethers } = require("hardhat");async function main() {// 獲取合約工廠const Counter = await ethers.getContractFactory("Counter");// 部署合約(v6 會自動等待部署完成)const counter = await Counter.deploy();// 輸出部署的合約地址(v6 使用 counter.target)console.log("Counter address:", counter.target);
}main().catch((error) => {console.error(error);process.exitCode = 1;
});

運行?npx hardhat run scripts/deploy.js?時,合約會部署到 Hardhat 內置網絡上。?

?為了在運行任何任務時指示Hardhat連接到特定的EVM網絡,可以使用--network參數。

npx hardhat run scripts/deploy.js --network <network-name>

network-name?需要在?hardhat.config.js?文件中進行配置:

require("@nomicfoundation/hardhat-toolbox");// 填入自己的私鑰或助記詞,
const PRIVATE_KEY1 = "0x.... YOUR PRIVATE KEY1";
const PRIVATE_KEY2 = "0x....  YOUR PRIVATE KEY1";
const Mnemonic = "YOUR Mnemonic";module.exports = {solidity: "0.8.9", // solidity的編譯版本networks: {goerli: {url: "https://eth-goerli.api.onfinality.io/public",accounts: [PRIVATE_KEY1,PRIVATE_KEY2],chainId: 5,},mumbai: {url: "https://endpoints.omniatech.io/v1/matic/mumbai/public",accounts: {mnemonic: Mnemonic,},chainId: 80001,},}
};

以上配置了兩個網絡,一個是以太坊測試網?goerli, 一個是 Polygon 測試網mumbai, 我們可以在?https://chainlist.org?找到每個網絡的節點 URL 及 chainID。

在網絡配置中,需要提供提交交易賬號, 可以通過私鑰或助記詞?進行配置,這里配置的賬號(需要提前充幣進入到賬號中),在hardhat 腳本中(測試及部署腳本)調用getSigners?即可獲得:

const [owner, otherAccount] = await ethers.getSigners();

六、代碼開源驗證

智能代碼開源會增加了合約的透明度和可靠性,是項目建立信任很重要的一個步驟。

1、安裝?hardhat-toolbox?或?hardhat-etherscan?, 這一步我們這里已經完成,因為在初始化項目的時候安裝了?hardhat-toolbox?, 如果沒有安裝,可以使用以下命令安裝

npm install --save-dev @nomiclabs/hardhat-etherscan

2、在hardhat.config.js?中配置您的 Etherscan API 密鑰和網絡設置,例如:?

      require("@nomicfoundation/hardhat-toolbox");或// require("@nomiclabs/hardhat-etherscan");etherscan: {apiKey: ""},

    ?如何獲取 Etherscan API 密鑰?

    1. 訪問部署網絡對應主網的 Etherscan 網站,并注冊一個賬號(如果還沒有賬號的話)。
    2. 登錄你的賬號并進入 Etherscan 的「我的帳戶」頁面。
    3. 點擊頁面左側的「API-KEYs」標簽頁。
    4. 在頁面上方的「Create New API KEY」部分,輸入 API 密鑰的名稱和描述,然后選擇需要訪問的 API 權限。
    5. 點擊「Generate」按鈕來生成 API 密鑰。

    ?

    3、執行驗證命令:

    npx hardhat verify <deployed-contract-address> "參數(若有)" --network <network-name> 
    

    該命令會為我們上傳合約代碼并驗證其源代碼。如果一切順利(網絡順暢的話),在 Etherscan 上看到的合約被成功驗證。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/90179.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/90179.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/90179.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Ubuntu 1804 編譯ffmpeg qsv MediaSDK libva 遇到的問題記錄

    之前都是 用的xeon服務器的cpu 不支持intel QSV 硬件加速 最近把自己的 14年買的pc機裝上了ubuntu 1804 然后準備開啟ffmpeg qsv 硬件加速功能 CPU i3-4170 內存DDR3 16G 硬盤機械盤500G 主板ASUS B85M-G首先安裝vainfo工具apt install vainfo裝完提示如下出錯了 網上說是…

    Elasticsearch(ES)介紹和安裝

    目錄 一、Elasticsearch(ES)介紹 1.為什么需要單獨的搜索服務 2.全文檢索 3.Elasticsearch簡介 1.Elasticsearch的特點 2.應用場景 3.ElasticSearch數據的存儲和搜索原理 二、Elasticsearch(ES)安裝 1、拉取鏡像 2、創建目錄并給目錄賦權 3、創建并編輯配置文件 4、…

    html結構解析

    <!DOCTYPE html>&#xff1a;聲明為 HTML5 文檔 <html lang"zh-CN">&#xff1a;根元素&#xff0c;指定頁面語言為中文 <meta charset"UTF-8">&#xff1a;設置字符編碼&#xff0c;確保中文正常顯示 <meta name"viewport"…

    面試150 最大子數組和

    思路 貪心法&#xff1a;設定最小標志result為float(‘-inf’),遍歷一次數組元素進行求和&#xff0c;如果當前元素大于result&#xff0c;則更新result的值&#xff0c;如果sum小于0&#xff0c;則重新置0進行計算&#xff0c;最后返回result class Solution:def maxSubArray(…

    MyBatis動態SQL實戰:告別硬編碼,擁抱智能SQL生成

    MyBatis動態SQL實戰&#xff1a;告別硬編碼&#xff0c;擁抱智能SQL生成在電商平臺的用戶管理模塊中&#xff0c;需要面對多種不同的用戶查詢組合條件。當使用傳統的硬編碼SQL方式時&#xff0c;代碼膨脹到了2000多行&#xff0c;維護成本極高。而引入MyBatis動態SQL后&#xf…

    Web前端開發:JavaScript遍歷方法詳解與對比

    1. 傳統 for 循環const arr [10, 20, 30]; for (let i 0; i < arr.length; i) {console.log(索引 ${i}: 值 ${arr[i]}); } // 輸出&#xff1a; // 索引 0: 值 10 // 索引 1: 值 20 // 索引 2: 值 30特點&#xff1a;最基礎的循環&#xff0c;可通過索引精準控制適用場景&…

    Python 爬蟲(一):爬蟲偽裝

    目錄 1 簡介2 偽裝策略 2.1 Request Headers 問題2.2 IP 限制問題 3 總結 1 簡介 對于一些有一定規模或盈利性質比較強的網站&#xff0c;幾乎都會做一些防爬措施&#xff0c;防爬措施一般來說有兩種&#xff1a;一種是做身份驗證&#xff0c;直接把蟲子擋在了門口&#xff…

    TODAY()-WEEKDAY(TODAY(),2)+1

    這個Excel公式 TODAY()-WEEKDAY(TODAY(),2)1 用于計算 當前周的周一日期。下面詳細解釋它的邏輯和用法&#xff1a;公式解析TODAY()返回當前日期&#xff08;例如今天是2023年12月20日&#xff0c;則 TODAY() 2023/12/20&#xff09;。WEEKDAY(TODAY(), 2)計算當前日期是星期幾…

    Fast Frequency Estimation Algorithm by Least Squares Phase Unwrapping

    I. 引言 單個含噪正弦信號的頻率估計是一個研究已久的問題&#xff0c;并有多種應用[1]。在高斯白噪聲假設下&#xff0c;最大似然(ML)頻率估計器是Rife和Boorstyn [2]中提出的周期圖估計器&#xff0c;其中傅里葉變換用于搜索周期圖的最大值。周期圖估計器被廣泛認為是單頻估計…

    C語言常見的預定符號常量

    C語言常見的預定符號常量C 語言提供了豐富的預定義符號常量&#xff0c;分布在不同頭文件中&#xff0c;用于獲取編譯信息、數值范圍、浮點特性等關鍵信息。以下是常見預定義符號常量的分類總結&#xff1a;一、預定義宏&#xff08;編譯時信息&#xff09;由編譯器自動定義&am…

    【2025】使用vue構建一個漂亮的天氣卡片

    1. 核心框架&#xff1a;Vue Vue 以其輕量、易用、響應式數據綁定的特點&#xff0c;非常適合快速構建這類小型界面組件。即使是直接通過 CDN 引入&#xff0c;也能高效開發&#xff0c;降低項目復雜度&#xff0c;無需搭建完整工程化環境 。 2. 網絡請求&#xff1a;Axios 用于…

    Ruby 命令行選項詳解

    Ruby 命令行選項詳解 引言 Ruby 是一種廣泛使用的編程語言,它以其簡潔、優雅和強大的功能而聞名。在 Ruby 的使用過程中,命令行界面(CLI)提供了豐富的選項,可以幫助開發者更高效地與 Ruby 環境交互。本文將詳細解析 Ruby 命令行選項,旨在幫助開發者更好地利用這些工具。…

    NLP復習

    1.文本預處理 分詞,詞性標注,命名實體識別 1.1分詞:jieba jieba.lcut(content,cut_alltrue) 全模式 jieba.lcut(content,cut_allfalse) 精確模式 jieba.lcut_for_search(content) 搜索引擎模式 lcut和cut的區別:cut返回的是一個生成器Generator,lcut返回的是列表 生成器調…

    WEB :實戰演練——從零實現一個交互輪播圖(附源碼)

    文章目錄 一、輪播圖整體功能規劃二、HTML結構深度解析三、CSS樣式實現細節1. 定位系統詳解2. 顯示/隱藏機制3. 按鈕交互效果實現4. 純CSS箭頭實現5. 指示器&#xff1a;當前位置可視化 四、JavaScript邏輯深入解析1. 核心變量與DOM獲取2. 圖片切換函數&#xff08;核心邏輯&am…

    MCP 協議詳細分析一 initialize ping tools/list tools/call

    MCP 協議詳細分析一 &#xff08;initialize ping tools/list tools/call) 本節基于 實現一個 java 的mcp client 調用的 一個python 的mcp server 的日志&#xff0c;完整展示一次典型的 MCP Java SDK 通信流程、工具調用、通知機制與日志記錄&#xff0c;僅包含 echo-simple…

    SLAM學習資料記錄

    ORB_SLAM2 創建自己的數據集&#xff08;還未使用&#xff09; 【SLAM實戰篇】Ubuntu 20.04版本&#xff08;OpenCV版本4.5.3&#xff09;對于ORB-SLAM2安裝運行&#xff0c;代碼編譯&#xff0c;自己的數據集構造_ubuntu20.04 安裝運行orb_slam2算法-CSDN博客 卡爾曼濾波數據…

    用Phi-3 Mini微調實現英文到尤達語翻譯

    用Phi-3 Mini微調實現英文到尤達語翻譯 引言 本文將帶你快速上手大模型微調實踐——以微軟的Phi-3 Mini 4K Instruct模型為例&#xff0c;教你如何將其微調為一個能把英文翻譯成"尤達語"&#xff08;《星球大戰》中尤達大師的獨特說話風格&#xff09;的模型。這是一…

    AI助力,輕松實現人聲分離伴奏提取

    親愛的小伙伴們&#xff01;前段時間&#xff0c;有一位同事家的可愛小孩參加了一場英語演講比賽。同事找到我&#xff0c;希望我能幫個忙&#xff0c;把講視頻中的人聲去掉&#xff0c;只提取出其中相應的伴奏。今天&#xff0c;我就來和大家分享一下究竟如何實現從 MP4 視頻中…

    第1章第2章筆記

    OSI參考模型---開放式系統互聯模型---OSI/RM ISO--->國際標準化組織&#xff1b;特點&#xff1a;先有模型&#xff0c;在又協議。 OSI七層參考模型&#xff1a;應用層 --- 提供網絡服務&#xff1b;自然語言-->編碼表示層 --- 對數據的處理&#xff1b;格式化&#xff0…

    圖的BFS和DFS

    一&#xff0c;圖的遍歷邏輯1.之前我們學了圖的存儲&#xff0c;可以鄰接表存和鄰接矩陣存。現在我們要學習圖的遍歷操作和樹類似可以分為深度遍歷和廣度遍歷&#xff0c;而深度遍歷也是用遞歸實現&#xff0c;廣度遍歷是用隊列實現2.深度遍歷(DFS)a.確定起點b.找到一條邊按順時…